<?php

// diese Seite stellt Orga-Funktionen für die eh1005-Seite zur Verfügung
// (Topics: ~ heißt geplant, - heißt im Bau, + heißt implementiert.)
// + diese Seite liegt im öffentlichen Serverbereich, dieser darf *.php nicht als plain/text ausliefern ;)
// + diese Seite verlangt zwingend https
// + diese Seite fragt ein Authentifikationspasswort ab
// + die Authentifikation läuft nach einer gewissen Zeitspanne (Konstante) ab
// + es dürfen von dieser Seite aus keine anderen orga-spezifischen Seiten aufgerufen werden,
//   da dies eventuell eine Umgehungsmöglichkeit der Authentifizierung zur Folge haben könnte

/*
Struktur dieser Seite:
	+ write HTTP header
	+ recall session
	+ check, defuse and shorten input variables
	+ Prüfung auf https
	 = OK => continue
	 = FAIL => Session-Zwangslogout, Abbruchmeldung und Schlußverarbeitung
	+ Prüfung auf gültigen Loginstatus, inkl. Timeout
	 = OK => continue
	 = FAIL => Authentifizierungsformular, Abbruchmeldung und Schlußverarbeitung
	+ Prüfung auf Wartungsstatus
	 = OK => continue
	 = FAIL => Abbruchmeldung und Schlußverarbeitung
	+ Login
	 = OK => continue
	 = FAIL => Authentifizierungsformular, Abbruchmeldung und Schlußverarbeitung
	+ Verarbeitung der Submit-Aktionen (POST), Anzeige der einzelnen Orga-Formulare
*/


/*
known bugs / todo
  
	- Script rennt in einen Loop-of-Death, wenn man auf einen Button klickt, während die Seite (z.B. wegen dem Fahrplan-Editor) noch nicht fertig aufgebaut war
	 -> Session hängt sich auf.
    
	Dieses Problem taucht auf webtest.hamburg.ccc.de auf, ist aber lokal (auf Rainers Notebook) nicht reproduzierbar.
	 -> php-Version oder "nur" Config-Problem? (deadlock-timeout?)
*/

// this script needs following additional server modules for PHP
// - Database: (e.g. pgsql)

// write HTTP header (anti-cache)
header('Expires: Sun,	31 Dec 1989	23:59:59 GMT');
header('Last-Modified: ' . gmdate('D,	d	M	Y	H:i:s')	.	'	GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0');
header('Pragma:	no-cache');

// recall session
session_cache_limiter('nocache');
session_cache_expire(1);
session_start();

//deactivate automatic use of addslashes
set_magic_quotes_runtime(0);

// include library files
// ja genau, die ist hier jetzt auch direkt aus dem htdocs abrufbar;
// ist aber egal, denn da steht nix kritisches drin und die Seite ist auch rein passiv
require( "clsdb.php" );

// define general server constants
define( "SERVER_SITE_MAINTENANCE", false );               // maintenance state, set to TRUE to lock this page temporarily
define( "SERVER_LOCALHOST_IP", "127.0.0.1" );             // localhost IP, which does not need authentication
define( "SERVER_PROTOCOL_HTTPS", "HTTPS" );               // HTTPS protocol name

// define server file constants
define( "SERVER_FILE_TEMPLATE", "template.shtml" );       // template file
define( "SERVER_FILE_WORKSHOPS", "workshops.shtml" );     // workshops file
define( "SERVER_FILE_FAHRPLAN", "fahrplan.shtml" );       // fahrplan file
define( "SERVER_FILE_HEADER", "ssi_site_header.html" );   // SSI file for site header
define( "SERVER_FILE_INTRO", "ssi_site_intro.html" );     // SSI file for site intro
define( "SERVER_FILE_EXTRO", "ssi_site_extro.html" );     // SSI file for site extro
define( "SERVER_FILE_AUTOGEN", "ssi_site_autogen.html" ); // SSI file for site autogeneration warning

define( "SERVER_FILE_ANMELDUNGSLISTE", "anmeldung-data/anmeldung.csv" ); // path and file for registered participants

// define server file constants
define( "ORGA_DAYS_BREAKFAST", 3 ); // path and file for registered participants

// define display constants
define( "DISPLAY_TEXT_NONE", " " );
define( "DISPLAY_VALUE_SEPARATOR", chr(9));

// define auth constants
define( "AUTH_TIMEOUT_MINUTES", 20 );                     // idle timeout for login session
define( "AUTH_SERVER_PASS", "?!?!BunnY2007!?!" );     // login password, [todo:] should be outsourced to an external, secured data file

// define constants for database data
define( "DB_ID_NONE", 0 );
define( "DB_ID_NEW", -1 );

$dbsmain = new clsdb;
// define constants for database access
// define db type as supported type
$dbsmain->setdbtype( clsdb::DB_TYPE_MYSQL );
$dbsmain->setdbhost( 'localhost' );
$dbsmain->setdbport( 3306 );
$dbsmain->setdbname( 'eh2007' );
$dbsmain->setdbuser( 'eh2007' );
$dbsmain->setdbpass( 'Osterhase2007' );

// init references to $_SESSION variables ($sxxx)
$sbolauthloggedin = & $_SESSION['bolauthloginok'];
$sintauthprevtime = & $_SESSION['intauthprevtime'];

// init session variables
if ( !isset($sbolauthloggedin) ) $sbolauthloggedin = false;
if ( !isset($sintauthprevtime) ) $sintauthprevtime = time();

// init references to $_POST variables ($pxxx)
$pstrauth = & $_POST['txtauth'];
$pbollogin = & $_POST['cmdlogin'];
$pbollogout = & $_POST['cmdlogout'];
$pbolshowanmeldungen = & $_POST['cmdshowanmeldungen'];
$pbolshowkassenliste = & $_POST['cmdshowkassenliste'];
$pbolmakeworkshops = & $_POST['cmdmakeworkshops'];
$pbolmakefahrplan = & $_POST['cmdmakefahrplan'];
$pbolrunsql = & $_POST['cmdrunsql'];
$pbolwsupdate = & $_POST['cmdwsupdate'];
$pbolsdactivate = & $_POST['cmdsdactivate'];
$pbolsdupdate = & $_POST['cmdsdupdate'];
$plstschedule = & $_POST['cboschedule'];

$pintwsid = & $_POST['txtwsid'];
if ( !isset( $pintwsid ) ) { $pintwsid = & $_POST['cboworkshop']; }
$pstrwsname = & $_POST['txtwsname'];
$pstrwsspeakers = & $_POST['txtwsspeakers'];
$pintwsduration = & $_POST['txtwsduration'];
$pstrwscontent = & $_POST['txtwscontent'];
$pstrwscomment = & $_POST['txtwscomment'];
//$pstrsql = & $_POST['txtsql'];
$pstrsql = stripslashes( & $_POST['txtsql'] );

// init post variables (only for mandatory variables, ignore variables submitted by special forms!)
if ( !isset($pstrauth) ) $pstrauth = '';
if ( !isset($pintwsid) ) $pintwsid = constant("DB_ID_NONE");
if ( !isset($pstrwsname) ) $pstrwsname = '';
if ( !isset($pstrwsspeakers) ) $pstrwsspeakers = '';
if ( !isset($pintwsduration) ) $pintwsduration = 0;
if ( !isset($pstrwscontent) ) $pstrwscontent = '';
if ( !isset($pstrwscomment) ) $pstrwscomment = '';
if ( !isset($pstrsql) ) $pstrsql = '';
if ( !isset($plstschedule) ) $plstschedule = array();

// init instance variables
$intnow = time();

$strmsg = '';                     // (status/error/etc.) message to user
$bolauthabort = false;            // auth check will be aborted: show authentication page
$bolauthlogoutnow = false;        // user will be logged out

$strdbfields = array();
$strdbsql = '';
$strdbsql2 = '';
$strdbrow = '';

