#include "TeamAuswahl.h"
#include "..\..\..\Global\Initialisierung.h"
#include "..\..\..\Global\Variablen.h"
#include <DateiSystem.h>
#include <Rahmen.h>
#include <AlphaFeld.h>
#include <AuswahlBox.h>

// Inhalt der TeamAuswahlListeSpieler Klasse aus TeamAuswahl.h
// Konstruktor
TeamAuswahlListeSpieler::TeamAuswahlListeSpieler( SpielerTeamStruktur *sts, Schrift *zSchrift, int accountId, int karteId )
{
	this->accountId = accountId;
	Text *n = infoKlient->getSpielerName( accountId );
	name = initTextFeld( 1, 1, 99, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, n->getText() );
	n->release();
	if( accountId == loginKlient->getAccountId() )
	{
		teamAuswahl = new AuswahlBox();
		teamAuswahl->setStyle( AuswahlBox::Style::Sichtbar | AuswahlBox::Style::Erlaubt | AuswahlBox::Style::Rahmen | AuswahlBox::Style::MultiStyled | AuswahlBox::Style::MaxHöhe | AuswahlBox::Style::VScroll | AuswahlBox::Style::Hintergrund );
		teamAuswahl->setLinienRahmenFarbe( 0xFFFFFFFF );
		teamAuswahl->setLinienRahmenBreite( 1 );
		teamAuswahl->setPosition( 100, 1 );
		teamAuswahl->setGröße( 150, 20 );
		teamAuswahl->setMaxAuskappHöhe( 100 );
		teamAuswahl->setSchriftZ( zSchrift->getThis() );
		teamAuswahl->setHintergrundFarbe( 0xFF000000 );
		teamAuswahl->setMausEreignis( _ret1ME );
		teamAuswahl->setEventParam( this );
		teamAuswahl->setEventAktion( TeamAuswahlListeSpielerTeamAuswahlE );
	}
	else
		team = initTextFeld( 100, 1, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
	Array< int > *statistik = new Array< int >();
	infoKlient->getSpielStatistik( accountId, infoKlient->getSpielId( karteId ), statistik );
	punkte = initTextFeld( 250, 1, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Punkte: " );
	punkte->zText()->anhängen( statistik->hat( 3 ) ? statistik->get( 3 ) : 0 );
	spiele = initTextFeld( 330, 1, 80, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spiele: " );
	spiele->zText()->anhängen( statistik->hat( 0 ) ? statistik->get( 0 ) : 0 );
	gewonnen = initTextFeld( 410, 1, 90, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Gewonnen: " );
	gewonnen->zText()->anhängen( statistik->hat( 1 ) ? statistik->get( 1 ) : 0 );
	statistik->release();
	farbe = initTextFeld( 500, 1, 50, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Farbe:" );
	spielerFarbe = 0;
	rahmen = new LRahmen();
	rahmen->setGröße( 581, 22 );
	rahmen->setFarbe( 0xFFFFFFFF );
	rahmen->setRamenBreite( 1 );
	teamName = new Text( "" );
	this->sts = sts;
	rend = 0;
	ref = 1;
}

// Destruktor
TeamAuswahlListeSpieler::~TeamAuswahlListeSpieler()
{
	name->release();
	if( accountId == loginKlient->getAccountId() )
		teamAuswahl->release();
	else
		team->release();
	punkte->release();
	spiele->release();
	gewonnen->release();
	farbe->release();
	rahmen->release();
	teamName->release();
	sts->release();
}

// nicht constant
void TeamAuswahlListeSpieler::disable()
{
	if( accountId == loginKlient->getAccountId() )
		teamAuswahl->löscheStyle( AuswahlBox::Style::Erlaubt );
}

void TeamAuswahlListeSpieler::spielerTeamAuswahlE( AuswahlBox *obj, int p1, int p2 )
{
	Text *tmpTeamName = obj->zEintragText( p2 );
	if( !tmpTeamName->istGleich( teamName->getText() ) )
	{
		if( tmpTeamName->istGleich( "Zufällig" ) )
		{
			if( !spielKlient->spielErstelltTeamWechseln( 0 ) )
				obj->setAuswahl( obj->getEintragPos( teamName->getText() ) );
		}
		else
		{
			int neuTeam = 0;
			for( int i = 0; i < sts->teamAnzahl; i++ )
			{
				if( sts->teamName->z( i )->istGleich( tmpTeamName->getText() ) )
				{
					neuTeam = i + 1;
					break;
				}
			}
			if( !spielKlient->spielErstelltTeamWechseln( neuTeam ) )
				obj->setAuswahl( obj->getEintragPos( teamName->getText() ) );
		}
		obj->einklappen();
	}
}

void TeamAuswahlListeSpieler::setFarbe( int farbe )
{
	this->spielerFarbe = farbe;
	if( farbe )
		rahmen->setFarbe( farbe );
	else
		rahmen->setFarbe( 0xFFFFFFFF );
	rend = 1;
}

void TeamAuswahlListeSpieler::setTeam( Text *zName )
{
	teamName->setText( zName->getText() );
	rend = 1;
}

void TeamAuswahlListeSpieler::setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe )
{
	if( accountId != loginKlient->getAccountId() )
		return;
	if( erlaubt )
	{
		if( teamAuswahl->getEintragPos( zName->getText() ) < 0 )
		{
			int p = teamAuswahl->getEintragAnzahl();
			teamAuswahl->addEintrag( zName->getText() );
			teamAuswahl->setMsStyle( p, AuswahlBox::Style::FeldRahmen | AuswahlBox::Style::MausBuffer | AuswahlBox::Style::AuswahlBuffer | AuswahlBox::Style::FeldBuffer );
			if( teamFarbe )
				teamAuswahl->zEintrag( p )->setLinienRahmenFarbe( teamFarbe );
			teamAuswahl->setMsAuswAlphaFeldFarbe( p, 0x50000000 | ( teamFarbe & 0x00FFFFFF ) );
			teamAuswahl->setMsAuswAlphaFeldStärke( p, -15 );
			teamAuswahl->setMsMausAlphaFeldFarbe( p, 0x10000000 | ( teamFarbe & 0x00FFFFFF ) );
			teamAuswahl->setMsMausAlphaFeldStärke( p, -15 );
		}
	}
	else
	{
		if( zName->istGleich( teamName->getText() ) )
			return;
		if( teamAuswahl->getEintragPos( zName->getText() ) >= 0 )
			teamAuswahl->löscheEintrag( teamAuswahl->getEintragPos( zName->getText() ) );
	}
}

bool TeamAuswahlListeSpieler::tick( double tickVal )
{
	if( accountId == loginKlient->getAccountId() )
		rend |= teamAuswahl->tick( tickVal );
	else if( !team->zText()->istGleich( teamName->getText() ) )
	{
		team->setText( "" );
		team->zText()->anhängen( teamName->getText() );
	}
	bool ret = rend;
	rend = 0;
	return ret;
}

void TeamAuswahlListeSpieler::doMausEreignis( MausEreignis &me )
{
	if( accountId == loginKlient->getAccountId() )
		teamAuswahl->doMausEreignis( me );
}

void TeamAuswahlListeSpieler::render( int yOff, Bild &zRObj )
{
	if( !zRObj.setDrawOptions( 0, yOff, 581, 22 ) )
		return;
	rahmen->render( zRObj );
	name->render( zRObj );
	if( loginKlient->getAccountId() == accountId )
		teamAuswahl->render( zRObj );
	else
		team->render( zRObj );
	punkte->render( zRObj );
	spiele->render( zRObj );
	gewonnen->render( zRObj );
	farbe->render( zRObj );
	zRObj.alphaRegion( 550, 2, 18, 18, spielerFarbe );
	zRObj.releaseDrawOptions();
}

// constant
int TeamAuswahlListeSpieler::getAccountId() const
{
	return accountId;
}

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

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

// Inhalt der TeamAuswahlListeTeam Klasse aus TeamAuswahl.h
// Konstruktor
TeamAuswahlListeTeam::TeamAuswahlListeTeam( Schrift *zSchrift )
{
	maxSpieler = 0;
	jetztSpieler = 0;
	team = 0;
	name = initTextFeld( 0, 0, 300, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team: " );
	mjSpieler = initTextFeld( 300, 0, 150, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Spieler: 0/0" );
	farbe = initTextFeld( 450, 0, 100, 20, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "Team Farbe:" );
	teamFarbe = 0;
	spieler = new RCArray< TeamAuswahlListeSpieler >();
	rahmen = new LRahmen();
	rahmen->setGröße( 583, 22 );
	rahmen->setFarbe( 0xFFFFFFFF );
	rahmen->setRamenBreite( 1 );
	titelAf = new AlphaFeld();
	titelAf->setPosition( 1, 1 );
	titelAf->setGröße( 581, 20 );
	titelAf->setFarbe( 0x1000FF00 );
	titelAf->setStärke( -15 );
	teamName = new Text( "" );
	tickVal = 0;
	höhe = 22;
	rend = 0;
	ref = 1;
}

// Destruktor
TeamAuswahlListeTeam::~TeamAuswahlListeTeam()
{
	name->release();
	mjSpieler->release();
	farbe->release();
	spieler->release();
	rahmen->release();
	titelAf->release();
	teamName->release();
}

// nicht constant
void TeamAuswahlListeTeam::disable()
{
	for( int i = 0; i < jetztSpieler; i++ )
		spieler->z( i )->disable();
}

void TeamAuswahlListeTeam::setMaxSpieler( int maxSpieler )
{
	this->maxSpieler = maxSpieler;
	rend = 1;
}

void TeamAuswahlListeTeam::setName( Text *name )
{
	teamName->setText( name->getText() );
	name->release();
	rend = 1;
}

void TeamAuswahlListeTeam::setFarbe( int farbe )
{
	teamFarbe = farbe;
	rahmen->setFarbe( teamFarbe );
	rend = 1;
}

void TeamAuswahlListeTeam::setTeam( int team )
{
	this->team = team;
	rend = 1;
}

void TeamAuswahlListeTeam::addSpieler( TeamAuswahlListeSpieler *spieler )
{
	if( !jetztSpieler )
		höhe++;
	spieler->setTeam( teamName );
	höhe += 22;
	this->spieler->set( spieler, jetztSpieler );
	jetztSpieler++;
	rend = 1;
}

void TeamAuswahlListeTeam::removeSpieler( int accountId )
{
	höhe -= 22;
	for( int i = 0; i < jetztSpieler; i++ )
	{
		if( spieler->z( i )->getAccountId() == accountId )
		{
			jetztSpieler--;
			spieler->lösche( i );
			rend = 1;
			break;
		}
	}
	if( !jetztSpieler )
		höhe = 22;
}

void TeamAuswahlListeTeam::setTeamErlaubt( Text *zName, bool erlaubt, int teamFarbe )
{
	for( int i = 0; i < jetztSpieler; i++ )
		spieler->z( i )->setTeamErlaubt( zName, erlaubt, teamFarbe );
}

bool TeamAuswahlListeTeam::tick( double tickVal )
{
	this->tickVal += tickVal * 50;
	int val = ( int )this->tickVal;
	if( val > 2 )
		val = 2;
	this->tickVal -= val;
	if( val )
	{
		if( rahmen->getHöhe() > höhe )
		{
			rahmen->setGröße( rahmen->getBreite(), rahmen->getHöhe() - val );
			if( rahmen->getHöhe() < höhe )
				rahmen->setGröße( rahmen->getBreite(), höhe );
			rend = 1;
		}
		if( rahmen->getHöhe() < höhe )
		{
			rahmen->setGröße( rahmen->getBreite(), rahmen->getHöhe() + val );
			if( rahmen->getHöhe() > höhe )
				rahmen->setGröße( rahmen->getBreite(), höhe );
			rend = 1;
		}
	}
	name->setText( "Team: " );
	name->zText()->anhängen( teamName->getText() );
	mjSpieler->setText( "Spieler: " );
	mjSpieler->zText()->anhängen( jetztSpieler );
	mjSpieler->zText()->anhängen( "/" );
	mjSpieler->zText()->anhängen( maxSpieler );
	for( int i = 0; i < jetztSpieler; i++ )
		rend |= spieler->z( i )->tick( tickVal );
	bool ret = rend;
	rend = 0;
	return ret;
}

void TeamAuswahlListeTeam::doMausEreignis( MausEreignis &me )
{
	int tmpX = me.mx;
	int tmpY = me.my;
	me.mx--;
	me.my -= 22;
	for( int i = 0; i < jetztSpieler; i++ )
	{
		spieler->z( i )->doMausEreignis( me );
		me.my -= 22;
	}
	me.mx = tmpX;
	me.my = tmpY;
}

void TeamAuswahlListeTeam::render( int yOff, Bild &zRObj )
{
	if( !zRObj.setDrawOptions( 50, yOff, 583, rahmen->getHöhe() + 1 ) )
		return;
	rahmen->render( zRObj );
	titelAf->setPosition( 1, 1 );
	titelAf->render( zRObj );
	name->render( zRObj );
	mjSpieler->render( zRObj );
	farbe->render( zRObj );
	zRObj.alphaRegion( 550, 2, 18, 18, teamFarbe );
	zRObj.drawLinieH( 1, 21, 581, rahmen->getFarbe() );
	if( !zRObj.setDrawOptions( 1, 22, 582, rahmen->getHöhe() ) )
	{
		zRObj.releaseDrawOptions();
		return;
	}
	int y = 22 * ( jetztSpieler - 1 );
	for( int i = jetztSpieler - 1; i >= 0; i-- )
	{
		spieler->z( i )->render( y, zRObj );
		y -= 22;
	}
	zRObj.releaseDrawOptions();
	zRObj.releaseDrawOptions();
}

// constant
int TeamAuswahlListeTeam::getTeamNummer() const
{
	return team;
}

int TeamAuswahlListeTeam::getHöhe() const
{
	return rahmen->getHöhe() + 1;
}

bool TeamAuswahlListeTeam::istPlatzFrei() const
{
	return jetztSpieler < maxSpieler;
}

int TeamAuswahlListeTeam::getMaxSpieler() const
{
	return maxSpieler;
}

Text *TeamAuswahlListeTeam::zName() const
{
	return teamName;
}

TeamAuswahlListeSpieler *TeamAuswahlListeTeam::getSpielerDaten( int accountId ) const
{
	for( int i = 0; i < jetztSpieler; i++ )
	{
		if( spieler->z( i )->getAccountId() == accountId )
			return spieler->get( i );
	}
	return 0;
}

TeamAuswahlListeSpieler *TeamAuswahlListeTeam::zSpielerDaten( int accountId ) const
{
	for( int i = 0; i < jetztSpieler; i++ )
	{
		if( spieler->z( i )->getAccountId() == accountId )
			return spieler->z( i );
	}
	return 0;
}

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

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

// Inhalt der TeamAuswahlListe Klasse aus TeamAuswahl.h
// Konstruktor
TeamAuswahlListe::TeamAuswahlListe( Schrift *zSchrift, SpielerTeamStruktur *sts, int karteId )
{
	rahmen = new LRahmen();
	rahmen->setGröße( 698, 398 );
	rahmen->setFarbe( 0xFFFFFFFF );
	rahmen->setRamenBreite( 1 );
	scroll = new VScrollBar();
	scroll->update( 0, 396 );
	scroll->setKlickScroll( 7 );
	teams = new RCArray< TeamAuswahlListeTeam >();
	TeamAuswahlListeTeam *zufall = new TeamAuswahlListeTeam( zSchrift );
	zufall->setTeam( 0 );
	zufall->setName( new Text( "Zufällig" ) );
	zufall->setMaxSpieler( sts->spielerAnzahl );
	teams->set( zufall, 0 );
	for( int i = 0; i < sts->teamAnzahl; i++ )
	{
		TeamAuswahlListeTeam *tmp = new TeamAuswahlListeTeam( zSchrift );
		tmp->setTeam( i );
		tmp->setName( sts->teamName->get( i ) );
		tmp->setFarbe( sts->teamFarbe->hat( i ) ? sts->teamFarbe->get( i ) : 0 );
		tmp->setMaxSpieler( sts->teamGröße->hat( i ) ? sts->teamGröße->get( i ) : 0 );
		teams->set( tmp, i + 1 );
	}
	teamAnzahl = 1 + sts->teamAnzahl;
	schrift = zSchrift->getThis();
	this->karteId = karteId;
	this->sts = sts;
	rend = 0;
	ref = 1;
}

// Destruktor
TeamAuswahlListe::~TeamAuswahlListe()
{
	rahmen->release();
	scroll->release();
	teams->release();
	schrift->release();
	sts->release();
}

// nicht constant
void TeamAuswahlListe::disable()
{
	for( int i = 0; i < teamAnzahl; i++ )
		teams->z( i )->disable();
}

void TeamAuswahlListe::setTeamVonSpieler( int accountId, int spielerNummer )
{
	if( spielerNummer == 0 )
	{
		int neuTeam = 0;
		int altTeam = 0;
		for( int j = 0; j < teamAnzahl; j++ )
		{
			if( teams->z( j )->zSpielerDaten( accountId ) )
			{
				altTeam = j;
				break;
			}
		}
		TeamAuswahlListeSpieler *tmp = teams->z( altTeam )->getSpielerDaten( accountId );
		teams->z( altTeam )->removeSpieler( accountId );
		tmp->setFarbe( 0 );
		teams->z( neuTeam )->addSpieler( tmp );
	}
	else
	{
		int team = 0;
		int max = 0;
		int min = 0;
		for( int i = 0; i < sts->teamAnzahl; i++ )
		{
			min = max;
			max += sts->teamGröße->get( i );
			if( spielerNummer - 1 >= min && spielerNummer - 1 < max )
			{
				int neuTeam = i + 1;
				int altTeam = 0;
				for( int j = 0; j < teamAnzahl; j++ )
				{
					if( teams->z( j )->zSpielerDaten( accountId ) )
					{
						altTeam = j;
						break;
					}
				}
				TeamAuswahlListeSpieler *tmp = teams->z( altTeam )->getSpielerDaten( accountId );
				teams->z( altTeam )->removeSpieler( accountId );
				tmp->setFarbe( sts->spielerFarbe->hat( spielerNummer - 1 ) ? sts->spielerFarbe->get( spielerNummer - 1 ) : 0 );
				teams->z( neuTeam )->addSpieler( tmp );
				break;
			}
		}
	}
	for( int i = 0; i < teamAnzahl; i++ )
	{
		for( int j = 0; j < teamAnzahl; j++ )
		{
			if( i == 0 )
				teams->z( j )->setTeamErlaubt( teams->z( i )->zName(), teams->z( i )->istPlatzFrei(), 0 );
			else
				teams->z( j )->setTeamErlaubt( teams->z( i )->zName(), teams->z( i )->istPlatzFrei(), sts->teamFarbe->hat( i - 1 ) ? sts->teamFarbe->get( i - 1 ) : 0 );
		}
	}
	rend = 1;
}

void TeamAuswahlListe::addSpieler( int accountId )
{
	TeamAuswahlListeSpieler *tmp = new TeamAuswahlListeSpieler( sts->getThis(), schrift, accountId, karteId );
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teams->z( i )->istPlatzFrei() )
		{
			if( i == 0 )
				tmp->setTeamErlaubt( teams->z( i )->zName(), 1, 0 );
			else
				tmp->setTeamErlaubt( teams->z( i )->zName(), 1, sts->teamFarbe->hat( i - 1 ) ? sts->teamFarbe->get( i - 1 ) : 0 );
		}
	}
	teams->z( 0 )->addSpieler( tmp );
	for( int i = 0; i < teamAnzahl; i++ )
		teams->z( i )->setTeamErlaubt( teams->z( 0 )->zName(), teams->z( 0 )->istPlatzFrei(), 0 );
	rend = 1;
}

void TeamAuswahlListe::removeSpieler( int accountId )
{
	for( int i = 0; i < teamAnzahl; i++ )
	{
		if( teams->z( i )->zSpielerDaten( accountId ) )
			teams->z( i )->removeSpieler( accountId );
	}
	for( int i = 0; i < teamAnzahl; i++ )
	{
		for( int j = 0; j < teamAnzahl; j++ )
		{
			if( i == 0 )
				teams->z( j )->setTeamErlaubt( teams->z( i )->zName(), teams->z( i )->istPlatzFrei(), 0 );
			else
				teams->z( j )->setTeamErlaubt( teams->z( i )->zName(), teams->z( i )->istPlatzFrei(), sts->teamFarbe->hat( i - 1 ) ? sts->teamFarbe->get( i - 1 ) : 0 );
		}
	}
	rend = 1;
}

bool TeamAuswahlListe::tick( double tickVal )
{
	for( int i = 0; i < teamAnzahl; i++ )
		rend |= teams->z( i )->tick( tickVal );
	rend |= scroll->getRend();
	bool ret = rend;
	rend = 0;
	return ret;
}

void TeamAuswahlListe::doMausEreignis( MausEreignis &me )
{
	int tmpX = me.mx;
	int tmpY = me.my;
	me.mx -= 50;
	me.my -= 50 - scroll->getScrollData()->anzeigeBeginn;
	for( int i = 0; i < teamAnzahl; i++ )
	{
		teams->z( i )->doMausEreignis( me );
		me.my -= 20 + teams->z( i )->getHöhe();
	}
	me.mx = tmpX;
	me.my = tmpY;
	if( me.mx > 1 && me.mx < 698 && me.my > 1 && me.my < 397 )
	{
		scroll->doMausMessage( 683, 1, 15, 396, me );
		me.verarbeitet = 1;
	}
}

void TeamAuswahlListe::render( Bild &zRObj )
{
	if( !zRObj.setDrawOptions( 0, 0, 698, 398 ) )
		return;
	rahmen->render( zRObj );
	int maxHöhe = 50;
	for( int i = 0; i < teamAnzahl; i++ )
		maxHöhe += 20 + teams->z( i )->getHöhe();
	maxHöhe += 30;
	scroll->update( maxHöhe, 396 );
	scroll->render( 683, 1, 15, 396, zRObj );
	if( !zRObj.setDrawOptions( 1, 1, 682, 395 ) )
	{
		zRObj.releaseDrawOptions();
		return;
	}
	int y = 50 - scroll->getScrollData()->anzeigeBeginn;
	for( int i = 0; i < teamAnzahl - 1; i++ )
		y += 20 + teams->z( i )->getHöhe();
	for( int i = teamAnzahl - 1; i >= 0; i-- )
	{
		teams->z( i )->render( y, zRObj );
		if( i > 0 )
			y -= 20 + teams->z( i - 1 )->getHöhe();
	}
	zRObj.releaseDrawOptions();
	zRObj.releaseDrawOptions();
}

// constant

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

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

// Inhalt der TeamAuswahlTimer Klasse aus TeamAuswahl.h
// Konstruktor
TeamAuswahlTimer::TeamAuswahlTimer( Schrift *zSchrift )
{
	zeit = initTextFeld( 0, 0, 200, 200, zSchrift, TextFeld::Style::Text | TextFeld::Style::Center, "" );
	bestätigen = initKnopf( 65, 170, 70, 20, zSchrift, Knopf::Style::Sichtbar, "Fertig" );
	time = 0;
	maxTime = 0;
	grad = 0;
	rend = 0;
	ref = 1;
}

// Destruktor
TeamAuswahlTimer::~TeamAuswahlTimer()
{
	zeit->release();
	bestätigen->release();
}

// nicht constant
void TeamAuswahlTimer::setVerbleibendeZeit( int sekunden )
{
	if( !maxTime )
		maxTime = sekunden;
	if( time != sekunden )
		rend = 1;
	time = sekunden;
}

bool TeamAuswahlTimer::doMausEreignis( MausEreignis &me )
{
	bool vera = me.verarbeitet;
	bestätigen->doMausEreignis( me );
	if( !vera && me.verarbeitet && me.id == ME_RLinks )
	{
		if( spielKlient->spielErstelltTeamFertig() )
		{
			bestätigen->löscheStyle( Knopf::Style::Erlaubt );
			return 1;
		}
	}
	return 0;
}

bool TeamAuswahlTimer::tick( double tickVal )
{
	zeit->setText( "" );
	zeit->zText()->anhängen( time );
	grad += ( tickVal * 2 );
	rend = 1;
	if( grad > 360 )
		grad -= 360;
	bool ret = rend;
	rend = 0;
	return ret;
}

void TeamAuswahlTimer::render( Bild &zRObj )
{
	if( !zRObj.setDrawOptions( 498, 398, 200, 200 ) )
		return;
	zeit->render( zRObj );
	int r = ( maxTime && time ) ? 90 - (int)( 75.0 / ( (double)maxTime / ( maxTime - time ) ) + 0.5 ) : 15;
	zRObj.drawKreis( 100, 100, 15, 0xFFFF0000 );
	zRObj.drawKreis( 100, 100, r, 0xFF00FF00 );
	int x1 = 100 + (int)( sin( grad ) * 15 );
	int y1 = 100 + (int)( cos( grad ) * 15 );
	int x2 = 100 + (int)( sin( grad ) * r );
	int y2 = 100 + (int)( cos( grad ) * r );
	zRObj.drawLinie( Punkt( x1, y1 ), Punkt( x2, y2 ), 0xFFFFFF00 );
	bestätigen->render( zRObj );
	zRObj.releaseDrawOptions();
}

// constant
int TeamAuswahlTimer::getZeit() const
{
	return time;
}

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

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

// Inhalt der TeamAuswahlChat Klasse aus TeamAuswahl.h
// Konstruktor
TeamAuswahlChat::TeamAuswahlChat( Schrift *zSchrift )
{
	nachricht = initTextFeld( 2, 178, 472, 20, zSchrift, TextFeld::Style::TextFeld, "" );
	Bild *sendenBild = bilder->get( "chat.ltdb/senden.png" );
	if( !sendenBild )
	{
		LTDBDatei *datei = new LTDBDatei();
		datei->setDatei( new Text( "data/client/bilder/chat.ltdb" ) );
		datei->leseDaten( 0 );
		sendenBild = datei->laden( 0, new Text( "senden.png" ) );
		datei->release();
		bilder->add( "chat.ltdb/senden.png", sendenBild->getThis() );
	}
	senden = initKnopf( 476, 178, 20, 20, 0, 0, "" );
	senden->setStyle( Knopf::Style::Sichtbar | Knopf::Style::Erlaubt | Knopf::Style::Hintergrund | Knopf::Style::HAlpha | Knopf::Style::HBild | Knopf::Style::KlickBuffer );
	senden->setHintergrundBildZ( sendenBild );
	verlauf = initTextFeld( 2, 2, 494, 174, zSchrift, TextFeld::Style::TextGebiet & ~TextFeld::Style::Erlaubt, "" );
	verlauf->updateVScroll();
	verlauf->setVertikalKlickScroll( 5 );
	rahmen = new LRahmen();
	rahmen->setGröße( 498, 200 );
	rahmen->setFarbe( 0xFFFFFFFF );
	rahmen->setRamenBreite( 1 );
	rend = 0;
	ref = 1;
}

// Destruktor
TeamAuswahlChat::~TeamAuswahlChat()
{
	nachricht->release();
	senden->release();
	verlauf->release();
	rahmen->release();
}

// nicht constant
void TeamAuswahlChat::addNachricht( char *nachricht )
{
	verlauf->addZeile( nachricht );
	verlauf->updateVScroll();
	rend = 1;
}

bool TeamAuswahlChat::tick( double tickVal )
{
	rend |= verlauf->tick( tickVal );
	rend |= nachricht->tick( tickVal );
	rend |= senden->tick( tickVal );
	bool ret = rend;
	rend = 0;
	return ret;
}

void TeamAuswahlChat::doMausEreignis( MausEreignis &me )
{
	verlauf->doMausEreignis( me );
	nachricht->doMausEreignis( me );
	bool ver = !me.verarbeitet;
	senden->doMausEreignis( me );
	int aktion = ( ver && me.verarbeitet && me.id == ME_RLinks ) ? 1 : 0;
	if( aktion == 1 )
	{ // Nachricht senden
		if( spielKlient->spielErstelltChatNachricht( nachricht->zText()->getText() ) )
		{
			nachricht->setText( "" );
			nachricht->setAuswahl( 0, 0 );
			rend = 1;
		}
		else
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( spielKlient->getLetzterFehler() ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
	}
}

void TeamAuswahlChat::doTastaturEreignis( TastaturEreignis &te )
{
	bool ver = !te.verarbeitet;
	nachricht->doTastaturEreignis( te );
	int aktion = ( ver && te.verarbeitet && te.id == TE_Release && te.taste == T_Enter ) ? 1 : 0;
	if( aktion == 1 )
	{ // Nachricht senden
		if( spielKlient->spielErstelltChatNachricht( nachricht->zText()->getText() ) )
		{
			nachricht->setText( "" );
			nachricht->setAuswahl( 0, 0 );
			rend = 1;
		}
		else
			nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( spielKlient->getLetzterFehler() ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
	}
}

void TeamAuswahlChat::render( Bild &zRObj )
{
	if( !zRObj.setDrawOptions( 0, 398, 498, 200 ) )
		return;
	rahmen->render( zRObj );
	verlauf->render( zRObj );
	nachricht->render( zRObj );
	senden->render( zRObj );
	zRObj.releaseDrawOptions();
}

// constant

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

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

// Inhalt der TeamAuswahl Klasse aus TeamAuswahl.h
// Konstruktor
TeamAuswahl::TeamAuswahl( Schrift *zSchrift )
{
	tickVal = 0;
	animation = 0;
	sichtbar = 0;
	alpha = 0;
	karteId = 0;
	sts = 0;
	chat = 0;
	timer = 0;
	liste = 0;
	schrift = zSchrift->getThis();
	rend = 0;
	ref = 1;
}

// Destruktor
TeamAuswahl::~TeamAuswahl()
{
	if( sichtbar )
		setSichtbar( 0 );
	if( chat )
		chat->release();
	if( timer )
		timer->release();
	if( liste )
		liste->release();
	if( sts )
		sts->release();
}

// nicht constant
void TeamAuswahl::setKarteId( int karteId )
{
	this->karteId = karteId;
}

void TeamAuswahl::setSichtbar( bool sichtbar, bool sofort )
{
	this->sichtbar = sichtbar;
	if( sichtbar )
		animation |= 0x1;
	else
	{
		if( sofort )
			alpha = 0;
		else
			animation &= ~0x1;
	}
	rend = 1;
}

void TeamAuswahl::initSTS( SpielerTeamStruktur *sts )
{
	hauptScreen->lock();
	if( this->sts )
		this->sts->release();
	this->sts = sts;
	if( chat )
		chat = chat->release();
	if( timer )
		timer = timer->release();
	if( liste )
		liste = liste->release();
	chat = new TeamAuswahlChat( schrift );
	timer = new TeamAuswahlTimer( schrift );
	liste = new TeamAuswahlListe( schrift, sts->getThis(), karteId );
	hauptScreen->unlock();
	rend = 1;
}

void TeamAuswahl::addSpieler( int accountId )
{
	if( liste )
		liste->addSpieler( accountId );
}

void TeamAuswahl::setSpielerNummer( int accountId, int sNummer )
{
	if( liste )
		liste->setTeamVonSpieler( accountId, sNummer );
}

void TeamAuswahl::removeSpieler( int accountId )
{
	if( liste )
		liste->removeSpieler( accountId );
}

void TeamAuswahl::verbleibendeZeit( int sekunden )
{
	if( timer )
		timer->setVerbleibendeZeit( sekunden );
}

void TeamAuswahl::addNachricht( char *nachricht )
{
	if( chat )
		chat->addNachricht( nachricht );
}

bool TeamAuswahl::tick( double tickVal )
{
	if( !sichtbar && !alpha )
		return 0;
	if( chat )
		rend |= chat->tick( tickVal );
	if( timer )
		rend |= timer->tick( tickVal );
	if( liste )
		rend |= liste->tick( tickVal );
	this->tickVal += tickVal * 150;
	int val = ( int )this->tickVal;
	if( !val )
	{
		bool ret = rend;
		rend = 0;
		return ret;
	}
	if( val > 5 )
		val = 5;
	this->tickVal -= val;
	if( ( animation | 0x1 ) == animation ) // sichtbar werden
	{
		if( alpha != 255 )
		{
			if( alpha + val < 255 )
				alpha += val;
			else
				alpha = 255;
			rend = 1;
		}
	}
	else // unsichtbar werden
	{
		if( alpha != 0 )
		{
			if( alpha - val >= 0 )
				alpha -= val;
			else
				alpha = 0;
			rend = 1;
		}
	}
	bool ret = rend;
	rend = 0;
	return ret;
}

void TeamAuswahl::doMausEreignis( MausEreignis &me )
{
	if( !alpha )
		return;
	if( liste )
		liste->doMausEreignis( me );
	if( chat )
	{
		me.my -= 398;
		chat->doMausEreignis( me );
		me.mx -= 498;
		if( timer->doMausEreignis( me ) )
			liste->disable();
		me.my += 398;
		me.mx += 498;
	}
}

void TeamAuswahl::doTastaturEreignis( TastaturEreignis &te )
{
	if( !alpha )
		return;
	if( chat )
		chat->doTastaturEreignis( te );
}

void TeamAuswahl::render( Bild &zRObj )
{
	if( !alpha )
		return;
	if( !zRObj.setDrawOptions( 0, 0, 700, 600 ) )
		return;
	zRObj.setAlpha( alpha );
	if( timer )
		timer->render( zRObj );
	if( chat )
		chat->render( zRObj );
	if( liste )
		liste->render( zRObj );
	zRObj.releaseAlpha();
	zRObj.releaseDrawOptions();
}

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

int TeamAuswahl::getKarteId() const
{
	return karteId;
}

SpielerTeamStruktur *TeamAuswahl::getSTS() const
{
	return sts->getThis();
}

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

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

// Event Aktionen
void TeamAuswahlListeSpielerTeamAuswahlE( void *p, AuswahlBox *obj, int p1, int p2 )
{
	if( !p )
		return;
	( (TeamAuswahlListeSpieler*)p )->spielerTeamAuswahlE( obj, p1, p2 );
}