===============================================================================
PHP-SKRIPTE
===============================================================================

INHALTSVERZEICHNIS

A: SORTIERUNG VON ARRAY-ELEMENTEN (REVERSE)
B: GRUNDSAETZLICHER AUFBAU EINER TEXT- ODER CSV-DATENBANK
C: HAUPTBILD EINER WEBSEITE IM SEKUNDENTAKT AENDERN
D: LOESCHUNG VON ALTEN DATEIEN
E: BLOCKIERUNG VON SUCHMASCHINEN
F: INTERNET-BROWSER ERMITTELN DIE OGG-DATEIEN (SOUND) UNTERSTUETZEN UND
   ABSPIELEN KOENNEN
G: PSEUDO-VERZEICHNISSCHUTZ MIT PSYCHOLOGISCHER WIRKUNG
H: UNTERSCHIEDLICHE WEBSEITEN FUER VERSCHIEDENE INTERNET-BROWSER ANBIETEN
I: ZUGANGSDATEN - BENUTZERNAMEN UND PASSWORT - VERSCHLUESSELT ABSPEICHERN

===============================================================================

A: SORTIERUNG VON ARRAY-ELEMENTEN (REVERSE)

Das PHP-Skript sortiert eine Liste mit vollstaendigen Dateipfaden, ohne
Beruecksichtigung des Dateipfades. Bei dieser Sortierung wird nur der Dateiname
beruecksichtigt.

<?php

[...]

/*
das Array $filename_array enthaelt die unsortierte Liste der Dateinamen mit
ihrem kompletten Dateipfad
*/

$filename_array_count=count($filename_array);
$filename_array_sort_tmp = array();
$filename_array_sort = array();
for($y=0; $y<$filename_array_count; $y++) {
   $filename_array_sort_a=explode("/", $filename_array[$y]);
   $filename_array_sort_b=array_reverse($filename_array_sort_a);
   $filename_string_sort_b=implode("/", $filename_array_sort_b);
   array_push($filename_array_sort_tmp, $filename_string_sort_b);
   unset( $filename_array_sort_a);
   unset( $filename_array_sort_b);
   unset($filename_string_sort_b);
}
// Flags: SORT_REGULAR (Default-Wert), SORT_NUMERIC, SORT_STRING, SORT_LOCALE_STRING
sort($filename_array_sort_tmp, SORT_REGULAR);
$filename_array_sort_tmp_count=count($filename_array_sort_tmp);
for($z=0; $z<$filename_array_sort_tmp_count; $z++) {
   $filename_array_sort_a=explode("/", $filename_array_sort_tmp[$z]);
   $filename_array_sort_b=array_reverse($filename_array_sort_a);
   $filename_string_sort_b=implode("/", $filename_array_sort_b);
   array_push($filename_array_sort, $filename_string_sort_b);
   unset( $filename_array_sort_a);
   unset( $filename_array_sort_b);
   unset($filename_string_sort_b);
}
unset($filename_array_sort_tmp);
$filename_array_sort_count=count($filename_array_sort);

/*
das Array $filename_array_sort enthaelt nun die sortierte Liste nach den Dateinamen,
ohne Beruecksichtigung der Namen des Dateipfades, Namen der Verzeichnisse
*/

[...]

?>

===============================================================================

B: GRUNDSAETZLICHER AUFBAU EINER TEXT- ODER CSV-DATENBANK

Datei: content_1.dat
id|db_nr|status|create_time|change_time|data_1|data_2|data_3|data_4|data_5|data_6|data_7|data_8|data_9|data_10|data_11|data_12| | | | | | | | | | | | |data_25
4|2|1|10|10|128|128|128|255|128|2000|2000|65000|2000|3000|3000|255| | | | | | | | | | | | |
1|1|1|1363864682|1377513045|Content xyz|Content xyz|Content xyz| | | | | | | | | | | | | | | | | | | | | | 
2|1|1|1363864685|1377513048|Content xyz|Content xyz|Content xyz| | | | | | | | | | | | | | | | | | | | | | 
3|1|1|1363864688|1377513049|Content xyz|Content xyz|Content xyz| | | | | | | | | | | | | | | | | | | | | | 
[...]

1. Zeile: enthaelt die internen System- und Daten-Feldnamen: nur englisches
   Alphabet, Zahlen und den Unterstrich (_); Kleinschreibweise ist zu bevorzugen;
   die Feldnamen bezieht die Seite aus einer speziellen Datei (Array)

2. Zeile enthaelt die maximale Zeichenlaenge fuer das entsprechende Feld; die
   ersten 5 Felder sind interne Felder fuer das System; die maximale
   Zeichenlaenge bezieht die Seite aus einer speziellen Datei (Array)
  