$strweekdayname = array (1 => 'Sonntag',
                         2 => 'Montag',
                         3 => 'Dienstag',
                         4 => 'Mittwoch',
                         5 => 'Donnerstag',
                         6 => 'Freitag',
                         7 => 'Samstag');

$strvalue = '';
$intindex = 0;
$intcolrotate = 1;
$strinput = '';
$stroutput = '';
$intfileid = 0;
$intcount = 0;

$strauth = '';
$bollogin = false;
$bollogout = false;
$bolshowanmeldungen = false;
$bolshowkassenliste = false;
$bolmakefahrplan = false;
$bolmakeworkshops = false;
$bolrunsql = false;
$bolwsupdate = false;
$bolsdactivate = false;
$bolsdupdate = false;

$strtablehead = '';
$intcolrot = 0;
$intsdyear = 0;
$intsdmonth = 0;
$intsdday = 0;
$intsdhour = 0;
$strroname = '';
$boleof = false;
$strworkshoplist = '';
$intwsid = constant("DB_ID_NONE");
$strwsname = '';
$strwsspeakers = '';
$intwsduration = 0;
$strwscontent = '';
$strwscomment = '';
$strsql= '';
$strdbfields = '';
$lstschedule = array();
$strscheduleindex = '';
$intscheduleindex = constant("DB_ID_NONE");
$intschedulevalue = constant("DB_ID_NONE");

$bolok = false;                   // action feedback, triggers confirmation if true or warning if false

// function library

function addmsg ($straddmsg)
{
   // adds $straddmsg to $strmsg
   global $strmsg;
   if ( $straddmsg != '' )
   {
      $strmsg = $strmsg . '<li>' . $straddmsg . '</li>';
   }
}

function showmsg ()
{
   // shows messages in $strmsg if available
   global $strmsg, $bolok;
   if ( $strmsg != '' )
   {
      echo'
      <div class="announcement">
         <h1 class="';
         if ( $bolok )
         {
            echo 'confirmation';
         }
         else
         {
         echo 'warning';
         }
         echo '">Feedback</h1>
         <ul>' . $strmsg . '</ul>
      </div>';
      $strmsg = '';
      $bolok = false;
   }
}

function selectws ( $intwsid )
{
   // selects workshop with $intwsid of $strworkshoplist
   global $strworkshoplist;
   return str_replace( 
   '<option value="' . $intwsid . '">',
   '<option value="' . $intwsid . '" selected="selected">',
   $strworkshoplist );
}

// check input variables
//$bollogin = isset( $pbollogin ); // does not work in IE when submitted from within a text field by pressing Return key, reason unknown
$bollogin = ( isset( $pbollogin ) || $pstrauth != '' );  //workaround for IE problem, see line above
$bollogout = ( isset( $pbollogout ) || $bollogin ); //also fire a logout before (re-)login
$bolshowanmeldungen = ( isset( $pbolshowanmeldungen ) );
$bolshowkassenliste = ( isset( $pbolshowkassenliste ) );
$bolmakefahrplan = ( isset( $pbolmakefahrplan ) );
$bolmakeworkshops = ( isset( $pbolmakeworkshops ) );
$bolrunsql = ( isset( $pbolrunsql ) );
$bolwsupdate = ( isset( $pbolwsupdate ) );
$bolsdactivate = ( isset( $pbolsdactivate ) );
$bolsdupdate = ( isset( $pbolsdupdate ) );

$intwsid = $pintwsid;
$strwsname = $pstrwsname;
$strwsspeakers = $pstrwsspeakers;
$intwsduration = $pintwsduration;
$strwscontent = $pstrwscontent;
$strwscomment = $pstrwscomment;
$strsql = $pstrsql;

// todo: check control lists for invalid values!
$lstschedule = $plstschedule;

// defuse input variables
$strauth = trim( htmlentities( $pstrauth, ENT_QUOTES ));
$intwsid = intval( $intwsid );
$strwsname = trim( htmlentities( $strwsname, ENT_QUOTES ));
$strwsspeakers = trim( htmlentities( $strwsspeakers, ENT_QUOTES ));
$intwsduration = intval( $intwsduration );
$strwscontent = trim( htmlentities( $strwscontent, ENT_QUOTES ));
$strwscomment = trim( htmlentities( $strwscomment, ENT_QUOTES ));
$strsql = trim( htmlentities( $strsql, ENT_QUOTES ));

// shorten input variables
if ( strlen( $strauth ) > 255 ) $strauth = substr( $strauth, 0, 255 ); //cut it, do not modify
if ( strlen( $strwsname ) > 255 ) $strwsname = substr( $strwsname, 0, 252 ) . "...";
if ( strlen( $strwsspeakers ) > 255 ) $strwsspeakers = substr( $strwsspeakers, 0, 252 ) . "...";
if ( strlen( $strwscontent ) > 4095 ) $strwscontent = substr( $strwscontent, 0, 4092 ) . "...";
if ( strlen( $strwscomment ) > 4095 ) $strwscomment = substr( $strwscomment, 0, 4092 ) . "...";
if ( strlen( $strsql ) > 4095 ) $strsql = substr( $strsql, 0, 4095 ); //cut it, do not modify


if
(
   // localhost access
   (
      // direkter Aufruf von localhost
      htmlspecialchars( $_SERVER['HTTP_X_FORWARDED_FOR'], ENT_QUOTES ) == ''
      &&
      htmlspecialchars( $_SERVER['REMOTE_ADDR'], ENT_QUOTES ) == constant("SERVER_LOCALHOST_IP")
   )
  ||
   (
      // indirekter Aufruf (z.B. transparenter SSL-Proxy) mit übergebenem localhost
      htmlspecialchars( $_SERVER['HTTP_X_FORWARDED_FOR'], ENT_QUOTES ) == constant("SERVER_LOCALHOST_IP")
   )
)
{
   // localhost ist immer eingeloggt
   $sbolauthloggedin = true;
}
else
{
   // check protocol and timeout
   // check secure connection
   // possible results:
   // - secure => continue
   // - insecure => force logout ($bolauthlogoutnow), show error page and prepare message ($strmsg)
   if
   (
      (
         // direct connection without HTTPS
         $_SERVER['HTTPS'] == ''
         &&
         $_SERVER['HTTP_X_FORWARDED_PROTO'] == ''
      )
      ||
      (
         // indirect connection without local HTTPS proxy, e.g. orenosp
         strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) != strtolower(constant("SERVER_PROTOCOL_HTTPS"))
         && $_SERVER['HTTP_X_FORWARDED_PROTO'] != ''
      )
   )
   {
      // insecure connection -> abort
      if ( !$bolauthlogoutnow && $sbolauthloggedin )
      {
         // active login over insecure connection -> force logout
         $bolauthlogoutnow = true;
         addmsg ( 'Du wirst ausgeloggt, da Deine Verbindung unsicher (unverschlüsselt) geworden ist.' );
      }
      addmsg ( '<a href="https://' . $_SERVER['HTTP_HOST'] . $_SERVER["PHP_SELF"] . '">Dein Verbindungsprotokoll ist HTTP. Bitte verwende für die Orga-Seite Verschlüsselung mittels HTTPS.</a>' );
      $bolauthabort = true;
   }


   // check auth timeout
   // possible results:
   // - auth active => continue
   // - auth timeout => force logout ($bolauthlogoutnow), prepare message ($strmsg) and continue

   if ( $sbolauthloggedin && !$bolauthlogoutnow && ( $intnow > ( $sintauthprevtime + 60 * constant("AUTH_TIMEOUT_MINUTES") )))
      {
         // write message on user authentication expired -> also fire a logout ($bolauthlogoutnow)
         // echo '<div class="warning">Du wurdest ausgeloggt wegen mehr als ' . constant("AUTH_TIMEOUT_MINUTES") . ' Minuten Inaktivit&auml;t.</div><br>';
         $bolauthlogoutnow = true;
         addmsg ( 'Du wirst ausgeloggt wegen mehr als ' . constant("AUTH_TIMEOUT_MINUTES") . ' Minuten Inaktivit&auml;t.' );
      }
   // restart timeout
   $sintauthprevtime = $intnow;
}

