#!perl

BEGIN {
    @INC = ( '../../perl' );
}
use Cgi;
use Help;
use ES40lnf;

$| = 1;
@monthNames = ( 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
	        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' );

print "Content-type: text/html\n\n";

print "<html><head><title>Edit MIME Types</title></head>\n";
ES40lnf::print_body();
( $configDir = $ENV{'CONFIG_DIR'} ) =~ s/%s/$ENV{'SERVER_NAMES'}/;
if ( $cgiVars{'cmd'} ) {
    &{$cgiVars{'cmd'}}( "$configDir/mime.types" );
} else {	# show the stuff
    &displayMime( "$configDir/mime.types" );
}
print "</body>\n</html>\n";


sub edit {
    my	$file = shift;

    print "<form method=\"post\" action=\"mime\">\n";
    print "<input type=hidden name=\"cmd\" value=\"commit\">\n";
    print "<input type=hidden name=\"cat\" value=\"$cgiVars{'cat'}\">\n";
    print "<input type=hidden name=\"content\" value=\"$cgiVars{'content'}\">\n";
    print "<input type=hidden name=\"suffix\" value=\"$cgiVars{'suffix'}\">\n";
    ES40lnf::print_header("Edit Mime Type");
    print "<table width=100% border>\n";
    print '<tr><td><select name="commitCat"><option value="type"';
    print ' selected' if $cgiVars{'cat'} eq 'type';
    print ">type\n";
    print '<option value="enc"';
    print ' selected' if $cgiVars{'cat'} eq 'enc';
    print ">enc\n";
    print '<option value="lang"';
    print ' selected' if $cgiVars{'cat'} eq 'lang';
    print ">lang\n</select></td>\n";
    print "<td><input type=text name=\"commitContent\" value=\"$cgiVars{'content'}\"></td>\n";
    print "<td><input type=text name=\"commitSuffix\" value=\"$cgiVars{'suffix'}\"></td>\n";
    print "</table>\n";
    print "<table width=100% border>\n";
    print "<tr><th width=33%><input type=submit value=\"Change Mime Type\"></th>\n";
    print "<th width=33%><input type=reset></th>\n";
    print "<th width=33%><input type=button value=\"Help\" onClick=\"";
    print &helpJavaScript();
    print "\"></th></tr>\n";
    print "</table>\n</form>\n";
}

sub jsError {
    print "<SCRIPT>\n";
    print "alert( \"@_\" );\n";
    print "history.back();\n";
    print "</SCRIPT>\n";
}

sub add {
    my	$file = shift;
    my	$ext;
    my	%exts;

    if ( ! ( $cgiVars{'addContent'} and $cgiVars{'addSuffix'} ) ) {
	jsError( "Please don't click that until all the fields are set." );
	return;
    }
    # check for duplication
    open( M, $file ) or die "Can't read $file: $!\n";
    while ( <M> ) {
	/exts=([^\s]+)/;
	foreach $ext ( split( /,/, $1 ) ) {
	    $exts{$ext} = 1;
	}
    }
    close( M );
    foreach $ext ( split( /,/, $cgiVars{'addSuffix'} ) ) {
	if ( $exts{$ext} ) {	# duplicate
	    jsError( "Extension $ext is already used, either edit it,",
		     "or create a new one." );
	    return;
	}
    }
    # append the new mime type
    open( M, ">>$file" ) || die "Can't append to $file: $!\n";
    print M "$cgiVars{'addCat'}=$cgiVars{'addContent'}\texts=$cgiVars{'addSuffix'}\n";
    close( M );
    &appendLog( "system mime.types: Added $cgiVars{'addCat'}=$cgiVars{'addContent'}\texts=$cgiVars{'addSuffix'}\n" );
    print "<SCRIPT>\n";
    print "window.location='/$ENV{'SERVER_NAMES'}/bin/commit';\n";
    print "</SCRIPT>\n";
}

sub remove {
    my	$file = shift;
    my	$field;

    open( M, $file ) || die "Can't read $file: $!\n";
    open( N, ">$file~" ) || die "Can't write to $file~\n";
    while ( <M> ) {
	chomp;
	foreach $field ( split( /\s+/, $_ ) ) {
	    $field =~ /\s*=\s*/;
	    $field{$`} = $';
	}
	if ( $field{$cgiVars{'cat'}} ne $cgiVars{'content'} or
	    $field{'exts'} ne $cgiVars{'suffix'} ) {
	    print N $_, "\n";
	}
    }
    close( N );
    close( M );
    rename( "$file~", $file ) || die "Can't rename $file~ $file: $!\n";
    &appendLog( "system mime.types: Removed $cgiVars{'cat'}=$cgiVars{'content'}\texts=$cgiVars{'suffix'}\n" );
    print "<SCRIPT>\n";
    print "window.location='/$ENV{'SERVER_NAMES'}/bin/commit';\n";
    print "</SCRIPT>\n";
}

sub commit {
    my	$file = shift;
    my	$field;

    open( M, $file ) || die "Can't read $file: $!\n";
    open( N, ">$file~" ) || die "Can't write to $file~\n";
    while ( <M> ) {
	chomp;
	foreach $field ( split( /\s+/, $_ ) ) {
	    $field =~ /\s*=\s*/;
	    $field{$`} = $';
	}
	if ( $field{$cgiVars{'cat'}} ne $cgiVars{'content'} or
	    $field{'exts'} ne $cgiVars{'suffix'} ) {
	    print N $_, "\n";
	} else {
            my $exts = $cgiVars{'commitSuffix'};
            $exts =~ s/\ //g;
	    print N "$cgiVars{'commitCat'}=$cgiVars{'commitContent'}\t";
	    print N "exts=$exts\n";
	}
    }
    close( N );
    close( M );
    rename( "$file~", $file ) || die "Can't rename $file~ $file: $!\n";
    &appendLog( "system mime.types: Changed '$cgiVars{'cat'}=$cgiVars{'content'}\texts=$cgiVars{'suffix'}' to '$cgiVars{'commitCat'}=$cgiVars{'commitContent'}\texts=$cgiVars{'commitSuffix'}'\n" );
    print "<SCRIPT>\n";
    print "window.location='/$ENV{'SERVER_NAMES'}/bin/commit';\n";
    print "</SCRIPT>\n";
}

sub displayMime {
    my	$file = shift;
    my	@fields;
    my	$field;
    my	$cat;
    my	$content;
    my	$suffix;

    &setReferer;
    print "<form method=\"post\" action=\"mime\">\n";
    print "<input type=hidden name=\"cmd\">\n";
    print "<input type=hidden name=\"cat\">\n";
    print "<input type=hidden name=\"content\">\n";
    print "<input type=hidden name=\"suffix\">\n";
    ES40lnf::print_header("Global Mime Types");
    print "<table width=100% border>\n";
    open( M, $file ) || die "Can't read $file: $!\n";
    print "<tr><td></td><td></td><th>Category</th><th>Content-Type</th>";
    print "<th>File Suffix</th></tr>\n";
    print '<tr><td colspan=2><input type=button value="New Type" ';
    print "onClick=\"form.cmd.value='add'; form.submit();\"></td>\n";
    print '<td><select name="addCat"><option value="type">type', "\n";
    print '<option value="enc">enc', "\n";
    print '<option value="lang">lang', "\n</select></td>";
    print '<td><input name="addContent" type="text"></td>', "\n";
    print '<td><input name="addSuffix" type="text" size=10></td>', "\n";
    while ( <M> ) {
	next if /^$/;
	next if m'^#';
	chomp;
	@fields = split( /\s+/, $_ );
	foreach $field ( @fields ) {
	    if ( $field =~ /^exts\s*=\s*/ ) {
		$suffix = $';
	    } else {
		( $cat, $content ) = split( /\s*=\s*/, $field );
	    }
	}
	print '<tr><td><input type=button value="Edit" ';
	print "onClick=\"form.cmd.value='edit'; form.cat.value='$cat'; ";
	print "form.content.value='$content'; form.suffix.value='$suffix'; ";
	print 'form.submit();"></td>';
	print "<td><input type=button value=\"Remove\" ";
	print "onClick=\"form.cmd.value='remove'; form.cat.value='$cat'; ";
	print "form.content.value='$content'; form.suffix.value='$suffix'; ";
	print 'form.submit();"></td>';
	print "<td>$cat</td><td>$content</td><td>$suffix</td></tr>\n";
    }
    print "</table>\n";

    print "</form>\n";

    print "<form><p><div align=right><table width=33%% border=2>";
    print "<tr><td align=center>";
    print "<input type=button value=\"Help\" onClick=\"";
    print &helpJavaScript();
    print "\"></td></tr></table></div></form>\n";
}

sub appendLog {
    my	$where = $ENV{'REMOTE_HOST'} ?
	$ENV{'REMOTE_HOST'} : $ENV{'REMOTE_ADDR'};
    my	$day, $year, $hour, $min, $sec, $mon;

    ( $sec, $min, $hour, $day, $mon, $year ) = localtime( time );
    open( LOG, ">>$configDir/commit" ) ||
	die "Can't log to $configDir/commit: $!\n";
    print LOG "$ENV{'REMOTE_USER'}@$where: $ENV{'SERVER_NAMES'} [$day/",
    $monthNames[$mon], "/$year:$hour:$min:$sec]\n  ", @_;
    close( LOG );
}

sub setReferer {
    print "<SCRIPT language=JAVASCRIPT>\n";
    print "document.cookie='adminReferer='+window.location.href+'; path=/";
    print $ENV{'SERVER_NAMES'}, "/';\n";
    print "</SCRIPT>\n";
}