3. Zeile und die weiteren Zeilen:
1|2|1|1363774430|1363775430| | | | | | | | | | | | | | | | | | | | | | | | | 
  1. id
  2. Datendatei-Nr. oder Datenbank-Nr., jede Text-Datenbank erhaelt eine eigene Nr.
     siehe: Dateiname - content_1.dat, content_2.dat, ...
  3. Status: 1 ... aktiv, 0 ... geloescht
     Status 0: die Daten dieses Datensatzes werden erst ueberschrieben, wenn ein
     neuer Datensatz gespeichert werden soll; bis zu diesen Zeitpunkt koennen die
     als geloescht gekennzeichneten Daten wiederhergestellt werden (Status -> 1)
  4. Create Time: Unix-Zeitstempel
  5. Change Time: Unix-Zeitstempel
  6. Felder 6 bis 30 sind die nutzbaren Feldinhalte eines Datensatzes - 25 Felder;
     diese Felder enthalten die sichtbaren Inhalte fuer die Webseiten-Inhalte
  
  HINWEIS: die 25 Daten-Felder koennen beliebige Zeichen enthalten; der gerade
  Strich (|) ist durch den entsprechenden HTML-Code (&#124;) zu ersetzen; die
  Zeichenlaenge kann 0 bis 65000 Zeichen betragen
  

UEBERPRUEFUNG DER ZU SPEICHERNDEN DATEN VOR DER UEBERGABE AN DIE TEXT- ODER
CSV-DATENBANK

Um unbeabsichtigte Effekte zu vermeiden sind einige Sonderzeichen durch den
entsprechenden HTML-Code zu ersetzen (z.B. <> -> &lt;&gt;). Fuer einige
Sonderzeichen erledigt dies eine PHP-Funktion (htmlspecialchars()).

Der Internet-Browser interpretiert einige Zeichenkombinationen als
Formatierungs-Befehl (HTML-Tag) oder sogar als Javaskript-Programmcode.

// Funktion: Pruefung und Aufbereitung der Formular-Daten fuer die Aufnahme in die CSV-Datenbank
function check_form_data($FormData='') {
   if(isset($FormData)) {
      $FormData = htmlspecialchars($FormData, ENT_QUOTES);
      // Zeilenumbruch (Windows: \r\n, MAC: \r, Unix/linux: \n) in den HTML-Code umsetzen
      $FormData = preg_replace('/\r\n|\r|\n/', '<br />', $FormData);
      // gerader Strich (|) ist reserveiert als Feldtrenner
      $FormData = preg_replace('/\|/', '&#124;', $FormData);
      return $FormData;
   }
   else
   {
   return FALSE;
   }
}

HINWEIS: Wird an die Funktion function check_form_data() ein Array uebergeben
(z.B. $form_data_array), so ist in der Funktion noch eine for-Schleife
einzufuegen.

Nach der Pruefung und Aufbereitung der Formular-Daten koennen die Daten an
eine weitere Funktion (z.B. function write_data()) uebergeben werden. Diese
Funktion kann die Daten, nach einer Pruefung fuer die maximal zulaessige
Zeichenlaenge pro Datenbank-Feld, nun endgueltig in die Text- oder
CSV-Datenbank schreiben.

HINWEIS: Durch die Zeichenersetzung wird die Text- oder Stringlaenge ein wenig
erweitert. Dies sollte bei der Zuweisung der maximalen Zeichenlaenge fuer die
Datenbank-Felder beruecksichtigt werden.

===============================================================================

C: HAUPTBILD EINER WEBSEITE IM SEKUNDENTAKT AENDERN

Das PHP-Skript benoetigt 2 Verzeichnisse (./inc und ./picture). Oberhalb dieser
Verzeichnisse befindet sich die Datei start.php.

Im Verzeichnis ./inc ist die Datei ./inc_change_picture.php und im Verzeichnis
./picture sind die Bilder image-00.jpg, image-01.jpg ... image-59.jpg und das Bild
image-reparation.jpg (Ersatzbild im Fehlerfall) abzulegen.

Das Hauptbild der Webseite wird bei jedem Aufruf der Webseite geaendert.

Datei: inc_change_picture.php
<?php
// +++ ANFANG KONFIGURATION +++
$directory_picture = "./picture"; // Verzeichnis mit den Bild-Dateien
$picture_filename_part_a = "image-"; // erster nicht veraenderlicher Teil des Namens der Bilder (bild-)
$picture_filetype = "jpg"; // Dateitypen - ohne fuehrenden Punkt; moegliche Werte: jpg oder jpeg (default), png, gif
$picture_width=220; // Bildbreite in Pixel
$picture_height=180; // Bildhoehe in Pixel
$picture_alt_text_part_b = "...Zeittropfen"; // Teil des alternativen Bildtitels; alt HTML-Tag
$picture_error_alt_text = "ERROR-Zeittropfen"; // alternativer Bildtitel im Fehlerfall; alt HTML-Tag
$picture_name_reparation = "image-reparation.jpg"; // Ersatzbild im Fehlerfall
// +++ ENDE KONFIGURATION +++
if(empty($include_key)) exit; // verhindert die Ausfuehrung der include-Datei bei einem direkten Aufruf

$picture_file_path="";
$picture_filename_part_b = date("s"); // zweiter veraenderliche Teil des Namens der Bilder (bild-xx.jpg)
if(preg_match("/^[0-9][0-9]$/",$picture_filename_part_b)) {
   $picture_name = $picture_filename_part_a . $picture_filename_part_b . "." . $picture_filetype;
   $picture_file_path = $directory_picture . "/" . $picture_name;
   $picture_alt_text = "+" . $picture_filename_part_b . $picture_alt_text_part_b;
}

if(!empty($picture_file_path) && file_exists($picture_file_path)) {
   $picture_html_code = "<img src=\"" . $picture_file_path  . "\" width=\"" . $picture_width . "\" height=\"" . $picture_height . "\" border=\"0\" title=\"" . $picture_alt_text  . "\" alt=\"" . $picture_alt_text  . "\">";
}
else
{
   $picture_file_path = $directory_picture . "/" . $picture_name_reparation;
   if(file_exists($picture_file_path)) {
      $picture_html_code = "<img src=\"" . $picture_file_path  . "\" width=\"" . $picture_width . "\" height=\"" . $picture_height . "\" border=\"0\" title=\"" . $picture_error_alt_text  . "\" alt=\"" . $picture_error_alt_text  . "\">";
   }
   else
   {
   $picture_html_code="";
   }
}
?>

Datei: start.php
<?php
$inc_filename = "inc_change_picture.php";
$inc_file_path = "./inc/" . $inc_filename;
if(file_exists($inc_file_path)) {
   $include_key=1; // siehe: inc_change_picture.php
   include($inc_file_path);
}
if(empty($picture_html_code)) $picture_html_code="&nbsp;";
?>
<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>HAUPTBILD EINER WEBSEITE IM SEKUNDENTAKT AENDERN</title>
<style type="text/css">
body {
 margin: 10px 15px 15px 10px;
 font-family: Arial, sans-serif;
 background-color: #FFFFFF;
 color: #000000;
}
</style>
</head>
<body>

<h2>AUFRUFENDE DATEI</h2>

<?php echo $picture_html_code; ?>

</body>
</html>

===============================================================================

D: LOESCHUNG VON ALTEN DATEIEN

Das PHP-Skript benoetigt 2 Verzeichnisse (./inc und ./»Verzeichnis mit den
alten Dateien«). Oberhalb des Verzeichnisses ./inc befindet sich die Datei
start.php.

Datei: inc_delete_old_data.php
<?php
// +++ ANFANG KONFIGURATION +++
$directory_old_data = "../tmp"; // Verzeichnis mit den alten Dateien
$time_to_life = 3600 * 4; // Lebenszeit der alten Dateien; default: 3600 * 4 (4 Stunden)
// +++ ENDE KONFIGURATION +++
if(empty($include_key)) exit; // verhindert die Ausfuehrung der include-Datei bei einem direkten Aufruf

if(@is_dir($directory_old_data)) {
   $current_time = time();
   $handle = @opendir($directory_old_data);
   while($read_file = @readdir($handle)) {
      if($read_file != "." && $read_file != "..") {
         $read_file_path = $directory_old_data . "/" . $read_file;
         if(@is_file($read_file_path)) {
            $file_time_lag = $current_time - filemtime($read_file_path);
            if($file_time_lag > $time_to_life) @unlink($read_file_path);
         }
      }
  }
clearstatcache();
@closedir($handle);
}
?>

Datei: start.php
<?php
$inc_filename = "inc_delete_old_data.php";
$inc_file_path = "./inc/" . $inc_filename;
if(file_exists($inc_file_path)) {
   $include_key=1; // siehe: inc_delete_old_data.php
   include($inc_file_path);
}
?>
<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>LOESCHUNG VON ALTEN DATEIEN</title>
<style type="text/css">
body {
 margin: 10px 15px 15px 10px;
 font-family: Arial, sans-serif;
 background-color: #FFFFFF;
 color: #000000;
}
</style>
</head>
<body>

<h2>AUFRUFENDE DATEI</h2>

</body>
</html>

===============================================================================

E: BLOCKIERUNG VON SUCHMASCHINEN

Das PHP-Skript benoetigt 1 Verzeichnis (./inc). Oberhalb dieses Verzeichnisses
befindet sich die Datei start.php.

Laestige Suchmaschinen koennen mit dem PHP-Skript an der Durchsuchung einer
Webseite gehindert werden. Die Suchmaschinenrobots bekommen statt des Inhaltes
einer Webseite, eine fiktive Fehlermeldung zu sehen.

HINWEIS: Diese fiktive Fehlermeldung sollte keine Informationen ueber real verwendete
Software enthalten.

Das Array mit den Namen der Suchmaschinen kann beliebig erweitert und geaendert
werden. Im Array ist ein markanter Teil des internen Browsernamen (HTTP_USER_AGENT)
des Suchmaschinenrobots einzutragen.

Datei: inc_search_engine.php
<?php
// +++ ANFANG KONFIGURATION +++
$search_engine_agent_name_array = array('SiteLockSpider', 'SEOlizer', 'SEO Scanner', 'bingbot', 'MJ12bot'); // SearchEngineBots, die eine Fehlermeldung erhalten
$search_engine_bots_message = "<br />\n"; // Zeilenumbruch fuer die Fehlermeldung
$search_engine_bots_message .= "<b>Fatal error</b>:  Call to undefined function  user_access() in <b>/www/htdocs/w00caa92/cms/sites/all/modules/admin_menu/admin_menu.module</b> on line <b>81</b><br />"; // Botschaft, entspricht einer realen Meldung des CMS Drupal
// +++ ENDE KONFIGURATION +++
if(empty($include_key)) exit; // verhindert die Ausfuehrung der include-Datei bei einem direkten Aufruf

$user_agent_string = $_SERVER['HTTP_USER_AGENT']; // Ermittlung des Browser-User-Agent-Namen

// an SearchEngineBots eigene Infos ueberreichen
for($x=0; $x<count($search_engine_agent_name_array); $x++) {
    if(preg_match("@" . $search_engine_agent_name_array[$x] . "@i", $user_agent_string)) {
       print $search_engine_bots_message;
       exit;
    }
}
?>

Datei: start.php
<?php
$inc_filename = "inc_search_engine.php";
$inc_file_path = "./inc/" . $inc_filename;
if(file_exists($inc_file_path)) {
   $include_key=1; // siehe: inc_search_engine.php
   include($inc_file_path);
}
?>
<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>BLOCKIERUNG VON SUCHMASCHINEN</title>
<style type="text/css">
body {
 margin: 10px 15px 15px 10px;
 font-family: Arial, sans-serif;
 background-color: #FFFFFF;
 color: #000000;
}
</style>
</head>
<body>

<h2>AUFRUFENDE DATEI</h2>

</body>
</html>

===============================================================================

F: INTERNET-BROWSER ERMITTELN DIE OGG-DATEIEN (SOUND) UNTERSTUETZEN UND
   ABSPIELEN KOENNEN

Das PHP-Skript benoetigt 2 Verzeichnissse (./inc und ./sound). Oberhalb dieses
Verzeichnisses befindet sich die Datei start.php.

Im Verzeichnis ./inc sind die Dateien ./inc_browser_user_agent.php,
inc_background_sound.php und im Verzeichnis ./sound die OGG-Dateien bgsound_a.ogg,
bgsound_b.ogg und bgsound_c.ogg zu speichern.

Datei: inc_browser_user_agent.php
<?php
// +++ ANFANG KONFIGURATION +++
$user_agent_name_array = array('Firefox', 'Chrome', 'Opera'); // Array mit den Browser-Namen, entsprechend der Angabe im UserAgentString
// +++ ENDE KONFIGURATION +++
if(empty($include_key)) exit; // verhindert die Ausfuehrung der include-Datei bei einem direkten Aufruf

$user_agent_string = $_SERVER['HTTP_USER_AGENT'];

/*
Broweserermittlung (Firefox, Iceweasel => gibt sich als Firefox aus, Chrome und
Opera) fuer browserspezifischen Code; Achtung: z.B. Opera 11 gibt sich als
Opera/9.80 ..... Version/11.1 im UserAgentString aus; 
*/
$ogg_sound_support=0;
if(preg_match("@" . $user_agent_name_array[0] . "/@i", $user_agent_string) ||
   preg_match("@" . $user_agent_name_array[1] . "/@i", $user_agent_string)) {
   if(preg_match("@" . $user_agent_name_array[0] . "/[1-9][0-9]{1,2}\.[0-9]@i", $user_agent_string) ||
      preg_match("@" . $user_agent_name_array[1] . "/[1-9][0-9]{1,2}\.[0-9]@i", $user_agent_string)) {
      // Firefox, Chrome ab Version 10.0 bis 999.9 testen
      $ogg_sound_support=1;
   } elseif(preg_match("@" . $user_agent_name_array[0] . "/[4-9]\.[0-9]@i", $user_agent_string) ||
            preg_match("@" . $user_agent_name_array[1] . "/[4-9]\.[0-9]@i", $user_agent_string)) {
            // Firefox, Chrome ab Version 4.0 bis 9.9 testen
            $ogg_sound_support=1;
   }
} elseif(preg_match("@" . $user_agent_name_array[2] . "/@i", $user_agent_string)) {
         if(preg_match("@" . $user_agent_name_array[2] . "/[2-9][0-9]{1,2}\.[0-9]@i", $user_agent_string)) {
            // Opera ab der Version 20.0 bis 999.9 testen
            $ogg_sound_support=1;
         } elseif(preg_match("@Version/[1-9][0-9]{1,2}\.[0-9]@i", $user_agent_string)) {
                  // Opera ab der Version 10.0 bis 999.9  testen
                  $ogg_sound_support=1;
         }
}
?>

Datei: inc_background_sound.php
<?php
// +++ ANFANG KONFIGURATION +++
$directory_sound = "./sound"; // Verzeichnis mit den Sound-Dateien
$sound_file_array=array("bgsound_a.ogg","bgsound_b.ogg","bgsound_c.ogg"); // Array mit den Sound-Dateien
// +++ ENDE KONFIGURATION +++
if(empty($include_key)) exit; // verhindert die Ausfuehrung der include-Datei bei einem direkten Aufruf

$bgsound_html_code="";
if(!empty($ogg_sound_support)) {
   // ogg-Dateien als Background-Sound einfuegen (Firefox, Iceweasel, Opera, Chrome)
   $sound_time=date("s");
   if($sound_time < 20) {
   	$sound_file_path = $directory_sound . "/" . $sound_file_array[0];
      if(file_exists($sound_file_path)) $sound_file_exists=1;

   } elseif($sound_time < 40) {
      $sound_file_path = $directory_sound . "/" . $sound_file_array[1];
      if(file_exists($sound_file_path)) $sound_file_exists=1;
   }
   else
   {
      $sound_file_path = $directory_sound . "/" . $sound_file_array[2];
      if(file_exists($sound_file_path)) $sound_file_exists=1;
   }
   if(!empty($sound_file_exists)) {
      $bgsound_html_code = "<audio autoplay>\n";
      $bgsound_html_code .= "  <source src=\"" . $sound_file_path . "\" type=\"audio/ogg\">\n";
      $bgsound_html_code .= "</audio>\n";
   }
}
?>

Datei: start.php
<?php
// Internet-Browser-Ermittlung einfuegen
$inc_browser_filename = "inc_browser_user_agent.php";
$inc_browser_file_path = "./inc/" . $inc_filename;
if(file_exists($inc_file_path)) {
   $include_key=1; // siehe: inc_browser_user_agent.php
   include($inc_browser_file_path);
}
if(empty($ogg_sound_support)) $ogg_sound_support=0;

// Backgroundsound einfuegen; erfordert Browser mit ogg-Sound Unterstuetzung
if(!empty($ogg_sound_support)) {
   $inc_bgsound_filename = "inc_background_sound.php";
   $inc_bgsound_file_path = "./inc/" . $inc_bgsound_filename;
   if(file_exists($inc_bgsound_file_path)) {
      $include_key=2; // siehe: inc_background_sound.php
      include($inc_bgsound_file_path);
   }
}
if(empty($bgsound_html_code)) $bgsound_html_code="";
?>
<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>INTERNET-BROWSER ERMITTELN</title>
<style type="text/css">
body {
 margin: 10px 15px 15px 10px;
 font-family: Arial, sans-serif;
 background-color: #FFFFFF;
 color: #000000;
}
</style>
</head>
<body>

<h2>AUFRUFENDE DATEI</h2>

<?php echo $bgsound_html_code; ?>

</body>
</html>

Alternative Loesung:
Der Internet-Browser spielt das 1. unterstuetzte Sound-Format automatisch ab.
Die Sound-Dateien muessen also in den 3 unterstuetzten Formaten vorliegen, d.h.
jeder Sound liegt immer in 3 Versionen vor.

HTML-Code:

[...]
<audio autoplay>
  <source src="./sound/bgsound_a.ogg" type="audio/ogg">
  <source src="./sound/bgsound_a.mp3" type="audio/mp3">
  <source src="./sound/bgsound_a.wav" type="audio/wav">
</audio>
[...]

===============================================================================

G: PSEUDO-VERZEICHNISSCHUTZ MIT PSYCHOLOGISCHER WIRKUNG

Die Datei mit dem Namen index.html ist in ein beliebiges Verzeichnis zu speichern.
Vorsucht ein Webseitenbesucher den Inhalt eines Verzeichnisses sich anzeigen zu
lassen, so wird automatisch die index-Datei aufgerufen (Webserver-Einstellungen).

Der bessere technische Schutz von Verzeichnissen erfolgt ueber spezielle
.htaccess-Dateien oder Webserver-Einstellungen (ACCESS DENIED).

Datei: index.html
<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Access Denied</title>
<script type="text/javascript">
<!-- hide
var timer;
var count=12;
var counter=25;
function load_step_one(k){
 if(document.getElementById) {
  switch(k) {
   case 1:
      if(count >= 0) {
      eval("document.getElementById(" + "\"dogtime\"" + ").innerHTML=" + "\"+&nbsp;" + count + "&nbsp;+\"");
      count--;
      timer=setTimeout("load_step_one(1)",1000);
      }
      else
      {
      timer=setTimeout("load_step_one(2)",3000);
      }
      break;
   case 2:
      var posx=117;
      var posy=150;
      eval("document.getElementById(" + "\"farewell\"" + ").style.left=" + "\"" + posx + "px\"");
      eval("document.getElementById(" + "\"farewell\"" + ").style.top=" + "\"" + posy + "px\"");
      eval("document.getElementById(" + "\"load_b\"" + ").innerHTML=" + "\"" + "loading ...." + "\"");
      timer=setTimeout("load_step_two(1)",1000);
      break;
   case 3:
      eval("document.getElementById(" + "\"load_b\"" + ").innerHTML=" + "\"" + "loading finished" + "\"");
      timer=setTimeout("load_step_one(4)",5000);
      break;
   case 4:
      eval("document.getElementById(" + "\"load_b\"" + ").innerHTML=" + "\"" + "Goodbye and Farewell ;-)" + "\"");
      timer=setTimeout("load_step_one(5)",8000);
      break;
   case 5:
      var posx=-300;
      var posy=150;  
      eval("document.getElementById(" + "\"farewell\"" + ").style.left=" + "\"" + posx + "px\"");
      eval("document.getElementById(" + "\"farewell\"" + ").style.top=" + "\"" + posy + "px\"");
      eval("document.getElementById(" + "\"dogtime\"" + ").innerHTML=" + "\"\"");              
      break;
   default:
      var posx=300;
      var posy=150;
      eval("document.getElementById(" + "\"farewell\"" + ").style.left=" + "\"" + posx + "px\"");
      eval("document.getElementById(" + "\"farewell\"" + ").style.top=" + "\"" + posy + "px\"");
      eval("document.getElementById(" + "\"load_b\"" + ").innerHTML=" + "\"" + "loading ...." + "\"");
      timer=setTimeout("load_step_two(1)",1000);
      break;
      }
   }
}
function load_step_two(i) {
        clearTimeout(timer);
        if(i <= counter) {
        eval("document.getElementById(" + "\"load_a_" + i + "\"" + ").style.backgroundColor=\"#0050A0\"");
        i++;
        eval("timer=setTimeout(\"load_step_two(" + i + ")\",700);");
        }
        else
        {
        timer=setTimeout("load_step_one(3)",100);
        }
}

function stoperror(){
return true
}
window.onerror=stoperror;
//-->
</script>
<style type="text/css">
body {
 margin: 10px 15px 15px 10px;
 font-family: Arial, sans-serif;
 text-align: left;
 background-color: #FFFFFF;
 color: #000000;
}
h3 {
 font-size: 16px;
}
h2 {
 font-size: 14px;
 color: #FF0000;
}
table.load {
 border: 1px solid #B4B4B4;
 background-color: #FFFFFF;
}
table.base {
 border: 1px solid #787878;
 background-color: #F5F5F5;
}
td {
  font-size: 14px;
  background-color: #FFFFFF;
}
td.base {
  font-size: 14px;
  background-color: #E8E8E8;
}
.td_center {
  text-align: center;
}
#dog_time {
  font-size: 25px;
  font-weight: bold;
  text-align: center;
  color: #000000;
}
#farewell {
  position: absolute;
  left: -300px;
  top: 150px;
  z-Index: 3;
}
#load_b {
  position: relative;
}
</style>
</head>
<body onLoad="setTimeout('load_step_one(1)',5000);">
<table>
  <tr>
    <td class="td_center"><h3>+++ ZUGRIFF VERWEIGERT +++ ACCESS DENIED +++</h3></td>
  </tr>
  <tr>
    <td class="td_center"><h2>WARNING: Wild dog coming!</h2></td>
  </tr>
  <tr>
    <td id="dog_time"><span id="dogtime"></span></td>
  </tr>