if ( $bolauthlogoutnow || $bollogout )
{
   // logout
   if ( $bolauthlogoutnow )
   {
      addmsg ( 'Du wurdest automatisch ausgeloggt. Bitte gegebenenfalls erneut einloggen.' );
   }
   $sbolauthloggedin = false;
}

// check maintenance state
if ( constant("SERVER_SITE_MAINTENANCE") )
{
   // cancel because of maintenance
   addmsg ( 'Die Orga-Seite ist zurzeit wegen Wartungsarbeiten deaktiviert. Bitte sp&auml;ter wiederkommen. Danke.' );
   $bolauthabort = true;
}

// Well, Checkpoint.
// Now a defined and normal state of checking has been reached.
// Possible states are now:
// - $sbolauthloggedin = true: user has successfully authenticated and is still logged in
// - $sbolauthloggedin = false: user is either not (yet) authenticated or authentication has been expired
// If there were any messages on the way up to here, they are stored as list items (<li>) in variable $strmsg.


// check auth phrase if user tries to login
if ( !$bolauthabort && $bollogin && $strauth > '' )
{
   if ( $strauth == constant("AUTH_SERVER_PASS") )
   {
      // login accepted
      $sbolauthloggedin = true;
   }
   else
   {
      // login failed
      $sbolauthloggedin = false;
      addmsg ( 'Das klappt so nicht. Vermutlich hast Du Dich vertippt.' );
   }
}

// prepare orga page
// assume that all ssi files are there. No, I won't check _that_ explicitely.
// If they ain't there, the user gets a partial page. ...so what? ;o)

readfile( constant("SERVER_FILE_HEADER") );
echo'
<!-- begin of specific page header -->
   <title>Easterhegg 2007 - Orga</title>
<!-- end of specific page header -->';

readfile( constant("SERVER_FILE_INTRO") );
echo'
<!-- begin of specific page content -->
';

echo
'
    <div id="main">
    
      <h1>interne Orga</h1>

';

// show msg, if available
if ( $strmsg != '' )
{
   echo'
   <div class="announcement">
      <h1 class="warning">Authentifizierungshinweis:</h1>
      <ul>' . $strmsg . '</ul>
   </div>';
   $strmsg = '';
}

if ( !$sbolauthloggedin )
{
   // show authentication page and then die

   if ( !$bolauthabort )
   {
      // show login form
      echo'
      <div class="chapter">
         <h1>*knock-knock*</h1>
         <form id="loginform" name="loginform" action="' . $_SERVER["PHP_SELF"] . '" method="post">
            <input name="txtauth" type="password">
            <input name="cmdlogin" type="submit" value="Lass mich rein!">
         </form>
      </div>';
  }

// close page and stoprun.
echo'
  
<!-- end of specific page content -->

';
readfile( constant("SERVER_FILE_EXTRO") );

die();
}

// Well, Checkpoint.
// Now the user is proofed to be successfully logged in. (All others are wiped out.)
// From here on the user is authorized to enjoy all the following features.
// default sequence within each chapter:
// 1. headline
// 2. submit action
// 3. showmsg();
// 4. user forms
// 5. showmsg();
// 6. five empty rows to separate from next chapter ;)

// show logout chapter
echo'
<div class="chapter">
   <h1>Logout</h1>
</div>';
showmsg();
echo '
<div>
   <form id="logoutform" name="logoutform" action="' . $_SERVER["PHP_SELF"] . '" method="post">
      <p>
         <input name="cmdlogout" type="submit" value="Habe fertig!" />
      </p>
   </form>
</div>';
showmsg();


// show anmeldungen
echo'
<a name="anmeldungen"></a>
<div class="chapter">
	<h1>Anmeldungen anzeigen</h1>
  <form	id="showanmeldungenform" name="showanmeldungen" action="' . $_SERVER["PHP_SELF"] . '#anmeldungen" method="post">
	  <p>
	     <input name="cmdshowanmeldungen" type="submit" value="Anmeldungen anzeigen" />
	  </p>
  </form>
</div>';

if ( $bolshowanmeldungen )
{
  // Anmeldungen anzeigen
  // hmm, das hier musste jetzt mal schnell gehen, schöner oder gar effizienter Code ist das natürlich absolut nicht ;-)
  
  $strinput = file_get_contents( constant("SERVER_FILE_ANMELDUNGSLISTE") );
  $strinput = htmlentities( $strinput, ENT_QUOTES );
  $strinput = str_replace( chr(13), '', $strinput );
  $strinput = str_replace( chr(10), '</td></tr><tr><td class="db">', $strinput );
  $strinput = str_replace( chr(9), '</td><td class="db">', $strinput );
  $stroutput = '<table><tr class="dbhead"><td class="db">' . $strinput . '</td></tr></table>';
  $stroutput = str_replace( '<tr><td class="db"></td></tr>', '', $stroutput );
	
  $strinput = file( constant("SERVER_FILE_ANMELDUNGSLISTE") );

  $intsumanmeldungen = 0;
  $intsumeinnahmen = 0;
	$intsumwurst = 0;
	$intsumkaese = 0;
	$intsummarmelade = 0;
	$intsumobst = 0;
	$intsummuesli = 0;
	$eintritt = array( 'Normal' => 50, 'Mitglied' => 35, 'Engel' => 25, 'Ermaeszigt' => 25 );
	foreach ($strinput as $intlinenum => $strline) {
	  if ( $intlinenum != 0 && strlen( $strline ) > 0)
	  {
	  	list($strnick, $strstatus, $stremail, $intwurst, $intkaese, $intmarmelade, $intobst, $intmuesli, $strtimestamp) = explode(chr(9), $strline);

	    $intsumanmeldungen = $intsumanmeldungen + 1;
	    $intsumeinnahmen = $intsumeinnahmen + $eintritt[$strstatus];
	    
	  	$intsumwurst = $intsumwurst + $intwurst;
	  	$intsumkaese = $intsumkaese + $intkaese;
	  	$intsummarmelade = $intsummarmelade + $intmarmelade;
	  	$intsumobst = $intsumobst + $intobst;
	  	$intsummuesli = $intsummuesli + $intmuesli;
		}
	}

  echo '<div class="box">';
	echo '<span class="topic">nach Status:</span>';
	echo '<span class="line">Normal: ' . substr_count( $stroutput, '>Normal<' ) . '</span>';
	echo '<span class="line">Mitglieder: ' . substr_count( $stroutput, '>Mitglied<' ) . '</span>';
	echo '<span class="line">Engel: ' . substr_count( $stroutput, '>Engel<' ) . '</span>';
	echo '<span class="line">Erm&auml;&szlig;igt: ' . substr_count( $stroutput, '>Ermaeszigt<' ) . '</span>';
	echo '<hr />';
	echo '<span class="line important">Gesamt: ' . $intsumanmeldungen . '</span>';
	echo '<span class="line important">Einnahmen: ' . $intsumeinnahmen . ' Euro</span>';
  echo '</div>';

  echo '<div class="box">';
	echo '<span class="topic">nach Futter: pro Tag (' . constant("ORGA_DAYS_BREAKFAST") . ' Tage)</span>';
	echo '<span class="line">Wurst: ' . $intsumwurst . ' (' . ( constant("ORGA_DAYS_BREAKFAST") * $intsumwurst ) . ')' . '</span>';
	echo '<span class="line">K&auml;se: ' . $intsumkaese . ' (' . ( constant("ORGA_DAYS_BREAKFAST") * $intsumkaese ) . ')' . '</span>';
	echo '<span class="line">Marmelade: ' . $intsummarmelade . ' (' . ( constant("ORGA_DAYS_BREAKFAST") * $intsummarmelade ) . ')' . '</span>';
	echo '<span class="line">Obst: ' . $intsumobst . ' (' . ( constant("ORGA_DAYS_BREAKFAST") * $intsumobst ) . ')' . '</span>';
	echo '<span class="line">M&uuml;sli: ' . $intsummuesli . ' (' . ( constant("ORGA_DAYS_BREAKFAST") * $intsummuesli ) . ')' . '</span>';
	echo '<hr />';
	echo '<span class="line important">Brötchen gesamt: ' . ( $intsumwurst + $intsumkaese + $intsummarmelade ) . ' (' . ( 4 * ( $intsumwurst + $intsumkaese + $intsummarmelade ) ) . ')' . '</span>';
  echo '</div>';

  echo '<div class="box">' . $stroutput . '</div>';
	
}
showmsg();


