#ifndef Gruppe_H
#define Gruppe_H

#include <Klient.h>
#include <Thread.h>
#include <Array.h>
#include <Knopf.h>
#include <Scroll.h>
#include <Fenster.h>
#include <KSGScript.h>

using namespace Framework;
using namespace KSGScript;

class GruppeEinladungAccount
{
private:
	LRahmen *rahmen;
	AlphaFeld *auswahl;
	TextFeld *name;
	Knopf *nachrichtSenden;
	Knopf *erneutSenden;
	Knopf *einladungAbbrechen;
	int status;
	int br;
	int knopfX;
	double tickVal;
	bool mausIn;
	bool remove;
	int accountId;
	int gruppeId;
	int admin;
	int höhe;
	int animation;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeEinladungAccount( Schrift *zSchrift );
	// Destruktor
	~GruppeEinladungAccount();
	// nicht constant
	void setGruppeId( int gruppeId );
	void setAccountId( int id );
	void setGröße( int br );
	void setAbgelehnt();
	void setAngenommen();
	void setRemove();
	void setAdmin( int admin );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void render( int yOff, Bild &zrObj );
	// constant
	bool getRemove() const;
	int getAccountId() const;
	int getHöhe() const;
	// Reference Counting
	GruppeEinladungAccount *getThis();
	GruppeEinladungAccount *release();
};

class GruppeEinladungListe
{
private:
	Punkt pos;
	Punkt gr;
	LRahmen *rahmen;
	TextFeld *einladenName;
	Knopf *einladen;
	VScrollBar *scroll;
	RCArray< GruppeEinladungAccount > *accounts;
	Schrift *schrift;
	int einladungHöhe;
	double tickVal;
	int anzahl;
	int gruppeId;
	int admin;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeEinladungListe( Schrift *zSchrift );
	// Destruktor
	~GruppeEinladungListe();
	// nicht constant
	void reset();
	void setGruppeId( int gruppeId );
	void addAccount( int id );
	void setAbgelehnt( int id );
	void setAngenommen( int id );
	void remove( int id );
	void setAdmin( int admin );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void doTastaturEreignis( TastaturEreignis &te );
	void render( Bild &zRObj );
	// constant

	// Reference Counting
	GruppeEinladungListe *getThis();
	GruppeEinladungListe *release();
};

class GruppeAccountDaten
{
private:
	LRahmen *rahmen;
	AlphaFeld *auswahl;
	TextFeld *name;
	TextFeld *punkte;
	Knopf *nachrichtSenden;
	Knopf *accountAnsehen;
	Knopf *freundEinladung;
	Knopf *kick;
	int br;
	double tickVal;
	bool mausIn;
	bool remove;
	int gruppeId;
	int accountId;
	int admin;
	int höhe;
	int animation;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeAccountDaten( Schrift *zSchrift );
	// Destruktor
	~GruppeAccountDaten();
	// nicht constant
	void setGruppeId( int gruppeId );
	void setAccountId( int id );
	void setAdmin( int admin );
	void setGröße( int x );
	void entfernen();
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void render( int y, Bild &zrObj );
	// constant
	bool getRemove() const;
	int getAccountId() const;
	int getHöhe() const;
	// Reference Counting
	GruppeAccountDaten *getThis();
	GruppeAccountDaten *release();
};

class GruppeAccountListe
{
private:
	Punkt pos;
	Punkt gr;
	LRahmen *rahmen;
	VScrollBar *scroll;
	RCArray< GruppeAccountDaten > *accounts;
	Schrift *schrift;
	int anzahl;
	int gruppeId;
	int admin;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeAccountListe( Schrift *zSchrift );
	// Destruktor
	~GruppeAccountListe();
	// nicht constant
	void reset();
	void setGruppeId( int gruppeId );
	void addAccount( int id );
	void removeAccount( int id );
	void setAdmin( int admin );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void render( Bild &zRObj );
	// constant

	// Reference Counting
	GruppeAccountListe *getThis();
	GruppeAccountListe *release();
};

class GruppeChat
{
private:
	Punkt pos;
	Punkt gr;
	LRahmen *rahmen;
	TextFeld *nachricht;
	Knopf *senden;
	TextFeld *verlauf;
	int gruppeId;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeChat( Schrift *zSchrift );
	// Destruktor
	~GruppeChat();
	// nicht constant
	void reset();
	void setGruppeId( int gruppeId );
	void gruppeNachricht( const char *nachricht );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void doTastaturEreignis( TastaturEreignis &te );
	void render( Bild &zRObj );
	// constant