</table>
<div id="farewell">
  <table class="base">
    <tr>
      <td class="base">Farewell v0.9</td>
    </tr>
    <tr>
      <td><table class="load">
        <tr>
          <td id="load_a_1">&nbsp;</td>
          <td id="load_a_2">&nbsp;</td>
          <td id="load_a_3">&nbsp;</td>
          <td id="load_a_4">&nbsp;</td>
          <td id="load_a_5">&nbsp;</td>
          <td id="load_a_6">&nbsp;</td>
          <td id="load_a_7">&nbsp;</td>
          <td id="load_a_8">&nbsp;</td>
          <td id="load_a_9">&nbsp;</td>
          <td id="load_a_10">&nbsp;</td>
          <td id="load_a_11">&nbsp;</td>
          <td id="load_a_12">&nbsp;</td>
          <td id="load_a_13">&nbsp;</td>
          <td id="load_a_14">&nbsp;</td>
          <td id="load_a_15">&nbsp;</td>
          <td id="load_a_16">&nbsp;</td>
          <td id="load_a_17">&nbsp;</td>
          <td id="load_a_18">&nbsp;</td>
          <td id="load_a_19">&nbsp;</td>
          <td id="load_a_20">&nbsp;</td>
          <td id="load_a_21">&nbsp;</td>
          <td id="load_a_22">&nbsp;</td>
          <td id="load_a_23">&nbsp;</td>
          <td id="load_a_24">&nbsp;</td>
          <td id="load_a_25">&nbsp;</td>
        </tr>
      </table></td>
    </tr>
    <tr>
      <td class="base"><span id="load_b" style="position:relative"></span></td>
    </tr>
  </table>