// show kassenliste
echo'
<a name="kassenliste"></a>
<div class="chapter">
	<h1>Kassenliste anzeigen</h1>
  <form	id="showkassenlisteform" name="showkassenliste" action="' . $_SERVER["PHP_SELF"] . '#kassenliste" method="post">
	  <p>
	     <input name="cmdshowkassenliste" type="submit" value="Kassenliste anzeigen" />
	  </p>
  </form>
</div>';

if ( $bolshowkassenliste )
{
  // Kassenliste anzeigen
  // hmm, das hier musste jetzt mal schnell gehen, schöner oder gar effizienter Code ist das natürlich absolut nicht ;-)
  
  $strinput = file( constant("SERVER_FILE_ANMELDUNGSLISTE") );
  natcasesort ( $strinput );

	$eintritt = array( 'Normal' => 50, 'Mitglied' => 35, 'Engel' => 25, 'Ermaeszigt' => 25 );
	$stroutput = '';
	foreach ($strinput as $intlinenum => $strline)
	{
	  if ( $intlinenum != 0 && strlen( $strline ) > 0)
	  {
	  	list($strnick, $strstatus, $stremail, $intwurst, $intkaese, $intmarmelade, $intobst, $intmuesli, $strtimestamp) = explode(chr(9), $strline);

	  	$strnick = htmlentities( $strnick, ENT_QUOTES );

  		$stroutput = $stroutput . chr(13) . '<tr><td class="db">' . $strstatus . ' &nbsp;</td><td class="db ';
			switch ( $strstatus )
			{
				case 'Ermaeszigt':
				case 'Engel':
				    $stroutput = $stroutput . 'left';
				    break;
				case 'Mitglied':
				    $stroutput = $stroutput . 'center';
				    break;
				case 'Normal':
				    $stroutput = $stroutput . 'right';
				    break;
			}
			$stroutput = $stroutput . '">' . $eintritt[$strstatus] . '</td><td class="db">' . $strnick . '</td></tr>';
		}
	}
	$stroutput = '<table><tr class="dbhead"><td class="db">Status</td><td class="db">Eintritt</td><td class="db">Nick</td>' . $stroutput . '</table>';
	
  echo '<div class="box">' . $stroutput . '</div>';
	
}
showmsg();


