#!/usr/bin/perl

use CGI qw/:standard/;

$ausgabe="";


$datapath = "data";
$interndir = "intern";


# Das ist die coolste Variable der Welt

$space = "                                                ";

$kommando = param("kommando");

# $dir ist das aktuelle Verzeichnis

$dir = param("dir");
$dir = "" if !defined($dir);

# $altdir ist das Verzeichnis von vorhin

$altdir = param("altdir");
$altdir = "" if !defined($altdir);

# $browser ist entweder ns4, ie4 oder lynx. lynx ist default

$browser = param("browser");
$browser = "lynx" if !defined($browser);

# $klick ist aktuelle fortlaufende Nummer der Felder, die Klick-Kommandos beherbergen.

$klick = param("klick");

$kommando = lc($kommando);
($befehl,$datei) = split(/\s/,$kommando);

$anz_zeilen = param("zeilen");
$zeilen = 0 if !defined($zeilen);

$start = param("start");

$lang = param("lang");
$lang="e" if !defined($lang);

@text = ();


if (($befehl eq "dir") || ($befehl eq "ls") || ($befehl eq "list") )
	{
		dir();
	} 
elsif (($befehl eq "type") || ($befehl eq "more") || ($befehl eq "less") || ($befehl eq "view"))
	{
		type("$datapath/$dir/$datei");
	} 
elsif ($befehl eq "cd")
	{
		cd();
	}
elsif (($befehl eq "?") || ($befehl eq "help")) {
	if ($lang eq "d") {
		type("$interndir/hilfe.txt");
	}
	if ($lang eq "e") {
		type("$interndir/help.txt");
	}		
}
elsif ($befehl eq "boot")
	{
		type("$interndir/boot.d.txt") if $lang eq "d";
		type("$interndir/boot.e.txt") if $lang eq "e";
	}
elsif ($befehl eq "print")
	{
		if(($browser eq "ie4")||($browser eq "ns4")) {
			pprint("$datapath/$dir/$datei");
		} else {
			@text = "NOT SUPPORTED IN THIS VERSION";
			# print `perl -w print.pl datei=$dir/$datei`;
			# return;
		}
		
	}
elsif (($befehl eq "get") || ($befehl eq "retr") || ($befehl eq "recv"))
	{
		download("$datapath/$dir/$datei");
	}

else
	{
		@text = "SYNTAX ERROR";
	}	
	

if ($browser eq "ie4")
	{
		$onload="onLoad='parent.import_frame();'";
		$onsubmit="onsubmit=''";
	}

if ($browser eq "ns4")
	{
		$onload="onLoad='setTimeout(\"import_frame();\",100)'";
		$onsubmit="onsubmit=''";
	}
	
versteckte();
	


#
# HTML zusammenbauen
#

#                       _   _  _  _____            _
#                      | | | |(_)|_   _|___   ___ | |__
#                      | |_| || |  | | / _ \ / __|| '_ \
#                      |  _  || |  | ||  __/| (__ | | | |
#                      |_| |_||_|  |_| \___| \___||_| |_|
#                     ____   _   _  _____  __  __  _      _
#                    |  _ \ | | | ||_   _||  \/  || |    | |
#                    | | | || |_| |  | |  | |\/| || |    | |
#                    | |_| ||  _  |  | |  | |  | || |___ |_|
#                    |____/ |_| |_|  |_|  |_|  |_||_____|(_)

# Die HiTech Version besteht aus einer Field-Gefüllten HTML-Datei, die in ein
# unsichtbares Frame oder einen unsichtbaren Layer geladen wird und mittels einer
# onload-Funktion die Daten an das Darstell-Script im Hauptframe übergibt.

