package TripodCGI;

################
# TripodCGI.pm #                          
#############################################################################
# TripodCGI is a module to help you deal with CGI input, which is the kind  #
# of input your script can get from forms (as well as from specially-coded  #
# links).  When you have a form submit its information to your script,      #
# you can use TripodCGI to grab some or all of the inputs that the form     #
# provided, so that you can use them for your own nefarious ends ;)         #
#                                                                           #
# Of the functions below, the only two that you are likely to need to pay   #
# attention to are param() and redirect().  param() is the function which   #
# lets you grab CGI input.  If you specify the name of a particular input   #
# that you want to grab, param() will grab the value associated with the    #
# input of that name.  So if I have a form with a text input box named      #
# 'address', and somebody types in '160 Water St.' and hits the submit      #
# button, I can assign '160 Water St.' to the variable $form_address within #
# my form with this statement:                                              #
#                                                                           #
#   $form_address = $CGI->param('address');                                 #
#                                                                           #
# If you just want to know all of the names of the inputs returned by       #
# the form, don't specify an input, and the names of all the inputs will be # 
# returned as an array - like this:                                         #
#                                                                           #
# @all_inputs = $CGI->param();                                              #
#                                                                           #
# The other function you might want to use is redirect().  redirect() lets  #
# you specify the URL of a page or script that you want to move your        #
# visitor to.  You could use it like this:                                  #
#                                                                           #
# $CGI->redirect('http://www.tripod.com');  <- redirects to the Tripod      #
#                                              front page                   #
#############################################################################

sub new {
    my $class = shift;
    my $self = {};
    bless $self, $class;
    %data = ();
    $self->_initialize();
    return $self;
}


sub param {
    my($self,$key) = @_;
    return keys %data unless $key;

    return undef unless defined($data{$key});

    my @values = split("\0", $data{$key});
    return wantarray ? @values : $values[0];
}


sub redirect {
    my($self,$url) = @_;
    return "Status: 302 Found\nLocation: $url\n" . 
	   "URI: $url\nContent-type: text/html\n\n";
}


sub _initialize {
    my $query_string = '';

    if ($ENV{REQUEST_METHOD} eq 'POST') {
	read(STDIN, $query_string, $ENV{CONTENT_LENGTH});
    } else {
	$query_string = $ENV{QUERY_STRING};
    }

    my($key,$val);

    for (split(/&/, $query_string)) {
	s/\+/ /g;
	($key,$val) = split(/=/, $_, 2);

	$key =~ s/%(..)/pack("c",hex($1))/ge;
	$val =~ s/%(..)/pack("c",hex($1))/ge;

	$val =~ s/\r\n/\n/g;
	$val =~ s/\r/\n/g;

	if (defined($data{$key})) {
	    $data{$key} .= "\0";
	    $data{$key} .= $val;
	} else {
	    $data{$key} = $val;
	}
    }
}


1;