/* ignore this for 2007

// show make workshops chapter
echo'
<div class="chapter">
   <h1>make install Workshops</h1>
</div>';

if ( $bolmakeworkshops )
{
   //make workshops

   $bolok = false;

   $stroutput = '';

   // read workshops
   $strdbsql = " select ws_id, ws_name, ws_speakers, ws_content" .
               " from tbl_workshops ws" .
               " order by ws_name";
   addmsg ( 'Running SQL: ' . $strdbsql );
   if ( $dbsmain->runsql( $strdbsql ) )
   {
      if ( $dbsmain->getdbrowcount() > 0 )
      {
         // workshops found
         // -> use them

         while ( $dbsmain->getdbrow ( $strdbrow ))
         {
            // for each workshop:
            $stroutput = $stroutput .'
            <p>
               <a id="ws' . $strdbrow['ws_id'] .  '" class="linktarget">&nbsp;</a>
               <h1>' . $strdbrow['ws_name'] . '</h1>
               <p>
                  <span class="topic">' . $strdbrow['ws_speakers'] . '</span>
               </p>
               <p>
                  ' . html_entity_decode( $strdbrow['ws_content'], ENT_QUOTES ) . '
               </p>
            </p>';
         }
         // don't allow to finish properly until finished developing!
         $bolok = true;
      }
      else
      {
         // no workshops found
         // -> hmm, that should not happen, but even then there should be no data anyway...
      }
   }
   else
   {
      // error accessing database
      addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Abfrage der Workshops verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
   }
   if ( $bolok )
   {
      // operation has succeeded -> now generate workshop file

      $stroutput = '
      <div id="main">
	<h1>Workshops</h1>
         Stand: ' . date( "d.m.Y H:i:s", $intnow ) . '
      
      <div>
         ' . $stroutput . '
      </div>
   </div>';

      // add autogeneration-warning
      $stroutput = file_get_contents( constant("SERVER_FILE_AUTOGEN") ) . $stroutput;
      $strinput = file_get_contents( constant("SERVER_FILE_TEMPLATE") );
      $strinput = str_replace( "[%title%]", "Workshops", $strinput );
      $stroutput = str_replace( "[%content%]", $stroutput, $strinput );

      if ( is_writable( constant("SERVER_FILE_WORKSHOPS") ))
      {
         file_put_contents( constant("SERVER_FILE_WORKSHOPS"), $stroutput );
         // file_put_contents does not work with PHP 4.x, so use instead: fopen, fwrite, fclose
         //$intfileid = fopen( constant("SERVER_FILE_WORKSHOPS"), "w" );
         //fwrite( $intfileid, $stroutput );
         //fclose( $intfileid );
         $bolok = true;
      }
      else
      {
         addmsg ( 'Die Workshopdatei &quot;' . constant("SERVER_FILE_WORKSHOPS") . '&quot; konnte nicht geschrieben werden. (Rechteproblem?)');
         $bolok = false;
      }
   }

   // write result
   if ( $bolok )
   {
      addmsg ( 'Die Workshopdatei wurde erfolgreich aktualisiert.' );
   }
   else
   {
      addmsg ( 'Die Workshopdatei wurde nicht aktualisiert.' );
   }
}
showmsg();

echo'
<div>
   <form id="makeworkshopsform" name="makeworkshopsform" action="' . $_SERVER["PHP_SELF"] . '" method="post">
      <p>Hier wird die (statische) Workshopseite auf Basis der aktuellen Datenbank neu erstellt. <br />Achtung: Die alte Workshopseite wird dabei unwiderruflich überschrieben!</p>
      <p>
         <input name="cmdmakeworkshops" type="submit" value="Workshopdatei jetzt erstellen!" />
      </p>
   </form>
</div>';
showmsg();

// show make fahrplan chapter
echo'
<div class="chapter">
   <h1>make install Fahrplan</h1>
</div>';

if ( $bolmakefahrplan )
{
   //make fahrplan

   $bolok = false;
   $stroutput = '';

   // prepare table  header with room names
   // read rooms
   $strdbsql = " select ro_name" .
               " from tbl_rooms ro" .
               " order by ro_schedpos";
   addmsg ( 'Running SQL: ' . $strdbsql );
   if ( $dbsmain->runsql( $strdbsql ) )
   {
      if ( $dbsmain->getdbrowcount() > 0 )
      {
         // rooms found
         // -> use them

         $strtablehead = '';

         while ( $dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_NEXT ))
         {
            // for each room:
            $strtablehead = $strtablehead .'
               <td class="db">' . $strdbrow['ro_name'] . '</td>';
         }
         $bolok = true;
      }
      else
      {
         // no rooms found
         // -> hmm, that should not happen, but even then there should be no data anyway...
      }
   }
   else
   {
      // error accessing database
      addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Abfrage der Raumliste verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
   }
   if ( $bolok )
  {
     // read schedule slots with workshops
     $strdbsql = " select extract(hour from sd_begintime) as sd_begintime_hour, extract(day from sd_begintime) as sd_begintime_day," .
                 " extract(month from sd_begintime) as sd_begintime_month, extract(year from sd_begintime) as sd_begintime_year," .
                 " DAYOFWEEK(sd_begintime) as sd_begintime_weekday, sd_begintime," .
                 " ws_id, ws_name, ws_speakers,".
                 " ro_name" .
                 " from tbl_schedule sd" .
                 " left join tbl_workshops ws on sd.sd_ws_id = ws.ws_id" .
                 " left join tbl_rooms ro on sd.sd_ro_id = ro.ro_id" .
                 " order by sd_begintime, ro_schedpos";
      addmsg ( 'Running SQL: ' . $strdbsql );
      if ( $dbsmain->runsql( $strdbsql ) )
      {
         if ( $dbsmain->getdbrowcount() > 0 )
         {
            // scheduled events found
            // -> use them

            // es folgt: Gruppenwechsel über Tag, Timeslot, Raum, Schedule-Event

            // Gesamtvorlauf
            $intsdyear = 0;
            $intsdmonth = 0;
            $intsdday = 0;
            $intsdhour = 0;
            $strroname = '';
            $boleof = false;

            $boleof = !$dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_NEXT );

            while ( !$boleof )
            {
               // Gruppenvorlauf Tag
               $intsdyear = $strdbrow['sd_begintime_year'];
               $intsdmonth = $strdbrow['sd_begintime_month'];
               $intsdday = $strdbrow['sd_begintime_day'];
               // neue Tabelle initialisieren
               $intcolrot = 1;
               $stroutput = $stroutput .'
               <div class="chapter">
                  <table class="db">
                     <tr class="dbhead">
                        <td class="db" width="10%">
                           ' . $strweekdayname[ $strdbrow['sd_begintime_weekday'] ] . '<br />
                           ' . $intsdday . '.' . $intsdmonth . '.
                        </td>';
                        $stroutput = $stroutput . $strtablehead;
                        $stroutput = $stroutput .'
                     </tr>';
		     while
                     (
                        !$boleof
                        &&
                        (
                           $intsdyear == $strdbrow['sd_begintime_year']
                           &&
                           $intsdmonth == $strdbrow['sd_begintime_month']
                           &&
                           $intsdday == $strdbrow['sd_begintime_day']
                        )
                     ) 
                     {
                        // Gruppenvorlauf Timeslot
                        $intsdhour = $strdbrow['sd_begintime_hour'];
                        // neue Tabellenzeile initialisieren
                        $intcolrot = abs( $intcolrot - 1 );
                        $stroutput = $stroutput .'
                        <tr class="db' . $intcolrot . '">
                           <td class="db" width="10%">' . $intsdhour.'
                              <span class="small">:00</span>
                           </td>';
		           while
                           (
                              !$boleof
                              &&
                              (
                                 $intsdyear == $strdbrow['sd_begintime_year']
                                 &&
                                 $intsdmonth == $strdbrow['sd_begintime_month']
                                 &&
                                 $intsdday == $strdbrow['sd_begintime_day']
                              )
                              &&
                              (
                                 $intsdhour == $strdbrow['sd_begintime_hour']
                              )
                           )
                           {
                              // Gruppenvorlauf Schedule-Event
                              $strroname = $strdbrow['ro_name'];
                              // neue Tabellenzelle initialisieren
                              $stroutput = $stroutput .'
                              <td class="db" width="10%">';
                                 while
                                 (
                                    !$boleof
                                    &&
                                    (
                                       $intsdyear == $strdbrow['sd_begintime_year']
                                       &&
                                       $intsdmonth == $strdbrow['sd_begintime_month']
                                       &&
                                       $intsdday == $strdbrow['sd_begintime_day']
                                    )
                                    &&
                                    (
                                       $intsdhour == $strdbrow['sd_begintime_hour']
                                    )
                                    &&
                                    (
                                       $strroname == $strdbrow['ro_name']
                                    )
                                 )
                                 {
                                    // Datensatz (Schedule-Event) verarbeiten
                                    if ( $strdbrow['ws_name'] > '')
                                    {
                                       $stroutput = $stroutput . '<a class="db" href="' . constant("SERVER_FILE_WORKSHOPS") . '#ws' . $strdbrow['ws_id'] . '">' . $strdbrow['ws_name'];
                                       if ( $strdbrow['ws_speakers'] > '')
                                       {
                                          $stroutput = $stroutput . '<span class="line small"> (' . $strdbrow['ws_speakers'] . ')</span>';
                                       }
                                       $stroutput = $stroutput . '</a>';
                                    }

                                    // neuen Datensatz lesen
                                    $boleof = !$dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_NEXT );
                                 }
                                 // Gruppennachlauf Schedule-Event
                                 // Tabellenzelle finalisieren
                                 $stroutput = $stroutput .'
                                 </td>';
                              }
                              // Gruppennachlauf Timeslot
                              // Tabellenzeile finalisieren
                              $stroutput = $stroutput .'
	                      </tr>';
	                   }
                          // Gruppennachlauf Tag
                          // Tabelle finalisieren
                          $stroutput = $stroutput .'
                          </table>
                       </div>';
                    }
                    // Gesamtnachlauf
                    // Gesamtausgabe finalisieren
                    addmsg ( 'Die Fahrplandaten wurden erfolgreich zusammengestellt. Die Fahrplandatei kann jetzt geschrieben werden.' );
                    $bolok = true;
                 }
                 else
                 {
                    // no scheduled events found
                    // -> hmm, that should not happen, but even then there should be no data anyway...
                 }
              }
              else
              {
                 // error accessing database
                 addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Abfrage des Fahrplans verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
              }
           }
           if ( $bolok )
           {
              // operation has succeeded -> now generate schedule file
              $stroutput = '
              
              <div id="main">
                 <h1>Fahrplan</h1>
                 Stand: ' . date( "d.m.Y H:i:s", $intnow ) . '
              
              
              ' . $stroutput .
    '
              <div class="chapter">
                 <h1>feste Einrichtungen</h1>
                 <p>
                    <span class="topic">Orga / Projektleitung:</span>
                    Büro (EG) bei Work4
                 </p>

                 <p>
                    <span class="topic">Infrastruktur:</span>
                    NOC (OG), POC (OG)
                 </p>
                 <p>
                    <span class="topic">CERT (Rot-Kreuz):</span>
                    Flur (OG) vor dem Heimatmuseum
                 </p>
                 <p>
                    <span class="topic">CAcert</a>:</span>
                    Bei den Funkamateuren
                 </p>
                 <p>
                    <span class="topic">Funk-Amateure:</span>
                    Work3 (OG), hinter der Werkstatt (Freifunker)
                 </p>
                 <p>
                    <span class="topic">Freifunker:</span>
                    Werkstatt (OG)
                 </p>
                 <p>
                    <span class="topic">Fest- und Flüssignahrung:</span>
                    Cafe, vorderer Teil (EG)
                 </p>
              </div>
            </div>';

              // add autogeneration-warning
              $stroutput = file_get_contents( constant("SERVER_FILE_AUTOGEN") ) . $stroutput;
              $strinput = file_get_contents( constant("SERVER_FILE_TEMPLATE") );
              $strinput = str_replace( "[%title%]", "Fahrplan", $strinput );
              $stroutput = str_replace( "[%content%]", $stroutput, $strinput );
	
              if ( is_writable( constant("SERVER_FILE_FAHRPLAN") ))
              {
                 file_put_contents( constant("SERVER_FILE_FAHRPLAN"), $stroutput );
                 // file_put_contents does not work with PHP 4.x, so use instead: fopen, fwrite, fclose
                 //$intfileid = fopen( constant("SERVER_FILE_FAHRPLAN"), "w" );
                 //fwrite( $intfileid, $stroutput );
                 //fclose( $intfileid );
                 $bolok = true;
              }
              else
              {
                 addmsg ( 'Die Fahrplandatei &quot;' . constant("SERVER_FILE_FAHRPLAN") . '&quot; konnte nicht geschrieben werden. (Rechteproblem?)');
                 $bolok = false;
              }
           }

           // write result
           if ( $bolok )
           {
              addmsg ( 'Die Fahrplandatei wurde erfolgreich aktualisiert.' );
           }
           else
           {
              addmsg ( 'Die Fahrplandatei wurde nicht aktualisiert.' );
           }
        }
        showmsg();
        echo'
        <div>
           <form id="makefahrplanform" name="makefahrplanform" action="' . $_SERVER["PHP_SELF"] . '" method="post">
              <p>
                 Hier wird die (statische) Fahrplanseite auf Basis der aktuellen Datenbank neu erstellt. <br />
                 Achtung: Die alte Fahrplanseite wird dabei unwiderruflich überschrieben!
              </p>
              <p>
                 <input name="cmdmakefahrplan" type="submit" value="Fahrplandatei jetzt erstellen!" />
              </p>
           </form>
        </div>';
        showmsg();



// todo:
// Diese verdammten Einrückungen müssten bei Gelegenheit mal wieder komplett repariert werden!
// Ursprünglich waren mal alle Einrückungen (pro Ebene) durch zwei Leerzeichen dargestellt.
// Anscheinend waren da aber zwischenzeitlich "intelligente" Editoren dran, die sich gegenseitig
//   eine wilde Schlacht mittels mehrerer inkompatibler Space- und Tab-Konventionen geliefert haben.
// HTML-Anker und orga-Chapter sollten jedenfalls absolut linksbündig stehen... *seufz*
// Eigentlich auch alles halb so schlimm, falls man einen Editor mit Block-Highlighting hat... ;-)


        // show workshop editor chapter

        echo '
        <div class="chapter">
           <h1>Workshop Editor</h1>
        </div>
        <a id="wseditor"';
        if ( $intwsid != constant("DB_ID_NONE") ) { echo ' class="linktarget" '; }
        echo '><!-- space to avoid anchor being displayed below topbars --></a>';

        if ( $bolwsupdate && $intwsid != constant("DB_ID_NONE") )
        {
           // update workshop
           // if $intwsid == constant("DB_ID_NEW") create new workshop else update existing
   
           $bolok = false;
 
           if ( $intwsid != constant("DB_ID_NEW") )
           {
              // update existing workshop
 
              $strdbsql = " ws_name = '" . $strwsname . "'," .
                          " ws_speakers = '" . $strwsspeakers . "'," .
                          " ws_content = '" . $strwscontent . "'," .
                          " ws_comment = '" . $strwscomment . "',";
              if ( $intwsduration != '' )
              {
                 $strdbsql = $strdbsql . " ws_duration = " . $intwsduration . ",";
              }
              else
              {
                 $strdbsql = $strdbsql . " ws_duration = NULL,";
              }
     
              $strdbsql = " update tbl_workshops set " .
                          substr( $strdbsql, 0, strlen( $strdbsql ) - 1 ) .
                          " where ws_id = " . $intwsid;
  
              addmsg ( 'Running SQL: ' . $strdbsql );
              if ( $dbsmain->runsql( $strdbsql ) )
              {
                 if ( $dbsmain->getdbrowcount() > 0 )
                 {
                    // update successful
                    addmsg ( 'Erfolgreich aktualisiert: ' . $dbsmain->getdbrowcount() . ' Workshop(s).' );
                    $bolok = true;
                 }
                 else
                 {
                    // update failed
                    addmsg ( 'Aktualisierung fehlgeschlagen!<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
                 }
              }
              else
              {
                 // error accessing database
                 addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Workshop-Aktualisierung verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
              }
           }
           else
           {
              // insert new workshop
 
              $strdbsql = '';
              if ( $strwsname != '' )
              {
                 $strdbfields = $strdbfields . " ws_name,";
                 $strdbsql = $strdbsql . " '" . $strwsname . "',";
              }
              if ( $intwsduration != '' )
              {
                 $strdbfields = $strdbfields . " ws_duration,";
                 $strdbsql = $strdbsql . " " . $intwsduration . ",";
              }
              if ( $strwsspeakers != '' )
              {
                 $strdbfields = $strdbfields . " ws_speakers,";
                 $strdbsql = $strdbsql . " '" . $strwsspeakers . "',";
              }
              if ( $strwscontent != '' )
              {
                 $strdbfields = $strdbfields . " ws_content,";
                 $strdbsql = $strdbsql . " '" . $strwscontent . "',";
              }
              if ( $strwscomment != '' )
              {
                 $strdbfields = $strdbfields . " ws_comment,";
                 $strdbsql = $strdbsql . " '" . $strwscomment . "',";
              }
	      if ( $strdbsql != '' )
              {
                 // get nextval
                 $strdbsql2 = "select MAX(ws_id)+1 as nextval from tbl_workshops";
                 addmsg ( 'Running SQL: ' . $strdbsql2 );
                  
                 if ( $dbsmain->runsql( $strdbsql2 ) )
                 {
                    if ( $dbsmain->getdbrowcount() > 0 )
                    {
                       if ( $dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_FIRST ))
                       {
                          // nextval succeeded
                          addmsg ( 'Nextval erhalten: ' . $strdbrow['nextval'] );
                          $intwsid = $strdbrow['nextval'];
             
                          $strdbfields = " ws_id," . $strdbfields;
                          $strdbsql = " " . $intwsid . "," . $strdbsql;
                       }
                       else
                       {
                          // this should never happen, at all
                          addmsg ( 'Nextval nicht lesbar!<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
                       }
                    }
                    else
                    {
                       // nextval failed
                       addmsg ( 'Keinen Nextval erhalten!<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
                    }
                 }
                 else
                 {
                    // error accessing database
                    addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Workshop-Erstellung verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
                 }

            if ( $intwsid != constant("DB_ID_NEW") )
      {
        // nextval available

        $strdbsql = " insert into tbl_workshops (" .
                    substr( $strdbfields, 0, strlen( $strdbfields ) - 1 ) .
                    ") values ("
                    . substr( $strdbsql, 0, strlen( $strdbsql ) - 1 ) .
                    ")";

        addmsg ( 'Running SQL: ' . $strdbsql );
        if ( $dbsmain->runsql( $strdbsql ) )
        {
          if ( $dbsmain->getdbrowcount() > 0 )
          {
            // insert successful
            addmsg ( 'Erfolgreich erstellt: ' . $dbsmain->getdbrowcount() . ' Workshop(s).' );
            $bolok = true;
          }
          else
          {
            // insert failed
            addmsg ( 'Erstellung fehlgeschlagen!<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
          }
        }
        else
        {
          // error accessing database
          addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Workshop-Erstellung verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
        }
        if ( !$bolok )
        {
          $intwsid = constant("DB_ID_NEW");
        }
      }
    }
    else
    {
      // no fields filled
      addmsg ( 'Wenn Du einen neuen Workshop anlegen willst, wäre es geschickt, zumindest schonmal den Namen auszufüllen. ;o) ' );
    }
  }
}





showmsg();

echo '
<div>
<p>
Hier können Workshops manuell bearbeitet - oder eben auch kaputtgemacht - werden, bitte also aufpassen ;)
</p>
';

echo '
<form	id="wsselectform " ';
echo ' name="wsselectform" action="' . $_SERVER["PHP_SELF"] . '#wseditor" method="post">
<div>
';

$bolok = false;

// read workshops
$strdbsql = " select *" .
            " from tbl_workshops ws" .
            " order by ws_name";
if ( $dbsmain->runsql( $strdbsql ) )
{
  if ( $dbsmain->getdbrowcount() > 0 )
  {
    // workshops found
    // -> use them

    $strworkshoplist = '<option value="' . constant("DB_ID_NONE") . '"';
    if ( $intwsid == constant("DB_ID_NONE") || $intwsid == constant("DB_ID_NEW") )
    {
      // extracted to function "selectws": $strworkshoplist = $strworkshoplist . ' selected="selected"';
      if ( !$bolwsupdate )
      {
        // clear workshop fields, except user tried to update
        $strwsname = '';
        $strwsspeakers = '';
        $intwsduration = 0;
        $strwscontent = '';
        $strwscomment = '';
      }
    }
    $strworkshoplist = $strworkshoplist . '>' . constant("DISPLAY_TEXT_NONE") . '</option>';

    while ( $dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_NEXT ))
    {
      // for each workshop:
      $strworkshoplist = $strworkshoplist . '<option value="' . $strdbrow["ws_id"] . '"';
      if ( $intwsid == $strdbrow["ws_id"] )
      {
        // extracted to function "selectws": $strworkshoplist = $strworkshoplist . ' selected="selected"';
        // init workshop fields
        $intwsid = $strdbrow["ws_id"];
        $strwsname = $strdbrow["ws_name"];
        $strwsspeakers = $strdbrow["ws_speakers"];
        $intwsduration = $strdbrow["ws_duration"];
        $strwscontent = $strdbrow["ws_content"];
        $strwscomment = $strdbrow["ws_comment"];
      }
      $strworkshoplist = $strworkshoplist . '>' . $strdbrow["ws_name"] . '</option>';
    }
    echo
    '
      <span class="topic">Auswahl:</span><select name="cboworkshop" onchange="document.wsselectform.submit();">' . selectws( $intwsid ) . '</select>
    ';
    $bolok = true;
  }
  else
  {
    // no workshops found
    // -> hmm, that should not happen, but even then there should be no data anyway...
  }
}
else
{
  // error accessing database
  addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Abfrage der Workshopliste verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
}

echo
'
    </div>
  </form>
  <form	id="wscreateform" name="wscreateform" action="' . $_SERVER["PHP_SELF"] . '#wseditor" method="post">
    <div>
      <input name="txtwsid" type="hidden" value="' . constant("DB_ID_NEW") . '" />
      <input name="cmdwscreate" type="submit" value="Neuen Workshop erstellen..." />
    </div>
  </form>
';

if ( $intwsid != constant("DB_ID_NONE") )
{
  // show workshop update form with selected workshop
  
  echo
  '
  <form	id="wsupdateform" name="wsupdateform" action="' . $_SERVER["PHP_SELF"] . '#wseditor" method="post">
    <div class="box">

    <input name="txtwsid" type="hidden" value="' . $intwsid . '" />
    <span class="topic">Name:</span><input class="db" name="txtwsname" type="text" value="' . $strwsname . '" />
    <span class="topic">Referenten:</span><input class="db" name="txtwsspeakers" type="text" value="' . $strwsspeakers .'" />
    <span class="topic">Dauer (Min.):</span><input class="db" name="txtwsduration" type="text" value="' . $intwsduration .'" />
    <span class="topic">Inhalt:</span><textarea class="db verybig" name="txtwscontent">'. $strwscontent .'</textarea>
    <span class="topic">Bemerkung:</span><textarea class="db" name="txtwscomment">'. $strwscomment .'</textarea>
    <input name="cmdwsupdate" type="submit" value="Workshop jetzt aktualisieren!" />

    </div>
  </form>
  ';
}

echo
'
</div>
';
showmsg();





// show fahrplan editor chapter
echo
'
<div class="chapter">
<h1>Fahrplan Editor</h1>
</div>
';

// update fahrplan

if ( $bolsdupdate )
{
  // save all selected workshops (from downlists) into schedule

  $bolok = true;
  $intcount = 0;

  reset( $lstschedule );
  foreach ( $lstschedule as $strscheduleindex => $intschedulevalue)
  {
    $intscheduleindex = intval( substr( $strscheduleindex, 0, strpos( $strscheduleindex . constant("DISPLAY_VALUE_SEPARATOR"), constant("DISPLAY_VALUE_SEPARATOR") )));
    if ( $intschedulevalue != intval( substr( $strscheduleindex, strpos( $strscheduleindex . constant("DISPLAY_VALUE_SEPARATOR"), constant("DISPLAY_VALUE_SEPARATOR") ) + 1 )))
    {
      // dropdownbox had been changed
      // -> update

      $strdbsql = "NULL";
      if ( $intschedulevalue != constant("DB_ID_NONE") )
      {
        $strdbsql = strval( intval( $intschedulevalue ));
      }

      $strdbsql = " update tbl_schedule " .
                " set sd_ws_id = " . $strdbsql .
                " where sd_id = " . strval( intval( $intscheduleindex ));

      addmsg ( 'Running SQL: ' . $strdbsql );
      if ( $dbsmain->runsql( $strdbsql ) )
      {
        if ( $dbsmain->getdbrowcount() > 0 )
        {
          // schedule updated
          // continue
          $intcount = $intcount + 1;
        }
        else
        {
          // schedule not updated
          addmsg ( 'Sorry, die Scheduleposition mit der ID ' . strval( intval( $intscheduleindex )) . ' konnte nicht geschrieben werden.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
          $bolok = false;
        }
      }
      else
      {
        // error accessing database
        addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Aktualisierung des Schedules verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
        $bolok = false;
      }
    }
    else
    {
      // dropdownbox had not been changed
      // -> ignore
    }
  }
  addmsg ( 'Es wurden ' . $intcount . ' Slots erfolgreich aktualisiert.' );
  showmsg();
}


if ( $bolsdupdate || $bolsdactivate )
{
  $bolok = false;
  $strtablehead = '';

  // prepare table header with room names
  // read rooms
  $strdbsql = " select ro_name" .
              " from tbl_rooms ro" .
              " order by ro_schedpos";
  //addmsg ( 'Running SQL: ' . $strdbsql );
  if ( $dbsmain->runsql( $strdbsql ) )
  {
    if ( $dbsmain->getdbrowcount() > 0 )
    {
      // rooms found
      // -> use them

      $strtablehead = '';

      while ( $dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_NEXT ))
      {
        // for each room:
        {
        $strtablehead = $strtablehead .
        '
                <td class="db">' . $strdbrow['ro_name'] . '</td>
        ';
        }
      }
      $bolok = true;
    }
    else
    {
      // no rooms found
      // -> hmm, that should not happen, but even then there should be no data anyway...
    }
  }
  else
  {
    // error accessing database
    addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Abfrage der Raumliste verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
  }

  // Achtung:
  // Der "Fahrplan Editor" benötigt für die Dropdownlisten auch die Variable $strworkshoplist,
  // welche weiter oben im Rahmen des Kapitels "Workshop Editor" erstellt wurde.

  showmsg();
}

echo
'
<div>
<form id="sdeditorform" name="sdeditorform" action="' . $_SERVER["PHP_SELF"] . '" method="post">
<p>
Hier kann der Fahrplan bearbeitet werden, der anschließend mittels &quot;make install Fahrplan&quot; veröffentlicht werden kann. <br />
Achtung: Der alte Fahrplan wird dabei in der Datenbank unwiderruflich überschrieben! <br />
</p>
';


//write fahrplan

if ( $bolsdupdate || $bolsdactivate )
{
  $stroutput = '';

  if ( $bolok )
  {
    // read schedule slots with workshops
    $strdbsql = " select extract(hour from sd_begintime) as sd_begintime_hour, extract(day from sd_begintime) as sd_begintime_day," .
                " extract(month from sd_begintime) as sd_begintime_month, extract(year from sd_begintime) as sd_begintime_year," .
                " DAYOFWEEK(sd_begintime) as sd_begintime_weekday, sd_begintime," .
                " sd_id, ws_id, ws_name, ws_speakers,".
                " ro_name" .
                " from tbl_schedule sd" .
                " left join tbl_workshops ws on sd.sd_ws_id = ws.ws_id" .
                " left join tbl_rooms ro on sd.sd_ro_id = ro.ro_id" .
                " order by sd_begintime, ro_schedpos";
    //addmsg ( 'Running SQL: ' . $strdbsql );
    if ( $dbsmain->runsql( $strdbsql ) )
    {
      if ( $dbsmain->getdbrowcount() > 0 )
      {
        // scheduled events found
        // -> use them

        // es folgt: Gruppenwechsel über Tag, Timeslot, Raum, Schedule-Event

        // Gesamtvorlauf
        $intsdyear = 0;
        $intsdmonth = 0;
        $intsdday = 0;
        $intsdhour = 0;
        $strroname = '';
        $boleof = false;

        $boleof = !$dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_NEXT );

        while ( !$boleof )
        {
          // Gruppenvorlauf Tag
          $intsdyear = $strdbrow['sd_begintime_year'];
          $intsdmonth = $strdbrow['sd_begintime_month'];
          $intsdday = $strdbrow['sd_begintime_day'];
          // neue Tabelle initialisieren
          $intcolrot = 1;
          $stroutput = $stroutput .
          '
            <div class="chapter">
              <table class="db">
                <tr class="dbhead">
                  <td class="db">
                    ' . $strweekdayname[ $strdbrow['sd_begintime_weekday'] ] . '<br />
                    ' . $intsdday . '.' . $intsdmonth . '.
                  </td>
          ';
          $stroutput = $stroutput . $strtablehead;
          $stroutput = $stroutput .
          '
                </tr>
          ';

          while
          (
            !$boleof
            &&
            (
              $intsdyear == $strdbrow['sd_begintime_year']
              &&
              $intsdmonth == $strdbrow['sd_begintime_month']
              &&
              $intsdday == $strdbrow['sd_begintime_day']
            )
          )
          {
            // Gruppenvorlauf Timeslot
            $intsdhour = $strdbrow['sd_begintime_hour'];
            // neue Tabellenzeile initialisieren
            $intcolrot = abs( $intcolrot - 1 );
            $stroutput = $stroutput .
            '
                <tr class="db' . $intcolrot.'">
                  <td class="db">
                    ' . $intsdhour.'<span class="small">:00</span>
                  </td>
            ';

            while
            (
              !$boleof
              &&
              (
                $intsdyear == $strdbrow['sd_begintime_year']
                &&
                $intsdmonth == $strdbrow['sd_begintime_month']
                &&
                $intsdday == $strdbrow['sd_begintime_day']
              )
              &&
              (
                $intsdhour == $strdbrow['sd_begintime_hour']
              )
            )
            {

              // Gruppenvorlauf Schedule-Event
              $strroname = $strdbrow['ro_name'];
              // neue Tabellenzelle initialisieren
              $stroutput = $stroutput .
              '
                  <td class="dbdata">
              ';

              while
              (
                !$boleof
                &&
                (
                  $intsdyear == $strdbrow['sd_begintime_year']
                  &&
                  $intsdmonth == $strdbrow['sd_begintime_month']
                  &&
                  $intsdday == $strdbrow['sd_begintime_day']
                )
                &&
                (
                  $intsdhour == $strdbrow['sd_begintime_hour']
                )
                &&
                (
                  $strroname == $strdbrow['ro_name']
                )
              )
              {
                // Datensatz (Schedule-Event) verarbeiten
                $stroutput = $stroutput . '<select class="dbdata" name="cboschedule[' . $strdbrow["sd_id"] . constant("DISPLAY_VALUE_SEPARATOR") . $strdbrow['ws_id'] . ']">' . selectws( $strdbrow['ws_id'] ) . '</select>';

                // neuen Datensatz lesen
                $boleof = !$dbsmain->getdbrow ( $strdbrow, clsdb::DB_ROW_NEXT );
              }
              // Gruppennachlauf Schedule-Event
              // Tabellenzelle finalisieren
              $stroutput = $stroutput .
              '
                  </td>
              ';

            }
            // Gruppennachlauf Timeslot
            // Tabellenzeile finalisieren
            $stroutput = $stroutput .
            '
                </tr>
            ';

          }

          // Gruppennachlauf Tag
          // Tabelle finalisieren
          $stroutput = $stroutput .
          '
              </table>
            </div>
          ';
        }

        // Gesamtnachlauf
        // Gesamtausgabe finalisieren

        //addmsg ( 'Die Fahrplandaten wurden erfolgreich zusammengestellt. Die Fahrplandatei kann jetzt geschrieben werden.' );
        $bolok = true;
      }
      else
      {
        // no scheduled events found
        // -> hmm, that should not happen, but even then there should be no data anyway...
      }
    }
    else
    {
      // error accessing database
      addmsg ( 'Sorry, die Datenbank ist momentan nicht für die Abfrage der Workshops verfügbar.<br />Die Datenbank sagt: ' . $dbsmain->getdberror() );
    }
  }

  if ( $bolok )
  {
    // operation has succeeded -> now write fahrplan
    echo
    '
    <div class="box">' . $stroutput .
    '
    <p>
    <input name="cmdsdupdate" type="submit" value="Fahrplan jetzt aktualisieren!" />
    </p>
    </div>
    ';
  }
}
else
{
  echo
  '
  <p>
  <input name="cmdsdactivate" type="submit" value="Fahrplan editieren..." />
  </p>
  ';
}

echo
'
</form>
</div>
';
showmsg();



ignore this for 2007 */




