<?php
//ini_set('display_errors', true);
// display all errors
// error_reporting( E_ALL );
assert_options(ASSERT_BAIL);

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


///////////////////////////////////////////////////// HIER AUSKOMMENTIEREN FÜR FREIGABE DER CHARERSTELLUNG ////////////////////////////////
// außerdem in chargen_step6.tpl den String >>> ({$item.her_info.herstellungsid}) <<< löschen
//if($user->rank >= 5) {
	// OK
//} else {
//	error('Die Charakterverwaltung wurde bis zur Überarbeitung deaktiviert! Sie wird rechtzeitig vor dem 16.12. wieder zur Verfügung stehen. Aurax', true);
//}
///////////////////////////////////////////////////// HIER AUSKOMMENTIEREN FÜR FREIGABE DER CHARERSTELLUNG ////////////////////////////////

//if($user->rank >= 5) Print_R($_SESSION['chargen']['fragensammlung']);

function char_shutdown() {
	$_SESSION['dirtychar'] = false;
	exit();
}

// Überprüfung, dass ein User nicht mehrere Charerstellungsthreads gleichzeitig laufen hat
if(isset($_SESSION['dirtychar']) && $_SESSION['dirtychar'] === true) {
	for($sleeper=0;$sleeper<20;$sleeper++) {
		usleep(100000);
		if($_SESSION['dirtychar'] != true) {
			break;
		}
	}
	$sql = sprintf("INSERT INTO logdb.me_errors SET typ = 69, accountID = %d, zeit = NOW(), meldung = 'Fortsetzung trotz Dirtychar'", $user->ID);
	$MySQL->query($sql);
}
ignore_user_abort(true);
// wir setzen eine shutdown-Funktion, wo wir dirtyflag auf false setzen
register_shutdown_function("char_shutdown");