</div>
</body>
</html>

===============================================================================

H: UNTERSCHIEDLICHE WEBSEITEN FUER VERSCHIEDENE INTERNET-BROWSER ANBIETEN

Das PHP-Skript benoetigt 2 Verzeichnissse (./inc und ./test). Oberhalb dieses
Verzeichnisses befindet sich die Datei start.php.

Im Verzeichnis ./inc ist die Datei ./inc_browser_user_agent.php und im
Verzeichnis ./test ist eine index.php mit beliebigen HTML- und PHP-Code
zu speichern.

Datei: inc_browser_user_agent.php
<?php
// +++ ANFANG KONFIGURATION +++
$user_agent_name_array = array('Firefox', 'Chrome', 'Opera'); // Array mit den Browser-Namen, entsprechend der Angabe im UserAgentString
// +++ ENDE KONFIGURATION +++
if(empty($include_key)) exit; // verhindert die Ausfuehrung der include-Datei bei einem direkten Aufruf

$user_agent_string = $_SERVER['HTTP_USER_AGENT'];

/*
Broweserermittlung (Firefox, Iceweasel => gibt sich als Firefox aus, Chrome und
Opera) fuer browserspezifischen Code; Achtung: z.B. Opera 11 gibt sich als
Opera/9.80 ..... Version/11.1 im UserAgentString aus; 
*/
$ogg_sound_support=0;
if(preg_match("@" . $user_agent_name_array[0] . "/@i", $user_agent_string) ||
   preg_match("@" . $user_agent_name_array[1] . "/@i", $user_agent_string)) {
   if(preg_match("@" . $user_agent_name_array[0] . "/[1-9][0-9]{1,2}\.[0-9]@i", $user_agent_string) ||
      preg_match("@" . $user_agent_name_array[1] . "/[1-9][0-9]{1,2}\.[0-9]@i", $user_agent_string)) {
      // Firefox, Chrome ab Version 10.0 bis 999.9 testen
      $ogg_sound_support=1;
   } elseif(preg_match("@" . $user_agent_name_array[0] . "/[4-9]\.[0-9]@i", $user_agent_string) ||
            preg_match("@" . $user_agent_name_array[1] . "/[4-9]\.[0-9]@i", $user_agent_string)) {
            // Firefox, Chrome ab Version 4.0 bis 9.9 testen
            $ogg_sound_support=1;
   }
} elseif(preg_match("@" . $user_agent_name_array[2] . "/@i", $user_agent_string)) {
         if(preg_match("@" . $user_agent_name_array[2] . "/[2-9][0-9]{1,2}\.[0-9]@i", $user_agent_string)) {
            // Opera ab der Version 20.0 bis 999.9 testen
            $ogg_sound_support=1;
         } elseif(preg_match("@Version/[1-9][0-9]{1,2}\.[0-9]@i", $user_agent_string)) {
                  // Opera ab der Version 10.0 bis 999.9  testen
                  $ogg_sound_support=1;
         }
}
?>