// show run SQL chapter

echo
'
<a name="sql"></a>
<div class="chapter">
<h1>run SQL</h1>
</div>
';

$bolok = false;

if ( $bolrunsql && $strsql != '' )
{
  // runs SQL statement

  // be careful now:
  // fire raw sql statement to database
  $strdbsql = $pstrsql;
  // write defused sql statement to screen
  addmsg ( 'Running SQL: ' . $strsql );

  if ( $dbsmain->runsql ( $strdbsql ) )
  {
    addmsg ( $dbsmain->getdbrowcount() . ' records found.' );

    if ( $dbsmain->getdbfields( $strdbfields ))
    {

      echo
      '
        <div>
          <table class="db">
            <tr class="dbhead">
      ';

      foreach ( $strdbfields[clsdb::DB_FIELD_NAME] as $intindex => $strvalue )
      {
      echo
      '
              <td class="db">' . $strvalue . '</td>
      ';
      }

      echo
      '
            </tr>
      ';

      //if ( $dbsmain->getdbrow( $strdbrow, clsdb::DB_ROW_FIRST ))
      $intcolrot = 0;
      while ( $dbsmain->getdbrow( $strdbrow, clsdb::DB_ROW_NEXT ))
      {
        echo
        '
            <tr class="db' . $intcolrot . '">
        ';

        $intindex = 1;
        foreach ( $strdbfields[clsdb::DB_FIELD_NAME] as $intindex => $strvalue )
        {
          echo
          '
              <td class="db">' . $strdbrow[ $strvalue ] . '</td>
          ';
        }

      echo
      '
            </tr>
      ';

        $intcolrot = abs( $intcolrot - 1 );
      }

      echo '</table></div>';

      $bolok = true;
    }
    else
    {
      addmsg ( 'Error reading the fields!<br />Database says: ' . $dbsmain->getdberror() );
    }
  }
  else
  {
    addmsg ( 'Error accessing the database!<br />Database says: ' . $dbsmain->getdberror() );
  }
}
showmsg();

echo
'
<div>
<form id="runsqlform" name="runsqlform" action="' . $_SERVER["PHP_SELF"] . '#sql" method="post">
<p>
Hier können beliebige SQL-Kommandos (getrennt durch Semikoli, Zeilenumbrüche möglich) auf die Datenbank abgesetzt werden.<br />
Vorsicht: Dabei lässt sich auf sehr einfache und hochperformante Weise die Datenbank schrotten. ;-) <br />
<span class="line important"><span class="topic">Erste und einzige Regel:</span>Prüfe immer zuerst mit SELECT, was Du mit UPDATE oder DELETE anfassen willst!</span>
</p>
<p>
<span class="topic">SQL:</span><textarea class="db" name="txtsql">'. $strsql .'</textarea>
<input name="cmdrunsql" type="submit" value="Three-Two-One...Fire!" />
</p>
</form>
</div>
</div>
';
showmsg();





// close page and stoprun.
echo
'
<!-- end of specific page content -->

';
readfile( constant("SERVER_FILE_EXTRO") );

die();

?>