<?php

// display all errors
// error_reporting( E_ALL );
assert_options(ASSERT_BAIL);
ini_set("html_errors", true);
ini_set("display_errors", true);

require_once('./core.php');
if( !isset( $user )) access_error();

/*
function my_default_exception_handler($exception) {
	global $user;
	$MySQL = new MySQL( MYSQL_HOST, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE );
	$dump= sprintf("Ausnahme in %s Zeile %d: %s. Trace: %s", mysql_real_escape_string($exception->file), $exception->line, mysql_real_escape_string($exception->message), mysql_real_escape_string(Print_R($exception->trace, true)));
	echo $dump;
	$dump.= sprintf(": %s", Print_R($GLOBALS, true));

	$sql = sprintf("INSERT INTO logdb.me_errors SET typ = 69, accountID = %d, zeit = NOW(), meldung = '%s'", $user->ID, mysql_real_escape_string($dump));
	
	$MySQL->query($sql);
	
	die();
}
set_exception_handler('my_default_exception_handler');
*/

require_once('lib/char.cls.php');

if(isset($_REQUEST['action'])) {
	$action = $_REQUEST['action'];
} else {
	$action = 'display_charauswahl';
}


// Auswertung
switch($action) {
	case "delete":
		// zeigt Bestätigungsseite an zum Löschen eines Chars
		$db_char = $MySQL->query_first(sprintf("SELECT charid, name, aktiviert, UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(aktivierungszeitpunkt) as freigeschaltet, FROM_UNIXTIME(".intval($settings['chardel_allowed_after'])."+UNIX_TIMESTAMP(aktivierungszeitpunkt)) as loeschdatum, block FROM server.chars WHERE charid = '".intval($_REQUEST['charid'])."' AND accountID = '%d'", $user->ID));
		if(isset($db_char['name'])===false) {
			// TODO: Logging Evtl. Versuch einen fremden Char zu löschen
			error('Char existiert nicht oder geh&ouml;rt nicht dir!', true);	
		} else {
			if($db_char['block']==1) { // TODO: check zeitüberlauf für unblocken
				error('Du kannst deinen Char nicht l&ouml;schen, da er zur Zeit vom Staff geblockt ist. Erst nach Ablauf deiner Strafe kannst du ihn l&ouml;schen!', true);
			}
			if($db_char['aktiviert']==1 AND $db_char['freigeschaltet'] < $settings['chardel_allowed_after']) {
				error('Dein Char ist noch nicht lange genug freigeschaltet. Du kannst ihn erst ab "'.$char['loeschdatum'].'" l&ouml;schen! Sinn dieser Zeitsperre ist der Schutz der Freischalter, die eine ganze Menge Arbeit mit dem Bearbeiten der Freischaltungen haben. Daher macht es auch keinen Sinn einen Staffler darum zu bitten, dass er deinen Char trotzdem vorher l&ouml;scht - denn dies darf er nicht tun.', true);	
			}
		}
	break;
	case "commit_delete":
		// löscht einen Char
		unset($_SESSION['chargen']);
		$MySQL->query("START TRANSACTION");
		$char = $MySQL->query_first(sprintf("SELECT charid, name, aktiviert, UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(aktivierungszeitpunkt) as freigeschaltet, FROM_UNIXTIME(".intval($settings['chardel_allowed_after'])."+UNIX_TIMESTAMP(aktivierungszeitpunkt)) as loeschdatum, block FROM server.chars WHERE charid = '%d' AND accountID = '%d'", intval($_REQUEST['charid']), $user->ID));
		if(isset($char['name'])===false) {
			// TODO: Logging Evtl. Versuch einen fremden Char zu löschen
			error('Char existiert nicht oder geh&ouml;rt nicht dir!', true);	
		} else {
			if($char['block']==1) { // TODO: check zeitüberlauf für unblocken
				error('Du kannst deinen Char nicht l&ouml;schen, da er zur Zeit vom Staff geblockt ist. Erst nach Ablauf deiner Strafe kannst du ihn l&ouml;schen!', true);
			}
			if($char['aktiviert']==1 AND $char['freigeschaltet'] < $settings['chardel_allowed_after']) {
				error('Dein Char ist noch nicht lange genug freigeschaltet. Du kannst ihn erst ab "'.$char['loeschdatum'].'" l&ouml;schen! Sinn dieser Zeitsperre ist der Schutz der Freischalter, die eine ganze Menge Arbeit mit dem Bearbeiten der Freischaltungen haben. Daher macht es auch keinen Sinn einen Staffler darum zu bitten, dass er deinen Char trotzdem vorher l&ouml;scht - denn dies darf er nicht tun.', true);	
			}
		}
		if($_POST['send_form']=='LÖSCHEN!' AND isset($_POST['delete_checkbox']) AND $_POST['delete_checkbox']=='on') {
			if($user->password != md5($_POST['password'])) {
				// TODO: Logging
				error('Ung&uuml;ltiges Passwort!', true);
			}
		
		// Charakter wird gelöscht
		$MySQL->query(sprintf("UPDATE server.chars SET aktiviert = 9 WHERE charid = '%d' AND accountid = '%d'", intval($_REQUEST['charid']), $user->ID));
		list($charcountc) = $MySQL->query_first(sprintf("SELECT COUNT(*) FROM server.chars WHERE accountid = '%d' AND aktiviert = 1", $user->ID));
		if($charcountc == 0) {
			// hat keine Charaktere mehr => mulflags entfernen, wenn nicht besonders gesetzt
			$MySQL->query(sprintf("UPDATE server.accounts SET mulflags = 0 WHERE mulflags 2 AND accountid = '%d'", $user->ID));
		}
		assert($MySQL->affected_rows()==1);
		$MySQL->query("COMMIT");		
		} else error('Dein Char wurde nicht gel&ouml;scht! Bitte &uuml;berpr&uuml;fe deine Angaben. Du musst die Checkbox auf jeden Fall anklicken!', true);
	
	break;
	case 'create_new':	
		// falls vorhanden alten Charerstellungs/Bearbeitungsprozess abbrechen
		unset($_SESSION['chargen']);

		$_SESSION['chargen']['step']=1;
		$action = 'char_process';
		$display_step = 1;
		
		if(isset($_GET['p']) AND $_GET['p'] == 1) {
			$_SESSION['chargen']['chartype'] = 'player';
		} elseif(isset($_GET['s']) AND $_GET['s'] == 1) {
			$_SESSION['chargen']['chartype'] = 'staff';
			// Validierung, ob erlaubt passiert später
		}
		
		// Testserver?
		if(isset($_GET['testserver']) AND $_GET['testserver']==1) {
			$_SESSION['chargen']['testserver'] = true;
		} else {
			$_SESSION['chargen']['testserver'] = false;
		}
		
		// freier Char?
		if(isset($_SESSION['chargen']['chartype'])=== false) {
			error("Diesen Fehler bitte melden.", true);
		}
		if(Char::checkFreeChars($user->ID, $_SESSION['chargen']['chartype'], $_SESSION['chargen']['testserver'])===false) {
			error('Du hast die maximale Anzahl erlaubter Chars erreicht.', true);
		}

		// Char-Objekt instanzieren
		$char = new Char(false, false, $_SESSION['chargen']['chartype'], $_SESSION['chargen']['testserver'], false);
	break;
	case 'edit':
		// falls vorhanden alten Charerstellungs/Bearbeitungsprozess abbrechen
		unset($_SESSION['chargen']);

		$_SESSION['chargen']['step']=-1; // brauchen wir hier nicht
		$action = 'char_process';
		$display_step = 1;
		
		// Testserver?
		if(isset($_GET['testserver']) AND $_GET['testserver']==1) {
			$_SESSION['chargen']['testserver'] = true;
		} else {
			$_SESSION['chargen']['testserver'] = false;
		}
		
		try{
			$char = new Char((int)$_REQUEST['charid'], (int)$user->ID, false, $_SESSION['chargen']['testserver']);
		} catch(IException $e) {
			// TODO
			error($e->getNotice(), true);
			die();
		}
	break;
	case 'gain':
		// Charsteigerung
		// falls vorhanden alten Charerstellungs/Bearbeitungsprozess abbrechen
		unset($_SESSION['chargen']);

		$_SESSION['chargen']['step']=-1; // brauchen wir hier nicht
		$action = 'char_process';
		$display_step = 5;
		
		// Testserver?
		if(isset($_GET['testserver']) AND $_GET['testserver']==1) {
			$_SESSION['chargen']['testserver'] = true;
		} else {
			$_SESSION['chargen']['testserver'] = false;
		}
		
		try{
			$char = new Char((int)$_REQUEST['charid'], (int)$user->ID, false, $_SESSION['chargen']['testserver']);
		} catch(IException $e) {
			// TODO
			echo $e->getNotice();
			die();
		}
		
	break;
	case 'char_process':
		if(isset($_SESSION['chargen']['char'])) {
			$char = unserialize($_SESSION['chargen']['char']);
		}
		
		if(isset($char)===false || is_A($char, 'Char')===false) {
			// es wurde kein Charbearbeitungsprozess angestossen => zur Charauswahl
			$action = 'display_charauswahl';
			break;
		}
		// gelöschte Chars können natürlich nicht bearbeitet werden
		if($char->get('aktiviert') == 9) {
			error("Ein unbekannter Fehler ist aufgetreten".__LINE__, true);
		}
		// Beim Charaktererstellen muss der Schritt auch dem aktuellen Schritt der Charerstellung entsprechen
		if($char->get('mode') == 'create' AND $_SESSION['chargen']['step']!=$_REQUEST['step']) {
			// Schicke uns zur Anzeige des aktuellen Schrittes; keine Auswertung
			// TODO: Logging
			$display_step = $_SESSION['chargen']['step'];
			break;
		}
		// Charakter darf nicht aktiviert sein, wenn in create-mode
		if($char->get('aktiviert') == 1 AND $char->get('mode') == 'create') {
			error("Ein unbekannter Fehler ist aufgetreten".__LINE__, true);
		}
			
		switch($_REQUEST['step']) {
			case 1:
				// Name, Geschlecht, Volk setzen
				switch($char->get('mode')) {
					case 'create':
						try {
							$char->setVolk((int)$_POST['volk']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						try {
							$char->setName($_POST['name']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						if(is_null($char->get('volk')) === false) {
							try {
								$char->setGeschlecht($_POST['geschlecht']);
							} catch(IException $e) {
								$form_errors[] = $e->getNotice();
							}
						}
					break;
					case 'createedit':
						// Charakter noch nicht freigeschaltet
						// => Name darf geändert werden; Änderung von Geschlecht oder Volk erfordert komplette Neuerstellung
						/*if(isset($_POST['geschlecht']) or isset($_POST['volk']))
							error("Fehler", true);*/
						
						try {
							$char->setName($_POST['name']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}	
					break;
					case 'edit':	
						// keine Änderung erlaubt
					break;
					default:
						error("Ein unbekannter Fehler ist aufgetreten!".__LINE__, true);
				}
			break;
			case 2:
				// 1. Profession setzen
				switch($char->get('mode')) {
					case 'edit':
						// nichts erlaubt
						break;
					case 'createedit':
						// weiter
					case 'create':
						try {
							$char->setProfession(1, (int)$_POST['profession_1'],1);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
					break;
					default:
						error("Ein unbekannter Fehler ist aufgetreten!".__LINE__, true);
				}
			break;
			case 3:
				// Haar, Bart, Haarfarbe, Bartfarbe, Hautfarbe setzen
				switch($char->get('mode')) {	
					case 'edit':
						// nichts erlaubt
						break;
					case 'createedit':
						// weiter
					case 'create':
						try {
							$char->setHaar((int)$_POST['haar']);
							$char->setHaarfarbe((int)$_POST['haarfarbe']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						try {
							$char->setBart((int)$_POST['bart']);
							$char->setBartfarbe((int)$_POST['bartfarbe']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						try {
							$char->setHautfarbe((int)$_POST['hautfarbe']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
					break;
					default:
						error("Ein unbekannter Fehler ist aufgetreten!".__LINE__, true);
				}
			break;
			case 4:
				// Shopping
				if($char->get('mode') != 'edit') {
					require_once('lib/char_shopping.cls.php');
					try {
						$shop = new CharShopping(450, $char);
					} catch(IException $e) {
						$form_errors[] = $e->getNotice();
					}
					
					if(isset($_REQUEST['s_action'])) {
						switch($_REQUEST['s_action']) {
							case 'display':
							break;
							case 'buy':
								try {
									$shop->buyItem(intval($_REQUEST['id']),intval($_REQUEST['amount']));
								} catch(IException $e) {
									$form_errors[] = $e->getNotice();
								}
							break;
							case 'sellremove':
							
								if(isset($_REQUEST['listid'])===false)
										break;
								if(isset($_REQUEST['equip_form']) AND $_REQUEST['equip_form'] == 'anziehen') {
									try {
										$shop->equip(intval($_REQUEST['listid']));
									} catch(IException $e) {
										$form_errors[] = $e->getNotice();
									}
								} elseif(isset($_REQUEST['colour_form'])) {
									 try {
									 	$shop->colourize(intval($_REQUEST['colour']), intval($_REQUEST['listid']));
									 } catch(IException $e) {
										$form_errors[] = $e->getNotice();
									}
								}else {
									try {
										$shop->sellItem(intval($_REQUEST['listid']));
									} catch(IException $e) {
										$form_errors[] = $e->getNotice();
									}
								}
							break;
							case 'drop_item':
								if(isset($_REQUEST['drop_item'])) {
									try {
										$shop->unequip(intval($_REQUEST['drop_item']));
									} catch(IException $e) {
										$form_errors[] = $e->getNotice();
									}
								}
							break;
						}
					}

					if(isset($_REQUEST['send_form']) AND $_REQUEST['send_form'] == 'Weiter >>') {
						// es soll weitergehen => hat der Char etwas auf dem Hosenlayer, Robenlayer, Rocklayer? (keine Nackten)
						if(is_null($char->equipped_items[4])===true  && is_null($char->equipped_items[17])===true && is_null($char->equipped_items[22])===true && is_null($char->equipped_items[23])===true) {
							$form_errors[] = "Du musst Deinem Charakter zumindest eine Hose oder eine Robe anziehen!";
							break;  // raus
						}
						
						// check
						$shop->finishShopping();
					}
				}
			break;
			case 5:
				// Steigern: Stats
				// hier sind wir auch, wenn wir steigern
				switch($char->get('mode')) {
					case 'edit':
					case 'createedit':
					case 'create':
					case 'gain':
						for($i=0;$i<count($STATS);$i++) {
							$curr_stat = $STATS[$i];	
							$char->updateStat($curr_stat, (int)$_POST[$curr_stat]);
						}
						$char->checkUpdatedStats();
					break;
					default:
						error("Ein unbekannter Fehler ist aufgetreten!".__LINE__, true);
				}
			break;
			case 6:
				// Steigern: Skills
				// hier sind wir auch, wenn wir steigern
				switch($char->get('mode')) {
					case 'edit':
					case 'createedit':
					case 'create':
					case 'gain':
						for($i=0;$i<count($SKILLS);$i++) {
							$curr_skill = $SKILLS[$i];
							$char->updateSkills($curr_skill, (int)$_POST[$curr_skill]);
						}
						$char->checkUpdatedSkills();
						if($char->get('mode') == 'gain') {
							// Beim Steigern sind wir hier schon fertig
							try {
								$message = $char->save();
								$action = '';
								unset($_SESSION['chargen']['char']);
								// TODO: besser
							} catch(IException $e) {
								$form_errors[] = $e->getNotice();
							}
						}
					break;
					default:
						error("Ein unbekannter Fehler ist aufgetreten!".__LINE__, true);
				}
			break;
			case 7:
				// RP-Informationen eingeben
				// Alter, Eltern, Geschwister, Chargeschichte, Profil (TODO: Aufteilung)
				switch($char->get('mode')) {
					case 'createedit':
					case 'edit':
					case 'create':
						try {	
							$char->setRp_alter((int)$_POST['rp_alter']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						try {	
							$char->setCharstory((string)$_POST['charstory']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						if($char->get('aktiviert') != 1) {
							try {	
								$char->setFixProfil((string)$_POST['fix_profil']);
							} catch(IException $e) {
								$form_errors[] = $e->getNotice();
							}
						}
						try {	
							$char->setDynProfil((string)$_POST['dyn_profil']);
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						
					break;	
					default:
						error("Ein unbekannter Fehler ist aufgetreten!".__LINE__, true);
				}
				
			break;
			case 8:
				// Übersicht
				switch($char->get('mode')) {
					case 'createedit':
					case 'edit':
					case 'create':
						if($char->get('aktiviert') != 1) {		
							if($_POST['send_form']=='Speichern') {
								// Nur Speichern und nicht zur Freischaltung anmelden!
								$char->setAktiviert(3);
							} else {
								// Zur Anmeldung einreichen
								$char->setAktiviert(0);
							}
						}
						
						// Datensatz speichern
						try {
							$message = $char->save();
							$action = '';
							unset($_SESSION['chargen']['char']);
							// TODO: besser
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
						
					break;
					default:
						throw new LogException();
					break;
				}
			break;
		}
		// ist bei der Auswertung ein Fehler aufgetreten?
		if($_REQUEST['step'] == 3 AND $_POST['send_form'] == 'Vorschau') {
			// Spezialbehandlung für Vorschaufunktion Gump; wir bleiben für die Charvorschau
			$display_step = 3;
		} elseif( isset($form_errors) AND count( $form_errors ) > 0 ) {
			// wir müssen wegen eines Fehlers bleiben
			$Smarty->assign( 'form_errors', $form_errors );
			$display_step = $_REQUEST['step'];
		} elseif($_REQUEST['step'] == 4 AND isset($_REQUEST['s_action'])) {
			// eine Shopping-Aktion
			$display_step = 4;
		} else {
			// wir düfen weiter
			if($char->get('mode')=='create') {
				$_SESSION['chargen']['step']++;
				$display_step = $_SESSION['chargen']['step'];
			} else {
				$display_step = $_REQUEST['step']+1;
			}
			
			// wenn fertig: Charübersicht anzeigen
			if($display_step == 9) {
				$action = '';
				unset($_SESSION['chargen']);
				unset($char);
			}
		}	
		
	break;
}

// Wenn ein Char existiert, dann serialisiere ihn in der Datenbank
if(isset($char)) {
	$_SESSION['chargen']['char'] = serialize($char);
}

// *** DISPLAY ***
switch($action) {
	case 'delete':
		$Smarty->assign('char', $db_char);
		$page['content'] = $Smarty->fetch('char_delete.tpl');
	break;
	case 'char_process':
		$Smarty->assign('aktiviert', $char->get('aktiviert'));
		
		$Smarty->assign('process_mode', $char->get('mode'));
		if($char->get('mode')=='gain') { $titel_extension = 'steigern'; }
		else {$title_extension = 'bearbeiten'; }
		$Smarty->assign('title_extension', $title_extension);
		switch($display_step) {
			case 1:
				// Charname, Geschlecht,Volk
				$ergebnis = $MySQL->fetch_complete("SELECT ID, Bezeichnung, Rasse FROM server.voelker WHERE gesperrt = 0 ORDER BY Rasse, Bezeichnung" );
				for($i=0;$i<count($ergebnis);$i++) {
					$voelker[$ergebnis[$i]['ID']][1] = $ergebnis[$i]['Bezeichnung']." (".$ergebnis[$i]['Rasse'].")";
					$voelker[$ergebnis[$i]['ID']][0] = $ergebnis[$i]['ID'];
					$lvoelker[$ergebnis[$i]['ID']] = $ergebnis[$i]['Bezeichnung']." (".$ergebnis[$i]['Rasse'].")";
				}
 
				$Smarty->assign( 'geschlechter', array("w"=>"weiblich","m"=>"männlich") );
				$Smarty->assign( 'voelker', $voelker );
				$Smarty->assign( 'lvoelker', $lvoelker );
				
							
				$Smarty->assign('name', getValidCharString($char, 'name'));
				$Smarty->assign('geschlecht', getValidCharString($char, 'geschlecht'));
				$Smarty->assign('volk', getValidCharString($char, 'volk'));
				
				if($char->get('mode') == 'createedit') {
					$activation_texts = $MySQL->fetch_complete(sprintf("SELECT server.activation_messages.*, server.accounts.name as name FROM server.activation_messages LEFT JOIN server.accounts on server.activation_messages.lastchangedby = server.accounts.accountid WHERE server.activation_messages.charid = '%d' ORDER BY server.activation_messages.lastchanged DESC", $char->get('charid')));
					$Smarty->assign('activation_texts', $activation_texts);	
				}
				
				$page['content'] = $Smarty->fetch('chargen_step1.tpl');
				
				
			break;
			case 2:
				// Profession
				// Prinzipell mögliche Liste der Professionen für ein Volk
				$professionen = $MySQL->fetch_complete(sprintf("SELECT id, bezeichnung FROM server.professionen WHERE %d_mw =1 AND id NOT IN ( SELECT profession FROM server.anmeldestop WHERE volk =0 ) ORDER BY Bezeichnung", $char->get('volk')));
				
				$professionen = array_merge((array)"Bitte w&auml;hlen...", $professionen);
				
				$Smarty->assign( 'professionen', $professionen );
				
				$Smarty->assign( 'profession_1', getValidCharString($char, 'profession_1'));
				
				if($char->get('aktiviert') == 1) {
					// Erstelle Liste für Professionen
					$professionsstufe = array("Anfänger", "Lehrling", "Geselle", "Meister", "Großmeister");
					$charprofessionen = '';
					for($i=1;$i<=3;$i++) {
						if($char->get('profession_'.$i, 'stufe')>0) {
							list ($profession) = $MySQL->query_first(sprintf("SELECT bezeichnung FROM server.professionen WHERE id = '%d'", $char->get('profession_'.$i, 'id')));
							$charprofessionen .= $profession." (".$professionsstufe[$char->get('profession_'.$i, 'stufe')].")<br />";
						} else break;
					}
					
					$Smarty->assign('charprofessionen', $charprofessionen);
				}
				
				$page['content'] = $Smarty->fetch('chargen_step2.tpl');
			break;
			case 3:
				// Haare, Bart, Haut, -farben
				$equipped_items = $char->get('equipped_items');
				
				// Hole Haare
				$haare[] = "Bitte w&auml;hlen...";
				$haare = array_merge($haare, $MySQL->fetch_complete(sprintf("SELECT gumpid, bezeichnung FROM server.haare WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht'))));
				$Smarty->assign('haare',$haare);

				if(isset($equipped_items[11]['itemid']))
					$Smarty->assign('haar',$equipped_items[11]['itemid']);
					

				// Hole Bärte
				$baerte[] = array(0 => 0, 'gumpid' => 0, 1 => 'kein Bart', 'bezeichnung' => 'kein Bart');
				$baerte = array_merge($baerte, $MySQL->fetch_complete(sprintf("SELECT gumpid, bezeichnung FROM server.baerte WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht'))));
				$Smarty->assign('baerte',$baerte);
				if(isset($equipped_items[16]['itemid']))
					$Smarty->assign('bart',$equipped_items[16]['itemid']);
				
				// Hole Haarfarben
				$haarfarben[] = array('hexfarbe' => 'bw',0=> 'bw', 'bezeichnung' => "Bitte w&auml;hlen...", 1 => "Bitte w&auml;hlen...");
				$haarfarben = array_merge($haarfarben, $MySQL->fetch_complete(sprintf("SELECT hexfarbe, bezeichnung FROM server.haarfarben WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht')) ));
				$Smarty->assign('haarfarben',$haarfarben);
				if(isset($equipped_items[11]['itemid']))
					$Smarty->assign('haarfarbe',$equipped_items[11]['hexfarbe']);
				
				// Bartfarbe
				$bartfarben = $haarfarben;
				$Smarty->assign('bartfarben',$bartfarben);
				if(isset($equipped_items[16]['itemid']))
					$Smarty->assign('bartfarbe',$equipped_items[16]['hexfarbe']);
				
				// Hole Hautfarben
				$hautfarben[] = "Bitte w&auml;hlen...";
				$hautfarben = array_merge($hautfarben, $MySQL->fetch_complete(sprintf("SELECT hexfarbe, bezeichnung FROM server.hautfarben WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht')) ));
				$Smarty->assign('hautfarben',$hautfarben);
				$Smarty->assign('hautfarbe', getValidCharString($char, 'hautfarbe'));
			
				if($char->get('aktiviert') == 1) {
            	foreach($haare as $item) {
						if($item['gumpid'] == 0) continue;
            		$lhaare[$item['gumpid']] = $item;
					}
					$Smarty->assign('lhaare', $lhaare);
					foreach($baerte as $item) {
						if($item['gumpid'] == 0) continue;
            		$lbaerte[$item['gumpid']] = $item;
					}
					if(isset($lbaerte)) $Smarty->assign('lbaerte', $lbaerte);
					foreach($haarfarben as $item) {
						if($item['hexfarbe'] == 0) continue;
            		$lhaarfarben[$item['hexfarbe']] = $item;
					}
					if(isset($lhaarfarben)) $Smarty->assign('lhaarfarben', $lhaarfarben);
					foreach($bartfarben as $item) {
						if($item['hexfarbe'] == 0) continue;
            		$lbartfarben[$item['hexfarbe']] = $item;
					}
					if(isset($lbartfarben)) $Smarty->assign('lbartfarben', $lbartfarben);
					foreach($hautfarben as $item) {
						if($item['hexfarbe'] == 0) continue;
            		$lhautfarben[$item['hexfarbe']] = $item;
					}
					if(isset($lhautfarben)) $Smarty->assign('lhautfarben', $lhautfarben);
				}

				// wird eigentlich nicht benötigt, aber mitgeschoben, um ein Charbild identifizierbar zu machen
				$Smarty->assign('name', $char->get('name'));
				$page['content'] = $Smarty->fetch('chargen_step3.tpl');
			break;
			case 4:
				// Shopping
				
				if(isset($shop) === false) {
					require_once('lib/char_shopping.cls.php');
					try {
						$shop = new CharShopping(450, $char);
					} catch(IException $e) {
						$form_errors[] = $e->getNotice();
					}
				}
				$shoppinglist = $shop->getShoppinglist();
				if(isset($_REQUEST['s_action'])) {
					switch($_REQUEST['s_action']) {
						case 'display':
							// eine Detailsinformation soll angezeigt werden
							$Smarty->assign('displayItem', $shoppinglist[intval($_REQUEST['displayId'])]);
						break;
						case 'buy':
						break;
						case 'sellremove':
						break;
						case 'drop_item':
						break;
					}
				}
				// TODO
				$Smarty->assign('farben', array_merge(array("ungefärbt"), $shop->farben));
				//$Smarty->assign('farben', $shop->farben);
				
				//$Smarty->assign('gsk', $shop->pimpMyMoney($shop->money));
				$Smarty->assign('money', $shop->money);
		
				$Smarty->assign('einkaufsliste', $shoppinglist);
				$Smarty->assign('myItems', $char->get('unequipped_items'));
				
				$Smarty->assign('equipped_items', $char->equipped_items); 
				$page['content'] = $Smarty->fetch('chargen_step4.tpl');
			break;
			case 5:
				// Stats
				// Punkte setzen
				$punkte = $char->get('statsteigerungspunkte');
				
				/* $prep_stats:
				*	0 - Bezeichnung
				*	1 - schluessel
				*	2 - Minimum
				*	3 - Maximum
				*	4 - aktueller Wert (Initialisiert mit Minimum; später vom Spieler gewählt)
				*/
				for($i=0;$i<count($STATS);$i++) {
					$prep_stats[$i][0] = $STATS[$i];
					$prep_stats[$i][1] = $STATS[$i];
					$prep_stats[$i][2] = $char->get('min_stats', $STATS[$i]);
					$prep_stats[$i][3] = $char->get('max_stats', $STATS[$i]);
					$prep_stats[$i][4] = $char->get('stats', $STATS[$i]);	
				}
				
				if($char->get('aktiviert') != 1 AND $punkte != 0) {
					$Smarty->assign( 'send_form_disabled', 'true');
				} else {
					$Smarty->assign( 'send_form_disabled', 'false');
				}
					
				$Smarty->assign( 'prep_stats', $prep_stats );
				$Smarty->assign( 'punkte', $punkte );
				if($char->get('aktiviert') != 1) {
					$Smarty->assign( 'punkteAnfang', $settings['chargen_punkte']);
				} else {
					$Smarty->assign( 'punkteAnfang', $punkte);
				}

				$Smarty->assign('xp', $char->get('xp'));				
				$Smarty->assign('level', $char->get('level'));
				
				$page['content'] = $Smarty->fetch('chargen_step5.tpl');
			break;
			case 6:
				// Skills
				// Punkte setzen
				$punkte = $char->get('skillsteigerungspunkte');
				
				/* $prep_skills:
				*	0 - Bezeichnung
				*	1 - schluessel
				*	2 - Minimum
				*	3 - Maximum
				*	4 - aktueller Wert (Initialisiert mit Minimum; später vom Spieler gewählt)
				*/
				for($i=0;$i<count($SKILLS);$i++) {
					$prep_skills[$i][0] = $SKILLS[$i];
					$prep_skills[$i][1] = $SKILLS[$i];
					$prep_skills[$i][2] = $char->get('min_skills', $SKILLS[$i]);
					$prep_skills[$i][3] = $char->get('max_skills', $SKILLS[$i]);
					$prep_skills[$i][4] = $char->get('skills', $SKILLS[$i]);	
				}
				
				$Smarty->assign( 'prep_skills', $prep_skills );
				$Smarty->assign( 'punkte', $punkte );
				if($char->get('aktiviert') != 1) {
					$Smarty->assign( 'punkteAnfang', $settings['chargen_punkte']);
				} else {
					$Smarty->assign( 'punkteAnfang', $settings['chargen_skillpunkte']);
				}
				
				if($char->get('aktiviert') != 1 AND $punkte != 0) {
					$Smarty->assign( 'send_form_disabled', 'true');
				} else {
					$Smarty->assign( 'send_form_disabled', 'false');
				}
				$Smarty->assign('xp', $char->get('xp'));
				$Smarty->assign('level', $char->get('level'));
				$page['content'] = $Smarty->fetch('chargen_step6.tpl');
			break;
			case 7:
				// RP-Infos
				$Smarty->assign('rp_alter', getValidCharString($char, 'rp_alter'));
				//$Smarty->assign('eltern', getValidCharString($char, 'eltern'));
				//$Smarty->assign('geschwister', getValidCharString($char, 'geschwister'));
				$Smarty->assign('charstory', getValidCharString($char, 'charstory'));
				$Smarty->assign('fix_profil', getValidCharString($char, 'fix_profil'));
				$Smarty->assign('dyn_profil', getValidCharString($char, 'dyn_profil'));
				
				list ($min_age, $max_age) = $MySQL->query_first(sprintf("SELECT min_age, max_age FROM server.voelker WHERE id = '%d'", $char->get('volk')));
				$Smarty->assign('min_age', $min_age);
				$Smarty->assign('max_age', $max_age);
				
				$page['content'] = $Smarty->fetch('chargen_step7.tpl');
			break;
			case 8:
				// Zusammenfassung
				
				// hole Charakterdaten aus dem Objekt		
				$reflection = new ReflectionClass($char);
				$defaults = $reflection->getdefaultProperties();
				
				foreach($defaults as $prop_name => $propvalue) {
					$char_out[$prop_name] = $char->get($prop_name);
				}
				// Werte mit Text-Informationen ergänzen
				list ($char_out['volk']) = $MySQL->query_first(sprintf("SELECT bezeichnung FROM server.voelker WHERE id = '%d'", $char_out['volk']));
				
				// Erstelle Liste für Professionen
				$professionsstufe = array("Anfänger", "Lehrling", "Geselle", "Meister", "Großmeister");
				$char_out['professionen'] = '';
				for($i=1;$i<=3;$i++) {
					if(isset($char_out['profession_'.$i]['id']) AND $char_out['profession_'.$i]['stufe']>0) {
						list ($profession) = $MySQL->query_first(sprintf("SELECT bezeichnung FROM server.professionen WHERE id = '%d'", $char_out['profession_'.$i]['id']));
						$char_out['professionen'] .= $profession." (".$professionsstufe[$char_out['profession_'.$i]['stufe']].")<br />";
					} else break;
				}
				
				
				// Werte für Statlimits einfügen
				foreach($char_out['stats'] as $stat => $value) {
					$stats_out[$stat]['bezeichnung'] = $stat;
					$stats_out[$stat]['min'] = $char_out['min_stats'][$stat];
					$stats_out[$stat]['wert'] = $value;
					$stats_out[$stat]['max'] = $char_out['max_stats'][$stat];
					
					$stats_out[$stat]['a'] = 4*$stats_out[$stat]['min']; 
					$stats_out[$stat]['b'] = 4*($stats_out[$stat]['wert']-$stats_out[$stat]['min']); 
					$stats_out[$stat]['c'] = 4*($stats_out[$stat]['max']-$stats_out[$stat]['wert']);
					$stats_out[$stat]['d'] = 4*(100-$stats_out[$stat]['max']);
				}
				
				// Werte für Skilllimits einfügen
				foreach($char_out['skills'] as $skill => $value) {
					$skills_out[$skill]['bezeichnung'] = $skill;
					$skills_out[$skill]['min'] = $char_out['min_skills'][$skill];
					$skills_out[$skill]['wert'] = $value;
					$skills_out[$skill]['max'] = $char_out['max_skills'][$skill];
					
					$skills_out[$skill]['a'] = 20*$skills_out[$skill]['min']; 
					$skills_out[$skill]['b'] = 20*($skills_out[$skill]['wert']-$skills_out[$skill]['min']); 
					$skills_out[$skill]['c'] = 20*($skills_out[$skill]['max']-$skills_out[$skill]['wert']);
					$skills_out[$skill]['d'] = 20*(20-$skills_out[$skill]['max']);
				}
				
				$Smarty->assign('char', $char_out);
				$Smarty->assign('stats', $stats_out);
				$Smarty->assign('skills', $skills_out);
				$Smarty->assign('clength', strlen($char_out['charstory']));
				
				$page['content'] = $Smarty->fetch('char_display.tpl');
				$page['content'] .= $Smarty->fetch('chargen_step8.tpl');
				
			break;
			default:
				error('Ein unbekannter Fehler ist aufgetreten', true);
			break;
		}
	break;
	default:
		// Charübersicht anzeigen
		
		$result_chars_prepare = $MySQL->fetch_complete(sprintf("SELECT charid, name, aktiviert, chartype FROM server.chars WHERE accountID ='%d' AND testserver = 0 AND aktiviert != 9 ORDER BY chartype, name", $user->ID));
		$count_display = max($user->max_characters+$user->max_staffcharacters, count($result_chars_prepare));
		$count_characters = $user->max_characters;
		$count_staffcharacters = $user->max_staffcharacters;
		for($i=0;$i<$count_display;$i++) {
			if(isset($result_chars_prepare[$i])) {
				$result_chars[] = $result_chars_prepare[$i];
				if($result_chars_prepare[$i]['chartype'] == 'player') $count_characters--;
				if($result_chars_prepare[$i]['chartype'] == 'staff')	$count_staffcharacters--;
			} else {
				if($count_characters > 0) {
					$result_chars[] = array('charid' => null, 'name' => null, 'aktiviert' => null, 'chartype' => 'player');
					$count_characters--;
				} elseif ($count_staffcharacters > 0) {
					$result_chars[] = array('charid' => null, 'name' => null, 'aktiviert' => null, 'chartype' => 'staff');
					$count_characters--;
				}
			}
		}
		
		if(isset($result_chars)) $Smarty->assign('result_chars', $result_chars);
		
		if($user->can_access('testserver')) {
			$Smarty->assign('allowed_testserver', true);
		
			$result_chars_prepare = $MySQL->fetch_complete(sprintf("SELECT charid, name, aktiviert, chartype FROM server.chars WHERE accountID ='%d' AND testserver = 1 AND aktiviert != 9 ORDER BY chartype, name", $user->ID));
			$count_display = max($user->max_characters+$user->max_staffcharacters, count($result_chars_prepare));
			$count_characters = $user->max_characters;
			$count_staffcharacters = $user->max_staffcharacters;
			for($i=0;$i<$count_display;$i++) {
				if(isset($result_chars_prepare[$i])) {
					$result_chars_testserver[] = $result_chars_prepare[$i];
					if($result_chars_prepare[$i]['chartype'] == 'player') $count_characters--;
					if($result_chars_prepare[$i]['chartype'] == 'staff') $count_staffcharacters--;
				} else {
					if($count_characters > 0) {
						$result_chars_testserver[] = array('charid' => null, 'name' => null, 'aktiviert' => null, 'chartype' => 'player');
						$count_characters--;
					} elseif ($count_staffcharacters > 0) {
						$result_chars_testserver[] = array('charid' => null, 'name' => null, 'aktiviert' => null, 'chartype' => 'staff');
						$count_characters--;
					}
				}
			}

			$Smarty->assign('result_chars_testserver', $result_chars_testserver);
		}
		
		if(isset($message)) $Smarty->assign('message', $message);
		
		$page['content'] = $Smarty->fetch('chars_player.tpl');
}

$Smarty->assign( 'page', $page );
$Smarty->display( 'main.tpl' );

?>