	// Reference Counting
	GruppeChat *getThis();
	GruppeChat *release();
};

class GruppeAnmeldung
{
private:
	Punkt pos;
	Punkt gr;
	LRahmen *rahmen;
	KontrollKnopf *spielerHinzufügen;
	KontrollKnopf *angemeldet;
	TextFeld *zeit;
	Knopf *gruppeVerlassen;
	int admin;
	double time;
	int gruppeId;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeAnmeldung( Schrift *zSchrift );
	// Destruktor
	~GruppeAnmeldung();
	// nicht constant
	void reset();
	void setGruppeId( int gruppeId );
	void setSpielerHinzufügen( bool spielerHinzufügen );
	void setAngemeldet( bool angemeldet );
	void zurückInWarteschlange( int stunden, int minuten, int sekunden );
	void spielGefunden();
	void setAdmin( int admin );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void render( Bild &zRObj );
	// constant

	// Reference Counting
	GruppeAnmeldung *getThis();
	GruppeAnmeldung *release();
};

class GruppeKarte : public Thread
{
private:
	Punkt pos;
	Punkt gr;
	LRahmen *rahmen;
	Bild *hintergrund;
	KSGScriptObj *info;
    HINSTANCE ksgs;
	TextFeld *fehler;
	Schrift *schrift;
	unsigned char alpha1;
	unsigned char alpha2;
	double tickVal;
	double ladenZeit;
	int ladeBild;
	int karteId;
	int gruppeId;
	bool exit;
	bool geladen;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeKarte( Schrift *zSchrift );
	// Destruktor
	~GruppeKarte();
	// nicht constant
    void reset();
    void ksgsAktion( RCArray< KSGSVariable > *parameter, KSGSVariable **retVal );
	void setGruppeId( int gruppeId );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void render( Bild &zrObj );
	virtual void thread();
	// constant
	int getKarteId() const;
	// Reference Counting
	GruppeKarte *getThis();
	GruppeKarte *release();
};

class GruppeSpielGefunden
{
private:
	Punkt pos;
	Punkt gr;
	Fenster *spielGefunden;
	TextFeld *zeit;
	TextFeld *warte;
	Knopf *annehmen;
	unsigned char alpha;
	double time;
	double tickVal;
	bool sichtbar;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeSpielGefunden( Schrift *zSchrift );
	// Destruktor
	~GruppeSpielGefunden();
	// nicht constant
	void reset();
	void setSichtbar( bool sichtbar );
	void setVerbleibendeZeit( int sekunden );
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void render( Bild &zRObj );
	// constant
	bool istSichtbar() const;
	// Reference Counting
	GruppeSpielGefunden *getThis();
	GruppeSpielGefunden *release();
};

class GruppeFenster
{
private:
	Punkt pos;
	Punkt gr;
	GruppeAnmeldung *anmeldung;
	GruppeChat *chat;
	GruppeAccountListe *accounts;
	GruppeEinladungListe *einladungen;
	GruppeKarte *karte;
	GruppeSpielGefunden *spiel;
	bool sichtbar;
	unsigned char alpha;
	int gruppeId;
	double tickVal;
	bool rend;
	int ref;

public:
	// Konstruktor
	GruppeFenster( Schrift *zSchrift );
	// Destruktor
	~GruppeFenster();
	// nicht constant
	void setGruppeId( int id );
	void setSichtbar( bool sichtbar );
	void chatNachricht( const char *nachricht );
	void neuerSpieler( int accountId );
	void spielerVerlässt( int accountId );
	void neueEinladung( int accountId );
	void einladungEntfernt( int accountId );
	void einladungAbgelehnt( int accountId );
	void setSpielerHinzufügen( bool sh );
	void setAngemeldet( bool angemeldet );
	void spielGefunden();
	void verbleibendeZeit( int sekunden );
	void spielGefundenAbbruch();
	void zurückInWarteschlange( int stunden, int minuten, int sekunden );
	void setAdmin( int accountId );
	void kick();
	void reset();
	bool tick( double tickVal );
	void doMausEreignis( MausEreignis &me );
	void doTastaturEreignis( TastaturEreignis &te );
	void render( Bild &zRObj );
	// constant
	int getGruppeId() const;
	int getKarteId() const;
	// Reference ounting
	GruppeFenster *getThis();
	GruppeFenster *release();
};

#endif