#! /usr/bin/perl -w
use strict;
use vars qw ( $ENCODE_EXCEPT $BASEDIR $HTMLFILE %data $DELIMETER $DEBUG $body $where $sig $BROWSE_SCRIPT @MONTH %FILETYPE $DIR_CLASS1 $DIR_CLASS2 $SCRIPT $status $TXT_TYPE $IMG_TYPE $HTTP_BASE );

$ENCODE_EXCEPT = 'a-zA-Z0-9\%';
$BASEDIR = '/var/www/fallman.org/daniel.fallman.org/resources/';
$HTTP_BASE = '/resources/';
$HTMLFILE = '/var/www/fallman.org/daniel.fallman.org/browsedata/template/.view.html';
$DELIMETER = ';';
$DEBUG = 1;
$SCRIPT = 'http://daniel.fallman.org/view.cgi';
$BROWSE_SCRIPT = 'http://daniel.fallman.org/browse2.cgi';
@MONTH = ( 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec' );

$IMG_TYPE = 'jpg|jpeg|gif|png|bmp';
$TXT_TYPE = 'txt|bib|c|h|cmd';



$DIR_CLASS1 = 'dir1';
$DIR_CLASS2 = 'dir2';

$body = $where = $sig = $status = '';

%data = &GetData();

if( !defined($data{'file'}) || ($data{'file'} eq '') ) {
	print <<EOF;
Location: $BROWSE_SCRIPT

EOF
	exit;
};


my ($file) = $data{'file'};
my ($found) = 0;

if( ($found == 0) && ($file =~ /\.$IMG_TYPE$/i) ) {
	&ViewImage($data{'file'});
	$found = 1;
};

if( ($found == 0) && ($file =~ /\.$TXT_TYPE$/i) ) {
	&ViewText($data{'file'});
	$found = 1;
};


if( $found ) {
	print "Content-Type: text/html\n\n";

	open(FIL,$HTMLFILE) or &Error("can't open '$HTMLFILE' for reading ($!)");
	while( defined($_ = <FIL>) ) {
		s/<\!-- insert body here --\>/$body/;
		s/<\!-- insert location here --\>/$where/;
		s/<\!-- insert signature here --\>/$sig/;
		s/<\!-- insert status here --\>/$status/;

		print;
	};
	close(FIL);
} else {
	print <<EOF;
Location: $file

EOF
};
exit;


###
#########################################################################################################################################################################################################################################################

sub ViewImage
{
	my ($file) = @_;

	$file =~ s/^([\.\/]+)//g;
	$file =~ s/(\.\.)(\/)?//g;


	$where = &Quote("/$file");
	
	
	if( -e $BASEDIR.$file ) {
		my ($encodefile) = $HTTP_BASE.&Encode($file);
		$encodefile =~ s/\%2F/\//g; # Va fult.
		$body .= <<EOF;
<img src="$encodefile" alt="$encodefile">
EOF
	} else {
		$body .= "no such file.";
	};

	if( defined($ENV{'HTTP_REFERER'}) ) {
		$status .= '<br><a href="'.$ENV{'HTTP_REFERER'}.'">back</a>';
	} else {
		my ($temp) = $file;
		$temp =~ s/\/([^\/]+)$//;
		$status .= '<br><a href="'.$BROWSE_SCRIPT.'?dir='.$temp.'">back</a>';
	};

#	$body .= &Debug('env');
};

sub ViewText
{
	my ($file) = @_;

	$file =~ s/^([\.\/]+)//g;
	$file =~ s/(\.\.)(\/)?//g;

	$where = "/$file";
	
	if( -e $BASEDIR.$file ) {
		if( open(FIL,$BASEDIR.$file) ) {
			$body = "<table><tr><td align=\"left\"><pre>\n";
			while( defined($_ = <FIL>) ) { $body .= $_; };
			$body .= "\n</pre></td></tr></table>";
		} else {
			$body = $!;
		};
	} else {
		$body .= "No such file.";
	};

	if( defined($ENV{'HTTP_REFERER'}) ) {
		$status .= '<a href="'.$ENV{'HTTP_REFERER'}.'">back</a>';
	} else {
		my ($temp) = $file;
		$temp =~ s/\/([^\/]+)$//;
		$status .= '<a href="'.$BROWSE_SCRIPT.'?dir='.$temp.'">back</a>';
	};

};


sub Error
{
	my ($string) = @_;
	my ($pack,$script,$line) = caller();

	print <<EOF;

<b>error!</b><br>
<br>
<blockquote>$string</blockquote><br>
at line $line<br>
<br>
EOF

	exit;
};








sub Debug
{
	my ($mode,$extra,$extra2) = @_;
	my ($bg1,$bg2,$bg3,$bgtemp,$cap,$item,$key,$fel,$knark,$lop);
	my ($out) = '';

	if( !$DEBUG ) { return; };

	if( !defined($mode) ) { return; };

	if( $mode eq 'data' ) {
		$bg1 = '#0000FF';
		$bg2 = '#0000DD';
		$bg3 = '#0000CC';
		$cap = '%data';
		$key = \%data;
	};
	
	if( $mode eq 'env' ) {
		$bg1 = '#FF00FF';
		$bg2 = '#DD00DD';
		$bg3 = '#CC00CC';
		$cap = '%ENV';
		$key = \%ENV;
	};

	if( $mode eq 'query' ) {
		$bg1 = '#FFFF00';
		$bg2 = '#DDDD00';
		$bg3 = '#CCCC00';
		$cap = '[query]';
		$key = undef;
	};

	if( $mode eq 'custom' ) {
		$bg1 = '#00FFFF';
		$bg2 = '#00DDDD';
		$bg3 = '#00CCCC';
		$cap = '['.$extra2.']';
		$key = undef;
	};

	if( !defined($bg1) || !defined($bg2) || !defined($cap) ) { return -1; };

	if( !defined($bg3) ) { $bg3 = $bg2; };

	$out .= <<EOF;
<table border="0" cellpadding="2" cellspacing="0" width="100%">
<tr bgcolor="$bg1">
	<td width="1%">&nbsp;</td>
	<td width="98%" align="center">
		<h2>$cap</h2>
	</td>
	<td width="1%">&nbsp;</td>
</tr>
<tr bgcolor="$bg2">
	<td width="1%">&nbsp;</td>
	<td width="98%">
EOF
	if( defined($key) ) {
		$out .= <<EOF;
		<table border="0" cellpadding="2" cellspacing="0" width="100%">
EOF
		$lop = 0;
		foreach $item ( sort keys %{ $key } ) {
			$fel = (defined($key->{$item}) ? $key->{$item} : 'NULL' );

			if( ($lop = !$lop) == 0 ) {
				$bgtemp = $bg2;
			} else {
				$bgtemp = $bg3;
			};

			$out .= <<EOF;
<tr bgcolor="$bgtemp">
	<td width="1%" nowrap valign="top">
		<b>$item</b>&nbsp;
	</td>
	<td width="99%" valign="top">
		<i>'$fel'</i>
	</td>
</tr>
EOF
		};
		$out .= <<EOF;
		</table>
EOF
	} else {
		my ($temp) = &Quote($extra);
		$out .= <<EOF;
		<blockquote>
			'$temp'
		</blockquote>
EOF
	};
	
	$out .= <<EOF;
	</td>
	<td width="1%">&nbsp;</td>
</tr>
</table>
<br>
EOF
	return $out;
};



sub Quote
{
	my ($str) = @_;
	if( !defined($str) ) { return undef; };
	# hehe, borde quota '&' till '&amp;' oxo, men det är så svårt, den ska ju INTE skära sig med de andra quote-ningarna....
	$str =~ s/å/&aring;/g;
	$str =~ s/Å/&Aring;/g;
	$str =~ s/ä/&auml;/g;
	$str =~ s/Ä/&Auml;/g;
	$str =~ s/ö/&ouml;/g;
	$str =~ s/Ö/&Ouml;/g;
	return $str;
};

sub Encode
{
	my ($in) = @_;
	$in =~ s/([^$ENCODE_EXCEPT])/sprintf("%%%02X",ord($1))/ge;
	return $in;
};

sub Decode
{
	my ($string) = @_;
	$string =~ s/%([a-fA-F0-9]{1,2})/pack("C",hex($1))/ge;
	return $string;
};


sub GetData
{
	my (%user_data,$user_string,$name_value_pair,@name_value_pairs,$name,$value);

	if( defined($ENV{'REQUEST_METHOD'}) ) { # www.
		if( $ENV{'REQUEST_METHOD'} eq "POST" ) {
			read(STDIN,$user_string,$ENV{'CONTENT_LENGTH'});
			$user_string =~ s/\+/ /g;
			@name_value_pairs = split(/$DELIMETER|&/, $user_string);  # All browsers seems to send & as delimeter on POST.
		} else {
			$user_string = $ENV{'QUERY_STRING'};
			$user_string =~ s/\+/ /g;
			@name_value_pairs = split(/$DELIMETER|&/, $user_string);
		};

	} else { # shell.
		@name_value_pairs = @ARGV;
	};
	foreach $name_value_pair ( @name_value_pairs ) {
		($name,$value) = split(/=/, $name_value_pair);
		$user_data{&Decode($name)} = &Decode($value);
	};

	return %user_data;
};      