$_SESSION['dirtychar'] = true;

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, accountid, chartype FROM server.chars WHERE charid = %d", intval($_REQUEST['charid'])));
		if(isset($db_char['name'])===false || $db_char['accountid'] != $user->ID) {
			// TODO: Logging Evtl. Versuch einen fremden Char zu löschen
			if($user->can_access('charadministration')===true || ($user->can_access('questcharadministration') && $db_char['chartype'] == "quest")) {
				// Administratives Löschen => weiter
				break;
			}
			
			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'] AND $db_char['chartype'] == "player") {
				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, accountid, testserver FROM server.chars WHERE charid = %d AND aktiviert != 9", intval($_REQUEST['charid'])));
		if($user->can_access('charadministration')===false || $char['accountid'] == $user->ID || ($user->can_access('charadministration') === false && $user->can_access('questcharadministration') && $db_char['chartype'] == "quest")) {
			if(isset($char['name'])===false || $char['accountid'] != $user->ID) {
				// TODO: Logging Evtl. Versuch einen fremden Char zu löschen
				error('Char existiert nicht oder geh&ouml;rt nicht dir!', true);	
			} else {
				$delid = $user->ID;
				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'] AND $db_char['chartype'] == "player") {
					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);	
				}
			}
		} else {
			if(isset($char['name'])===false) {
				error("Der Char existiert nicht (mehr)!", true);
			}
			// Check, ob die Begründung eingetragen wurde
			if(strlen($_REQUEST['reason'])<10) {
				error("Du musst eine Begründung von mindestens 10 Zeichen eingeben!", true);
			}
			$delid = $char['accountid'];
		}
		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']), $delid));
			assert($MySQL->affected_rows()==1);
			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));
			}
			$MySQL->query(sprintf("INSERT INTO logdb.me_logs SET typ = 119, accountid = %d, meldung = '%s', service = 'homepage', spezial = %d, testserver = %d", $user->ID, $char['name'], $char['charid'], $char['testserver']));
			$MySQL->query(sprintf("INSERT INTO logdb.me_logs SET typ = 118, accountid = %d, charid = %d, charname = '%s', meldung = '%s', service = 'homepage', spezial = %d, testserver = %d", $char['accountid'], $char['charid'], $char['name'], me_escape($_REQUEST['reason']), $user->ID, $char['testserver']));
			
			//$MySQL->query("COMMIT");
			
			$Smarty->assign('text', "Der Charakter '".$char['name']."' wurde erfolgreich gelöscht!");
			$page['content'] = $Smarty->fetch('blank.tpl');
			$Smarty->assign( 'page', $page );
			$Smarty->display( 'main.tpl' );
			die();
		} else error('Der Charakter wurde nicht gel&ouml;scht! Bitte &uuml;berpr&uuml;fe deine Angaben. Du musst die Checkbox auf jeden Fall anklicken und den Button betätigen (Enter reicht nicht)!', 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);
		}
		require_once('lib/char.cls.php');
		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;
		}
		
		require_once('lib/char.cls.php');
		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 = 4;
		
		// Testserver?
		if(isset($_GET['testserver']) AND $_GET['testserver']==1) {
			$_SESSION['chargen']['testserver'] = true;
		} else {
			$_SESSION['chargen']['testserver'] = false;
		}
		
		require_once('lib/char.cls.php');
		try{
			$char = new Char((int)$_REQUEST['charid'], (int)$user->ID, false, $_SESSION['chargen']['testserver']);
		} catch(IException $e) {
			// TODO
			echo $e->getNotice();
			die();
		}
		
		$char->switchToGain();
	break;
	case 'char_process':
		require_once('lib/char.cls.php');
		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
			if($_SESSION['chargen']['step']==6 && $_REQUEST['step'] == 4) {
				// Sonderbehandlung für Einkaufsrücksprung zu Statsteigern
				$_SESSION['chargen']['step']=4;
			}
			
			$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:
				// Fragesammlung holen
				$fragenprep = $MySQL->fetch_complete(sprintf("SELECT * FROM server.chargen_fragen WHERE %s_mw > 0 ORDER BY ordernr, id", $char->get('volk')));
				$fragensammlung = array();
				$order = array();
				$random = array();
				foreach($fragenprep as $item) {
					$forder[] = $item['id'];
					$anzeige = false;
					switch($item[$char->get('volk').'_mw']) {
						case 1:
							$random[] = $item['id'];
							$pflicht = true;
							$anzeige = false;
							break;
						case 2:
							$pflicht = true;
							if($char->get('mode') == 'create') { $anzeige = true; }
							break;
						case 3:
							// TODO: Prüfen!!! Im Moment gibt es nur Pflichtfragen
							$pflicht = false;
							if($char->get('mode') == 'create') { $anzeige = true; }	
							break;
						default:
							logError();
					}
					$fragensammlung[$item['id']] = array("id" => $item['id'], "frage" => $item['frage'], "antwort" => null, "pflicht" => $pflicht, "anzeige" => $anzeige);
				}
				
				if($char->get('mode') == 'create') {
					shuffle($random);
					for($i=0;$i<min(count($random), 3);$i++) {
						$fragensammlung[$random[$i]]['anzeige'] = true; 
					} 
					
				} else {
					$antwortenprep = $MySQL->fetch_complete(sprintf("SELECT * FROM server.chargen_antworten WHERE charid = %d AND version = 'current'", $char->get('charid')));
					
					foreach($antwortenprep as $fragenitem) {
							$fragensammlung[$fragenitem['id']]['anzeige'] = true;
							$fragensammlung[$fragenitem['id']]['antwort'] = $fragenitem['antwort'];
							
					}
				}
				
				$_SESSION['chargen']['fragensammlung'] = $fragensammlung;
				$_SESSION['chargen']['forder'] = $forder;
	
				
				// 1. Profession setzen
				switch($char->get('mode')) {
					case 'createedit':
					case 'edit':
						// nichts erlaubt; Profession darf nicht geändert werden
						break;
					case 'create':
						if(isset($_SESSION['chargen']['do_only_once']) === false) {
							try {
								$char->setProfession(1, (int)$_POST['profession_1'],1);
							} catch(IException $e) {
								$form_errors[] = $e->getNotice();
								break;
							}
							require_once('lib/char_shopping.cls.php');
							$shop = new CharShopping(450, $char);
							$shop->addStartitems ($char->get('volk'), $char->get('profession_1'));
							
							$char->setSuggestions(); // TODO: für Festlegung auskommentieren
							
							$_SESSION['chargen']['do_only_once'] = true;
						}
						
					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
						if($char->get('aktiviert') != 1) error("Fehler in ".__LINE__, true);
						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:
				// 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 5:
				// 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 6:
				// Shopping
				if($char->get('mode') != 'edit') {
					require_once('lib/char_shopping.cls.php');
					
					$shop = new CharShopping(450, $char);
					if($shop->msg != null) {
						$form_errors[] = $shop->msg;
					}
					
					

					if(isset($_REQUEST['s_action'])) {
						switch($_REQUEST['s_action']) {
							case 'display':
							break;
							case 'buy':
								if($_REQUEST['amount'] <= 0 ) {
									$form_errors[] = "Ung&uuml;tige Menge angegeben";
								} else {
									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'] == 'anlegen') {
									try {
										$shop->equip(intval($_REQUEST['listid']), intval($_REQUEST['herstellungsid']));
									} 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;
						}
					}

					// TODO: taucht 2x auf; bischen dirty
					$calcValues = $shop->calcGewichtVolumen();
					$diff_gewicht = 5*200*$char->get('stats', 'koerperkraft')-$calcValues['gewicht'];
					$max_volumen = 100000;
					$max_gewicht = 5*200*$char->get('stats', 'koerperkraft');
					$notw_kk = ceil($calcValues['gewicht']/(5*200));
					$Smarty->assign('calcValues', $calcValues);
					$Smarty->assign('max_volumen', $max_volumen); // maximales Volumen
					$Smarty->assign('max_gewicht', $max_gewicht);
					$Smarty->assign('diff_gewicht', $diff_gewicht);
					$Smarty->assign('notw_kk', $notw_kk);
					
					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($char->get('chartype')=='player' && (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!";
							
						}
						
						if($max_volumen - $calcValues['volumen'] < 0) {
							$form_errors[] = "Deine Gegenstände passen nicht in Deinen Rucksack!";
													}
						
						if($diff_gewicht < 0 && isset($_GET['ok']) === false) {
							$form_errors[] = "Soviel kannst du nicht tragen. Du würdest eine Körperkraft von $notw_kk benötigen. Klicke <a href=\"?action=char_process&step=4\">hier</a>, um Deine Körperkraft zu erhöhen oder verkaufe einige schwere Sachen. Wenn Du Dich später darum kümmern willst, kommst du <a href=\"?action=char_process&step=6&send_form=Weiter&ok=true\">hier</a> weiter!";
						}
						
						if(isset($form_errors) && count($form_errors) > 0) break;
						
						// check
						try {
							$shop->finishShopping();
						} catch(IException $e) {
							$form_errors[] = $e->getNotice();
						}
					}
				}
			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();
						}
						
						if($char->get('aktiviert')!=1 && $char->get('chartype')=='player') {
							foreach($_SESSION['chargen']['fragensammlung'] as $item) {								
								if(((strlen($_POST['charstory'])<750 && $char->get('volk') == 0) || strlen($_POST['charstory'])<1000 ) && $item['pflicht']===true && $item['anzeige']===true && (isset($_REQUEST['frage_'.$item['id']])===false || strlen($_REQUEST['frage_'.$item['id']])<3)) {
									$form_errors[] = "Frage nicht beantwortet: ".$_SESSION['chargen']['fragensammlung'][$item['id']]['frage'];
								}
								if($item['anzeige'] === true) {
									$_SESSION['chargen']['fragensammlung'][$item['id']]['antwort'] = $_REQUEST['frage_'.$item['id']];
								}
							}
						}
					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 && (isset($_POST['rules'])===false || $_POST['rules'] != 'checked')) {
							$form_errors[] = "Du musst die Regeln gelesen und akzeptiert haben!";
							break;
						} 
						
						if(isset($shop) === false) {
							require_once('lib/char_shopping.cls.php');
							$shop = new CharShopping(450, $char);
							if($shop->msg != null) {
								logError("critical");
							}
						}
						
						$calcValues = $shop->calcGewichtVolumen();
						$diff_gewicht = 5*200*$char->get('stats', 'koerperkraft')-$calcValues['gewicht'];
						$notw_kk = ceil($calcValues['gewicht']/(5*200));
						
						if($char->get('aktiviert') != 1) {
							if($diff_gewicht < 0 && $_POST['send_form']!='Speichern') {
								// nicht genügend KK für gewählte Gegenstände; Prüfung nur wenn zum Freischalten angemeldet werden soll
								$form_errors[] = "Du kannst nicht alle Deine Gegenstände tragen. Speichere Deinen Charakter und ändere dann die Körperkraft auf $notw_kk oder wähle andere Gegenstände!";
								break;	
							}
							if($char->get('chartype')=='player' && $shop->money > 75 && $_POST['send_form']!='Speichern'&& $diff_gewicht > 300 && $calcValues['volumen'] < 90000) {
								// hat nicht alles GEld ausgegeben
								$form_errors[] = "Du hast zu wenig von dem dir zur Verfügung stehenden Geld ausgegeben. Speichere und kaufe noch etwas, bevor Du den Charakter zur Anmeldung einreichst.";
								break;	
							}
							
									
							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:
						logError();
					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'] == 6 AND isset($_REQUEST['s_action'])) {
			// eine Shopping-Aktion
			$display_step = 6;
		} 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);
}
ignore_user_abort(false);
// wenn Verbindung abgebrochen, kann ich auch das Skript abbrechen; da die Verarbeitung vollständig ist
if(connection_aborted()) {
	die();
}