Datei: start.php
<?php
// Internet-Browser-Ermittlung einfuegen
$inc_browser_user_agent_filename = "inc_browser_user_agent.php";
$inc_browser_user_agent_file_path = "./inc/" . $inc_browser_user_agent_filename;
if(file_exists($inc_browser_user_agent_file_path)) {
   $include_key=1; // siehe: inc_browser_user_agent.php
   include($inc_browser_user_agent_file_path);
   // include-Datei liefert Return-Code $ogg_sound_support=1 oder 0
}
if(empty($ogg_sound_support)) $ogg_sound_support=0;

// Link zur TEST-Webseite erfordert Browser mit ogg-Sound Unterstuetzung
if(!empty($ogg_sound_support)) {
   $website_html_code = "<a href=\"./test/index.php\" onMouseOut=\"this.style.color='#8C8C8C'\" onMouseOver=\"this.style.color='#FF7B00'\"><div onMouseOut=\"this.style.fontSize='14px'\" onMouseOver=\"this.style.fontSize='14px'\"><b>Test-Webseite</b></div></a>";
}
if(empty($website_html_code)) $website_html_code="&nbsp;";
?>
<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>UNTERSCHIEDLICHE WEBSEITEN FUER VERSCHIEDENE INTERNET-BROWSER</title>
<style type="text/css">
body {
 margin: 10px 15px 15px 10px;
 font-family: Arial, sans-serif;
 background-color: #FFFFFF;
 color: #000000;
}
</style>
</head>
<body>

