--- loncom/interface/loncommon.pm	2001/12/11 23:38:28	1.15
+++ loncom/interface/loncommon.pm	2001/12/21 17:03:17	1.18
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.15 2001/12/11 23:38:28 harris41 Exp $
+# $Id: loncommon.pm,v 1.18 2001/12/21 17:03:17 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -27,10 +27,12 @@
 #
 # YEAR=2001
 # 2/13-12/7 Guy Albertelli
-# 12/11 Scott Harrison
+# 12/11,12/12,12/17 Scott Harrison
+# 12/21 Gerd Kortemeyer
 
 # Makes a table out of the previous attempts
 # Inputs result_from_symbread, user, domain, course_id
+# Reads in non-network-related .tab files
 
 package Apache::loncommon;
 
@@ -39,56 +41,66 @@ use POSIX qw(strftime);
 use Apache::Constants qw(:common);
 use Apache::lonmsg();
 
+
 my %language;
 my %cprtag;
 my %fe; my %fd;
 my %fc;
 
 # ----------------------------------------------------------------------- BEGIN
-sub BEGIN {
+BEGIN {
 # ------------------------------------------------------------------- languages
     {
 	my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
 				 '/language.tab');
-	while (<$fh>) {
-	    next if /^\#/;
-	    chomp;
-	    my ($key,$val)=(split(/\s+/,$_,2));
-	    $language{$key}=$val;
+	if ($fh) {
+	    while (<$fh>) {
+		next if /^\#/;
+		chomp;
+		my ($key,$val)=(split(/\s+/,$_,2));
+		$language{$key}=$val;
+	    }
 	}
     }
 # ------------------------------------------------------------------ copyrights
     {
-	my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
-				 '/copyright.tab');
-	while (<$fh>) {
-	    next if /^\#/;
-	    chomp;
-	    my ($key,$val)=(split(/\s+/,$_,2));
-	    $cprtag{$key}=$val;
+	my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonIncludes'}.
+				  '/copyright.tab');
+	if ($fh) {
+	    while (<$fh>) {
+		next if /^\#/;
+		chomp;
+		my ($key,$val)=(split(/\s+/,$_,2));
+		$cprtag{$key}=$val;
+	    }
 	}
     }
 # ------------------------------------------------------------- file categories
     {
 	my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
-				 '/filecategories.tab');
-	while (<$fh>) {
-	    next if /^\#/;
-	    chomp;
-	    my ($key,$val)=(split(/\s+/,$_,2));
-	    push @{$fc{$key}},$val;
+				  '/filecategories.tab');
+	if ($fh) {
+	    while (<$fh>) {
+		next if /^\#/;
+		chomp;
+		my ($key,$val)=(split(/\s+/,$_,2));
+		push @{$fc{$key}},$val;
+	    }
 	}
     }
 # ------------------------------------------------------------------ file types
     {
-	my $fh=Apache::File->new("$perlvar{'lonTabDir'}/filetypes.tab");
-	while (<$fh>) {
-	    next if (/^\#/);
-	    chomp;
-	    my ($ending,$emb,$descr)=split(/\s+/,$_,3);
-	    if ($descr ne '') { 
-		$fe{$ending}=lc($emb);
-		$fd{$ending}=join(' ',@descr);
+	my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
+	       '/filetypes.tab');
+	if ($fh) {
+            while (<$fh>) {
+		next if (/^\#/);
+		chomp;
+		my ($ending,$emb,$descr)=split(/\s+/,$_,3);
+		if ($descr ne '') { 
+		    $fe{$ending}=lc($emb);
+		    $fd{$ending}=$descr;
+		}
 	    }
 	}
     }
@@ -96,47 +108,53 @@ sub BEGIN {
 
 # ---------------------------------------------------------------- Language IDs
 sub languageids {
-    return keys(%language);
+    return sort(keys(%language));
 }
 
 # -------------------------------------------------------- Language Description
 sub languagedescription {
-    return $language{shift};
+    return $language{shift(@_)};
 }
 
 # --------------------------------------------------------------- Copyright IDs
 sub copyrightids {
-    return keys(%cprtag);
+    return sort(keys(%cprtag));
 }
 
 # ------------------------------------------------------- Copyright Description
 sub copyrightdescription {
-    return $cprtag{shift};
+    return $cprtag{shift(@_)};
 }
 
 # ------------------------------------------------------------- File Categories
 sub filecategories {
-    return keys(%fc);
+    return sort(keys(%fc));
 }
 
-# ------------------------------------------------------------- File Categories
+# -------------------------------------- File Types within a specified category
 sub filecategorytypes {
-    return @{$fc{lc(shift)}};
+    return @{$fc{lc(shift(@_))}};
 }
 
 # ------------------------------------------------------------------ File Types
 sub fileextensions {
-    return keys(%fe);
+    return sort(keys(%fe));
 }
 
 # ------------------------------------------------------------- Embedding Style
 sub fileembstyle {
-    return $fe{lc(shift)};
+    return $fe{lc(shift(@_))};
 }
 
 # ------------------------------------------------------------ Description Text
 sub filedescription {
-    return $fd{lc(shift)};
+    return $fd{lc(shift(@_))};
+}
+
+# ------------------------------------------------------------ Description Text
+sub filedescriptionex {
+    my $ex=shift;
+    return '.'.$ex.' '.$fd{lc($ex)};
 }
 
 sub get_previous_attempt {
@@ -154,12 +172,12 @@ sub get_previous_attempt {
         } sort(split(/\:/,$returnhash{$version.':keys'}));
       }
       $prevattempts='<table border=2></tr><th>History</th>';
-      map {
+      foreach (sort(keys %lasthash)) {
         $prevattempts.='<th>'.$_.'</th>';
-      } sort(keys %lasthash);
+      }
       for ($version=1;$version<=$returnhash{'version'};$version++) {
         $prevattempts.='</tr><tr><th>Attempt '.$version.'</th>';
-        map {
+        foreach (sort(keys %lasthash)) {
 	  my $value;
 	  if ($_ =~ /timestamp/) {
 	    $value=scalar(localtime($returnhash{$version.':'.$_}));
@@ -167,10 +185,10 @@ sub get_previous_attempt {
 	    $value=$returnhash{$version.':'.$_};
 	  }
 	  $prevattempts.='<td>'.$value.'</td>';   
-        } sort(keys %lasthash);
+        }
       }
       $prevattempts.='</tr><tr><th>Current</th>';
-      map {
+      foreach (sort(keys %lasthash)) {
 	my $value;
 	if ($_ =~ /timestamp/) {
 	  $value=scalar(localtime($lasthash{$_}));
@@ -178,7 +196,7 @@ sub get_previous_attempt {
 	  $value=$lasthash{$_};
 	}
 	$prevattempts.='<td>'.$value.'</td>';
-      } sort(keys %lasthash);
+      }
       $prevattempts.='</tr></table>';
     } else {
       $prevattempts='Nothing submitted - no attempts.';
@@ -241,12 +259,12 @@ sub get_student_answers {
 
 sub get_unprocessed_cgi {
   my ($query)= @_;
-  map {
+  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; }
-  } (split(/&/,$query));
+  }
 }
 
 sub cacheheader {
@@ -266,3 +284,108 @@ sub no_cache {
 }
 1;
 __END__;
+
+
+=head1 NAME
+
+Apache::loncommon - pile of common routines
+
+=head1 SYNOPSIS
+
+Referenced by other mod_perl Apache modules.
+
+Invocation:
+ &Apache::loncommon::SUBROUTINENAME(ARGUMENTS);
+
+=head1 INTRODUCTION
+
+Common collection of used subroutines.  This collection helps remove
+redundancy from other modules and increase efficiency of memory usage.
+
+Current things done:
+
+ Makes a table out of the previous homework attempts
+ Inputs result_from_symbread, user, domain, course_id
+ Reads in non-network-related .tab files
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 HANDLER SUBROUTINE
+
+There is no handler subroutine.
+
+=head1 OTHER SUBROUTINES
+
+=over 4
+
+=item *
+
+BEGIN() : initialize values from language.tab, copyright.tab, filetypes.tab,
+and filecategories.tab.
+
+=item *
+
+languageids() : returns list of all language ids
+
+=item *
+
+languagedescription() : returns description of a specified language id
+
+=item *
+
+copyrightids() : returns list of all copyrights
+
+=item *
+
+copyrightdescription() : returns description of a specified copyright id
+
+=item *
+
+filecategories() : returns list of all file categories
+
+=item *
+
+filecategorytypes() : returns list of file types belonging to a given file
+category
+
+=item *
+
+fileembstyle() : returns embedding style for a specified file type
+
+=item *
+
+filedescription() : returns description for a specified file type
+
+=item *
+
+filedescriptionex() : returns description for a specified file type with
+extra formatting
+
+=item *
+
+get_previous_attempt() : return string with previous attempt on problem
+
+=item *
+
+get_student_view() : show a snapshot of what student was looking at
+
+=item *
+
+get_student_answers() : show a snapshot of how student was answering problem
+
+=item *
+
+get_unprocessed_cgi() : get unparsed CGI parameters
+
+=item *
+
+cacheheader() : returns cache-controlling header code
+
+=item *
+
+nocache() : specifies header code to not have cache
+
+=back
+
+=cut