--- loncom/interface/loncommon.pm	2001/12/25 21:02:35	1.20
+++ loncom/interface/loncommon.pm	2002/03/06 20:24:44	1.26
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.20 2001/12/25 21:02:35 www Exp $
+# $Id: loncommon.pm,v 1.26 2002/03/06 20:24:44 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -30,7 +30,9 @@
 # 12/11,12/12,12/17 Scott Harrison
 # 12/21 Gerd Kortemeyer
 # 12/21 Scott Harrison
-# 12/25 Gerd Kortemeyer
+# 12/25,12/28 Gerd Kortemeyer
+# YEAR=2002
+# 1/4 Gerd Kortemeyer
 
 # Makes a table out of the previous attempts
 # Inputs result_from_symbread, user, domain, course_id
@@ -39,10 +41,13 @@
 package Apache::loncommon;
 
 use strict;
+use Apache::lonnet();
 use POSIX qw(strftime);
 use Apache::Constants qw(:common);
 use Apache::lonmsg();
 
+my $readit;
+
 # ----------------------------------------------- Filetypes/Languages/Copyright
 my %language;
 my %cprtag;
@@ -50,17 +55,19 @@ my %fe; my %fd;
 my %fc;
 
 # -------------------------------------------------------------- Thesaurus data
-my @therelated=();
-my @theword=();
-my @thecount=();
-my %theindex=();
-my $thetotalcount=0;
+my @therelated;
+my @theword;
+my @thecount;
+my %theindex;
+my $thetotalcount;
 my $thefuzzy=2;
 my $thethreshold=0.1/$thefuzzy;
 my $theavecount;
 
 # ----------------------------------------------------------------------- BEGIN
 BEGIN {
+
+    unless ($readit) {
 # ------------------------------------------------------------------- languages
     {
 	my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
@@ -132,6 +139,11 @@ BEGIN {
         }
         $theavecount=$thetotalcount/$#thecount;
     }
+    &Apache::lonnet::logthis(
+              "<font color=yellow>INFO: Read file types and thesaurus</font>");
+    $readit=1;
+}
+
 }
 # ============================================================= END BEGIN BLOCK
 
@@ -346,16 +358,22 @@ sub get_student_answers {
 }
 
 sub get_unprocessed_cgi {
-  my ($query)= @_;
+  my ($query,$possible_names)= @_;
+  # $Apache::lonxml::debug=1;
   foreach (split(/&/,$query)) {
     my ($name, $value) = split(/=/,$_);
-    $value =~ tr/+/ /;
-    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
-    if (!defined($ENV{'form.'.$name})) { $ENV{'form.'.$name}=$value; }
+    $name = &Apache::lonnet::unescape($name);
+    if (!defined($possible_names) || (grep {$_ eq $name} @$possible_names)) {
+      $value =~ tr/+/ /;
+      $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+      &Apache::lonxml::debug("Seting :$name: to :$value:");
+      &add_to_env('form.'.$name,$value);
+    }
   }
 }
 
 sub cacheheader {
+  unless ($ENV{'request.method'} eq 'GET') { return ''; }
   my $date=strftime("%a, %d %b %Y %H:%M:%S GMT",gmtime);
   my $output .='<meta HTTP-EQUIV="Expires" CONTENT="'.$date.'" />
                 <meta HTTP-EQUIV="Cache-control" CONTENT="no-cache" />
@@ -365,10 +383,28 @@ sub cacheheader {
 
 sub no_cache {
   my ($r) = @_;
-  my $date=strftime("%a, %d %b %Y %H:%M:%S GMT",gmtime);
+  unless ($ENV{'request.method'} eq 'GET') { return ''; }
+  #my $date=strftime("%a, %d %b %Y %H:%M:%S GMT",gmtime);
   $r->no_cache(1);
   $r->header_out("Pragma" => "no-cache");
-  $r->header_out("Expires" => $date);
+  #$r->header_out("Expires" => $date);
+}
+
+sub add_to_env {
+  my ($name,$value)=@_;
+  if ($ENV{$name}) {
+    if (defined(@{ $ENV{$name} })) {
+      #already have multiple values
+      push(@{ $ENV{$name} },$value);
+    } else {
+      #first time seeing multiple values, convert hash entry to an arrayref
+      my $first=$ENV{$name};
+      undef($ENV{$name});
+      push(@{ $ENV{$name} },$first,$value);
+    }
+  } else {
+    $ENV{$name}=$value;
+  }
 }
 1;
 __END__;
@@ -474,6 +510,12 @@ cacheheader() : returns cache-controllin
 
 nocache() : specifies header code to not have cache
 
+=item *
+
+add_to_env($name,$value) : adds $name to the %ENV hash with value
+$value, if $name already exists, the entry is converted to an array
+reference and $value is added to the array.
+
 =back
 
 =cut