<h2>AUFRUFENDE DATEI</h2>

<?php echo $website_html_code; ?>

</body>
</html>

===============================================================================

I: ZUGANGSDATEN - BENUTZERNAMEN UND PASSWORT - VERSCHLUESSELT ABSPEICHERN

Datei: login_1.dat
id|db_nr|status|create_time|change_time|user_name|password|role
4|2|1|10|10|32|32|128
1|1|1|1363864682|1377513045|5cc82ddcfc2370250502a164446ca5bd|cb212035b7bce92ef3ae83842f18db09|Admin
2|1|1|1363864682|1377513045|2462f11a3089be32627b3782de221f96|446ca5bd5b7bce9efae83842f183842f|Co-Admin
[...]

Aufbau einer Text- oder CSV-Datei
1. Zeile: enthaelt die internen System- und Daten-Feldnamen: nur englisches
   Alphabet, Zahlen und den Unterstrich (_); Kleinschreibweise ist zu bevorzugen;
   die sichtbaren Feldnamen werden aus einer speziellen Datei entnommen

2. Zeile enthaelt die maximale Zeichenlaenge fuer das entsprechende Feld; die
   ersten 5 Felder sind interne Felder fuer das System; die maximale
   Zeichenlaenge bezieht die Seite aus einer speziellen Datei
  