if(($browser eq "ie4") || ($browser eq "ns4")){

# Dateikopf & das Formular, das die aktuellen Daten speichert (kommando,
# Anzahl der Klick-Fields etc ...

$ausgabe .= <<__DHTMLENDE;
<HTML>
<BODY $onload>

<FORM name="f" $onsubmit>
Kommando: <INPUT name="kommando" value=""> <input type="submit" name="ok" value=" OK ">
Klicks: <input name="klick" value="$klick">
Dir: <INPUT name="dir" value="$dir">
Browser: <INPUT name="browser" value="$browser">
</FORM>

<hr>

<FORM name="pipe"><PRE>
__DHTMLENDE

# Jede Zeile wird in ein Field geschrieben, Fields sind von z0 bis zn durchnummeriert

$i=0;
foreach $text (@text){
	$ausgabe .= "Zeile $i: <INPUT name='z$i' value=\"$text\" size=80>\n";
	$i++;
}

# field allz speichert die Anzahl der Zeilen

$ausgabe .= "allz: <INPUT name='allz' value=\"$i\" size=3>\n";

# Objekte werden mit fieldname und value gespeichert

foreach $key (keys(%objekt)){
	$ausgabe .= "$key: <INPUT name='$key' value='$objekt{$key}'>\n";
}

# Das wars schon.

$ausgabe .= '</PRE></FORM></HTML>';

} else {

#  _          _____            _      __     __                _
# | |     ___|_   _|___   ___ | |__   \ \   / /___  _ __  ___ (_)  ___   _ __
# | |    / _ \ | | / _ \ / __|| '_ \   \ \ / // _ \| '__|/ __|| | / _ \ | '_ \
# | |___| (_) || ||  __/| (__ | | | |   \ V /|  __/| |   \__ \| || (_) || | | |
# |_____|\___/ |_| \___| \___||_| |_|    \_/  \___||_|   |___/|_| \___/ |_| |_|

# wenn kein DHTML-Brauser; LYNX, Netscape 3, etc

# Bei der LoTech-Version gehört zu jeder ausgegebenen Zeile auch ein hidden form field,
# in der das gleiche nochmal drinsteht. Das sorgt dafür, daß der Bildschirm hochscrollen kann,
# weil die alten Zeilen immer weitergegeben werden


# Beim Start erstmal alle Zeilen leermachen

if(!($start eq "jawohl")){

	@zeilen = ();
	
	for($i=0;$i<$anz_zeilen;$i++){
		push (@zeilen, param("z".$i));
	}


	# unten kommt das zuletzt eingetippte kommando
	push (@zeilen, " ", "$altdir&gt; $kommando");
}

# als letzte Zeile kommt der Prompt mit dem aktuellen Verzeichnis

push (@text, " ", $dir."&gt; ");

# Hier kommt der Kopf der HTML-Datei mit dem Anfang der Tabelle

$ausgabe = <<__ENDE;

<html><head>
<title>BODENST&Auml;NDIG 2000 - DATENBANK (lotech version)</title>
<style type="text/css"><!--
	a:link {text-decoration:none;}
	a:hover {text-decoration:underline;}
//--></style>
</head>

<body bgcolor="#000000" text="#00cc00" link="#00ff00" vlink="#00ff00" alink="#00ff00">
<form method="post" name="f"><table border=0 cellpadding=0>
__ENDE

# Tabellenzelle mit dem Text

$ausgabe .= '<tr><td bgcolor="#003800" valign=top><pre><font face="fixedsys, monaco, courier, mono">';


# Text aus vorherigem Bildschirm übernehmen, so daß mindestens 24 Zeilen voll werden

$alte_zeilen = $#zeilen+1;
$neue_zeilen = $#text;

$uebernehmen = ($alte_zeilen - ( 24 - $neue_zeilen));

$i=0;

for($ii=$uebernehmen; $ii<$alte_zeilen; $ii++){
	$ausgabe .= $zeilen[$ii];
	$ausgabe .= "<INPUT type=hidden name='z$i' value=\"$zeilen[$ii]\">\n";
	$i++;
}

# Hier wird der neue Text angehängt. Das können mehr als 24 Zeilen sein.

for($ii=0; $ii<$#text; $ii++) {
	$ausgabe .= $text[$ii];
	$ausgabe .= "<INPUT type=hidden name='z$i' value=\"$text[$ii]\">\n";
	$i++;
}

# der blinkende Cursor wird angehängt

$ausgabe .= $text[$#text]."<img src='cursor.gif' alt='_' width=9 height=1>\n";

# unten eine 80 Zeichen breite Leerzeile, damit die Breite immer gleich bleibt

$ausgabe .= '                                                                              ';

# Anzahl der Zeilen mitgeben im hidden-field "zeilen"

$ausgabe .= "<input type=\"hidden\" name=\"zeilen\" value=\"$i\">";

# Tabellenzelle mit Text zu

$ausgabe .= "</font></pre></td><td valign=top bgcolor=#222222><font face='fixedsys, monaco, courier, mono' color='#000000'>";

#
# Hier kommen die Gimmicks, also Bilder und Musik und Hilfe und so ...
#

foreach $key (keys(%objekt)){

	# Bild gefunden?

	if ($key eq "bild") {
		$bildfund="bilder/$objekt{$key}";
	}

	# Ton gefunden?

	if ($key eq "ton") {
		$soundfund="<a href='sound/$objekt{$key}'><font color='#666666'>sound</font></a>";
	}
	
	# hilfe vorhanden?
	# Wissenschaftler erzeugt Link in einem anderen Fenster, sofern möglich
	
	if ($key eq "help") {
		$helpfund="<a href='prof.pl?datei=help/$objekt{$key}' target='prof'><font color='#cccccc'>?</font></a>";
	}
	
	if ($key eq "hires") {
		$hiresfund="<a href='hires/$objekt{$key}'><font color='#666666'>hires</font></a>";
	}
}


# Wenn nichts dergleichen gefunden wird, dann muß eben jeweils nichts da hin

$bildfund="bilder/logo.jpg" if !defined($bildfund);
$soundfund="sound" if !defined($soundfund);

if (!defined($helpfund)) {
	if($lang eq "d") {
		$helpfund="<a href='prof.pl?datei=help/default.d.html' target='prof'><font color='#666666'>?</font></a>";
	} else {
		$helpfund="<a href='prof.pl?datei=help/default.e.html' target='prof'><font color='#666666'>?</font></a>";
	}
}

$hiresfund = "hires" if !defined($hiresfund);
	

# Jetzt die Extras hintereinander hinschreiben

$ausgabe .= "<img src='$bildfund' width=320 height=240 alt=''><br>";
$ausgabe .= $helpfund;
$ausgabe .= "&nbsp;";
$ausgabe .= $soundfund;
$ausgabe .= "&nbsp;";
$ausgabe .= $hiresfund;

# Der Link zu Home ist immer da

$ausgabe .= "\n\n<br><a href="."><font face='fixedsys, monaco, courier, mono' color='#666666'>home</font></a>";


# graue Tabellenzelle beendet

$ausgabe .= "</font></td></tr></table>";


# Das Eingabefeld und der ganze Rest

$ausgabe .= <<__ENDE;
<table border=0 cellspacing=0 bgcolor=silver><tr><td>
 <input name="kommando" size="60" type="text"> </td><td> <input type="submit" value="  OK  "> 
<INPUT type="hidden" name="dir" value="$dir"></td></tr></table>
<INPUT type=hidden name='altdir' value=\"$dir\">
<input type=hidden name='lang' value=\"$lang\">
</form>

<script language="JavaScript"><!--
	document.f.kommando.focus();
//--></script>

</body></html>

__ENDE
	
### Hier ist der Bereich für Netscape3 und Lynx und so vorbei!

}

#                   ___               _   _        _
#                  |_ _| _ __   ___  | \ | |  ___ | |_  ____
#                   | | | '_ \ / __| |  \| | / _ \| __||_  /
#                   | | | | | |\__ \ | |\  ||  __/| |_  / /
#                  |___||_| |_||___/ |_| \_| \___| \__|/___|
#                  _      _              _                _
#                 | |__  | |  __ _  ___ | |_  ___  _ __  | |
#                 | '_ \ | | / _` |/ __|| __|/ _ \| '_ \ | |
#                 | |_) || || (_| |\__ \| |_|  __/| | | ||_|
#                 |_.__/ |_| \__,_||___/ \__|\___||_| |_|(_)


	$| = 1;
	if ($browser eq "lynx") {
		print header('-expires' => '300s', 'Content_length' => length($ausgabe))
	} else {
		print header('-expires' => '0s', 'Content_length' => length($ausgabe))
	}
	print $ausgabe;	
	$| = 0;


#
# Unterfunktionen
#


# dir, ls ...

sub dir
	{
	my (@datei, @ordner, $dateiinfo, $i, $len, $time);
	
	$datei =~ s/\*//g; # sterne aus suchstrings raus

	if(length($dir)>1)
		{
		opendir DIR, "$datapath/$dir";
		}
	else
		{
		opendir DIR, "$datapath";
		}
	
	foreach $direntry (sort (readdir(DIR)))
		{
		
		next if $direntry eq ".";
		next if (($direntry =~ /^\./) && (!($direntry eq "..")));
		if(length($datei)>0) {next if (!($direntry =~ /$datei/));}
		
		$dateiinfo = $direntry;
		
		$dateiinfo .= substr ($space,0,20-length($dateiinfo));
		
		($len,$time) = (stat ("$datapath/$dir/$direntry"))[7,9];
				
		$time = scalar(localtime($time));
		
		# Wenn es ein Verzeichnis ist

		if (-d "$datapath/$dir/$direntry")
		{
			$len ="[DIR]" ;
			$len = substr ($space,0,10-length($len)).$len;
		
			# Der Exploder braucht klickbare Ordner

			if($browser eq "ie4")
			{
				$klickliste= "klick".$klick;
				$objekt{$klickliste} = $dateiinfo;
				$dateiinfo = "<a onclick='auto_cd($klick)'>$dateiinfo</a>";

				$klick++;
			}


			
		}else{

		$len = substr ($space,0,10-length($len)).$len;
		
			# Der Exploder braucht klickbare Dateien

			if($browser eq "ie4")
			{
				$klickliste= "klick".$klick;
				$objekt{$klickliste} = $dateiinfo;
				$dateiinfo = "<a onclick='auto_more($klick)'>$dateiinfo</a>";
				
				$klick++;
			}
			
	
		}
					
		$dateiinfo .= "$len   $time";
		
		push (@datei,$dateiinfo) if -f "$datapath/$dir/$direntry";
		push (@ordner,$dateiinfo) if -d "$datapath/$dir/$direntry";
		}
	
	closedir DIR;
	
	push (@text, @ordner);
	push (@text, @datei);

	}





#
# Texte ausgeben !!!
#

sub type {

	push (@text, " ");

	$feile = $_[0];
	
	if (-f $feile) {
	
		open FILE, $_[0];

		while (<FILE>){

			# hier werden bilder oder ähnliches bearbeitet

			if ($_ =~ /^%(.+)\s+(.+)/) {
				$glglgl = $2;
				chomp($glglgl);
				$objekt{$1} = $2;

			} else {
				
				# hier werden links behandelt

				if($_ =~ /<%(.+)\s+(.+)>(.+)<\/%>/) {

					# wenn es ein download-link ist
				
					if($1 eq "file"){
					
						if($browser eq "ie4") {
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='files/$2'><span style='background-color:lime;color:black'>$3</span></a>|gi;
						} elsif($browser eq "ns4") {
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='files/$2'>$3</a>|gi;
						} else {
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='files/$2'>$3</a>|gi;
						}
					
					# mail
					
					}elsif ($1 eq "mail"){

						if($browser eq "ie4") {
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='mailto:$2'><span style='background-color:lime;color:black'>$3</span></a>|gi;
						} elsif ($browser eq "ns4") {
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='mailto:$2'>$3</a>|gi;
						} else {
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='mailto:$2'>$3</a>|gi;
						}

					} else {
					
						# wenn es irgend ein anderer link ist

						if ($browser eq "ie4"){
		
							$klickliste= "klick".$klick;
							$objekt{$klickliste} = $2;
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='$objekt{$klickliste}' onclick='$1($klick); return false;' style='background-color:lime;color:black'>$3</a>|gi;
							$klick++;
						
						} elsif ($browser eq "ns4") {
						
							$klickliste= "klick".$klick;
							$objekt{$klickliste} = $2;
							$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='$objekt{$klickliste}' onclick='$1($klick); return false;'>$3</a>|gi;
							$klick++;
					
						#
						# hier lynx & co
						#
	
						} else { 
						
							# wenns nur ein braus-verweis ist, dann auch nur ein href

							if($1 eq "braus") {
								$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='$2'>$3</a>|gi;

							# ist es der wissenschaftler, target eintragen für neues fenster

							} elsif($1 eq "prof") {
								$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='$1.pl?datei=$2' target='prof'>$3</a>|gi;
							
							} else {
								$_ =~ s|<%(.+)\s+(.+)>(.+)</%>|<a href='$1.pl?datei=$2'>$3</a>|gi;
							}
												
						}
					
					}
					
				}

				chomp($_);
				
				push @text, $_;
			}
		}
	close FILE;

	} else {
		@text = "ERROR: FILE NOT FOUND";
	}


}

## der Drucker wird angeschmissen!

sub pprint {
	my $mix;
	
	$mix=$dir."/".$datei;
	
	if (-f $_[0]) {
		
		$objekt{"print"} = $mix;
		push @text, "PRINTING $mix ...";		
	} else {
		push @text, "ERROR: FILE NOT FOUND";
	}

}

## Datei downloaden!

sub download {
	
	my ($style);
	
	if (-f $_[0]) {
		if ($browser eq "ie4"){$style="style='background-color:lime;color:black'" } else {$style =""}
		push @text, "Download-Link: <a href='$_[0]' $style>$datei</a>";
	} else {
		push @text, "ERROR: FILE NOT FOUND";
	}
}

	
# in ein neues verzeichnis wexeln

sub cd 
	{
	@dirsteps = split(/\//, $datei);
	@aktdir = split(/\//, $dir);
	foreach $wohin (@dirsteps)
		{
		if ($wohin eq "..")
			{
			pop(@aktdir)
			}
		else
			{
			push(@aktdir, $wohin)
			}
		}

		if(-d "$datapath/".join("/",@aktdir))
			{
			$dir = join("/",@aktdir)."/"
			}
		else
			{
			push (@text, "ERROR: DIR NOT FOUND");
			}
		#push (@text, $dir);

#	if ($datei eq "..")
#		{
#		if ($dir eq "")
#			{
#			@text = "Error: Root";
#			}
#		else
#			{
#			$dir =~ s#(.*)/.+$#$1#g;
#			}
#		}
#	else
#		{
#	
#		## Verzeichnis erfolgreich gewexelt!
#		
#		if (-d "$datapath$dir/$datei") {
#
#			$dir .= "/".$datei;
#			
#
#	
#		} else {
#			@text = "ERROR: DIR NOT FOUND";
#		}
#	}
	}

# versteckte dateien von directories in felder eintragen

sub versteckte {
	
	my ($dateiname, $feldname, $direntry, $feldname);
	
	opendir XDIR, "$datapath$dir";

	foreach $direntry (sort (readdir(XDIR))) {
		
		if($direntry =~ /^\./) {
			$dateiname = "$datapath$dir/$direntry";
			
			$feldname = $direntry;
	
			open XFILE, $dateiname;
			while (<XFILE>){
				chomp($_);
				$objekt{substr ($feldname,1,length($feldname))} = $_;
			}
			close XFILE;
		}
	}
			
	closedir XDIR;

}