// *** DISPLAY ***
switch($action) {
	case 'delete':
		$Smarty->assign('char', $db_char);
		if($db_char['accountid'] != $user->ID && $user->can_access('charadministration')) {
			$page['content'] = $Smarty->fetch('admin_char_delete.tpl');
		} else {
			$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') {
			$title_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" );
				$voelker = array();
				for($i=0;$i<count($ergebnis);$i++) {
					$voelker = $voelker+array($ergebnis[$i]['ID'] => $ergebnis[$i]['Bezeichnung']." (".$ergebnis[$i]['Rasse'].")");
					$lvoelker[$ergebnis[$i]['ID']] = $ergebnis[$i]['Bezeichnung']." (".$ergebnis[$i]['Rasse'].")";
				}
 
				$Smarty->assign( 'geschlechter', array("m"=>"männlich", "w"=>"weiblich") );
				$Smarty->assign( 'voelker', $voelker );
				$Smarty->assign( 'lvoelker', $lvoelker );
				
				$Smarty->assign('name', getValidCharString($char, 'name'));
				$Smarty->assign('geschlecht', getValidCharString($char, 'geschlecht'));
				if(getValidCharString($char, 'volk')=='') {
					$Smarty->assign('volk', 0);
				} else {
					$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
				$professionen2 = $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 = %d ) ORDER BY Bezeichnung", $char->get('volk'), $char->get('volk')));
				
				
				
				$professionen = array(0 => "Bitte w&auml;hlen...");
				foreach($professionen2 as $pitem) {
					$professionen = $professionen + array($pitem['id'] => $pitem['bezeichnung']);
				}
				
				$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 = array('bw' => "Bitte w&auml;hlen...");
				$haare2 = $MySQL->fetch_complete(sprintf("SELECT gumpid, bezeichnung FROM server.haare WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht')));
				foreach ($haare2 as $item) {
					$haare = $haare + array($item['gumpid'] => $item['bezeichnung']);
				}
				$Smarty->assign('haare',$haare);

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

				// Hole Bärte
				$baerte = array(0 => 'kein Bart');
				$baerte2 = $MySQL->fetch_complete(sprintf("SELECT gumpid, bezeichnung FROM server.baerte WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht')));
				foreach ($baerte2 as $item) {
					$baerte = $baerte + array($item['gumpid'] => $item['bezeichnung']);
				}
				$Smarty->assign('baerte',$baerte);
				if(isset($equipped_items[16]['itemid']))
					$Smarty->assign('bart',$equipped_items[16]['itemid']);
				
				// Hole Haarfarben
				$haarfarben = array('bw' => "Bitte w&auml;hlen...");
				$haarfarben2 = $MySQL->fetch_complete(sprintf("SELECT hexfarbe, bezeichnung FROM server.haarfarben WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht')) );
				foreach ($haarfarben2 as $item) {
					$haarfarben = $haarfarben + array($item['hexfarbe'] => $item['bezeichnung']);
				}
				$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 = array('bw' => "Bitte w&auml;hlen...");
				$hautfarben2 = $MySQL->fetch_complete(sprintf("SELECT hexfarbe, bezeichnung FROM server.hautfarben WHERE %d_%s = 1 ORDER BY bezeichnung", $char->get('volk'), $char->get('geschlecht')) );
				foreach ($hautfarben2 as $item) {
					$hautfarben = $hautfarben + array($item['hexfarbe'] => $item['bezeichnung']);
				}

				$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:
				// 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];
					if($char->get('mode') != 'create' && $char->get('mode') != 'createedit') {
						$prep_stats[$i][2] = max($char->get('min_stats', $STATS[$i]), $char->get('old_stats', $STATS[$i]));
					} else {
						$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_step4.tpl');
			break;
			case 5:
				// 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];
					if($char->get('mode') != 'create' && $char->get('mode') != 'createedit') {
						$prep_skills[$i][2] = max($char->get('min_skills', $SKILLS[$i]), $char->get('old_skills', $SKILLS[$i]));
					} else {
						$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'));
				$Smarty->assign('mode', $char->get('mode'));
				$page['content'] = $Smarty->fetch('chargen_step5.tpl');
			break;
			case 6:
				// Shopping
				if(isset($shop) === false) {
					require_once('lib/char_shopping.cls.php');
					$shop = new CharShopping(450, $char);
					if($shop->msg != null) {
						logError("critical");
					}
					
					$calcValues = $shop->calcGewichtVolumen();
					$diff_gewicht = 5*200*$char->get('stats', 'koerperkraft')-$calcValues['gewicht'];
					$Smarty->assign('calcValues', $calcValues);
					$Smarty->assign('max_volumen', 100000); // maximales Volumen
					$Smarty->assign('max_gewicht', 5*200*$char->get('stats', 'koerperkraft'));
					$Smarty->assign('diff_gewicht', $diff_gewicht);
					$Smarty->assign('notw_kk', ceil($calcValues['gewicht']/(5*200)));
				}
				
				
				
				$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;
						case 'picture':
							// Bild soll angezeigt werden
							$Smarty->assign('picture', true);
						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); 
				
				$Smarty->assign('equipped_items', $char->equipped_items); 
				$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);
				$Smarty->assign('aktiviert', $char->get('aktiviert'));
				
				$Smarty->assign('fragensammlung', $_SESSION['chargen']['fragensammlung']);
				$Smarty->assign('forder', $_SESSION['chargen']['forder']);
				
				$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' );

?>