3. Zeile und die weiteren Zeilen:
1|1|1|1363774430|1363775430| | | 
  1. id
  2. Datendatei-Nr. oder Datenbank-Nr., jede Text-Datenbank erhaelt eine eigene Nr.
     siehe: Dateiname - login_1.dat, ...
  3. Status: 1 ... aktiv, 0 ... geloescht
     Status 0: die Daten dieses Datensatzes werden erst ueberschrieben, wenn ein
     neuer Datensatz gespeichert werden soll; bis zu diesen Zeitpunkt koennen die
     als geloescht gekennzeichneten Daten wiederhergestellt werden (Status -> 1)
  4. Create Time: Unix-Zeitstempel
  5. Change Time: Unix-Zeitstempel
  6. Benutzername - md5-verschluesselt (32 Zeichen)
  7. Passwort - md5-verschluesselt (32 Zeichen)
  8. Rolle z.B. Admin, Co-Admin, Hauptbenutzer, Redakteur, Benutzer, ...

<?php

[...]

/*
Benutzername und Passwort werden in ein Formular eingetragen und mit der
POST-Methode uebergeben; Benutzername und Passwort werden in einer
Datenbank verschluesselt eingetragen

Voraussetzungen:
- CSV-Datei login_1.dat existiert bereits
- login_1.dat enthaelt bereits 3 Datensaetze
  1. die internen Feldnamen
  2. die Zeile mit der maximalen Zeichenanzahl
  3. die Zugangsdaten des Benutzers Admin
- Dateipfad der CSV-Datei -> $login_csv_file_path = "./data/login_1.dat";
- Neueintrag eines neuen Benutzers -> Rolle: Co-Admin
*/

// EINTRAGEN EINES NEUEN BENUTZERS
if(!empty($_POST['user_name']) && !empty($_POST['user_password']) {
   $user_name_data = trim($_POST['user_name']);
   $user_name_length = strlen($user_name_data);
   $user_password_data = trim($_POST['user_password']);
   $user_password_length = strlen($user_password_data);
   if($user_name_length <= 128 || $user_password_length <= 128) {
      $user_name_data = base64_encode($user_name_data);
      $user_name_data = md5($user_name_data);
      $user_password_data = base64_encode($user_password_data);
      $user_password_data = md5($user_password_data);
      if(file_exists($login_csv_file_path)) {
         $user_create_time = time();
         $user_change_time = time();
         $login_new_content = "2|1|1|" . $user_create_time . "|" . $user_change_time . "|" . $user_name_data . "|" . $user_password_data  . "|Co-Admin\n";
         if($file_w = @fopen($login_csv_file_path,'a')) {
           @flock($file_w,2);
           @fwrite($file_w, $login_new_content);
           @flock($file_w,3);
           @fclose($file_w);
         }
         else
         {
         print '<b>ERROR: FILE ' . $login_csv_file_path . ' CAN NOT WRITE!</b>';
         exit;
         }
      }
      else
      {
      print '<b>ERROR: FILE ' . $login_csv_file_path . ' NOT FOUND!</b>';
      exit;
      }
   }
   else
   {
   // Hinweis: Benutzername oder Passwort ist zu lang.
   }
}

[...]

/*
VERGLEICH VON EINGEBENEN ZUGANGSDATEN MIT DEN GESPEICHERTEN DATEN

[...]
// Benutzername und Password aus der login_1.dat
$login_file_array = file($login_csv_file_path);
$login_data_record_array = explode('|', $login_file_array[3]);

[...]
// Benutzername und Passwort ueber die POST-Methode uebergeben
$user_name_data = trim($_POST['user_name']);
$user_name_data = base64_encode($user_name_data);
$user_name_data = md5($user_name_data);
$user_name_compare = strcmp($login_data record_array[5], $user_name_data);
if($user_name_compare == 0) {
   /* gespeicherter und verschluesselter Benutzername ist mit dem eingegeben und
   verschluesselten Login-Namen identisch */
}

$user_password_data = trim($_POST['user_password']);
$user_password_data = base64_encode($user_password_data);
$user_password_data = md5($user_password_data);
$user_password_compare = strcmp($login_data_record_array[6], $user_password_data);
if($user_password_compare == 0) {
   /* gespeichertes und verschluesseltes Passwort ist mit dem eingegeben und
   verschluesselten Passwort identisch */
}

[...]

*/

?>

===============================================================================
