--- loncom/interface/loncommon.pm	2003/11/10 20:30:45	1.151
+++ loncom/interface/loncommon.pm	2003/12/01 14:36:22	1.157
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # a pile of common routines
 #
-# $Id: loncommon.pm,v 1.151 2003/11/10 20:30:45 www Exp $
+# $Id: loncommon.pm,v 1.157 2003/12/01 14:36:22 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -25,13 +25,6 @@
 #
 # http://www.lon-capa.org/
 #
-# YEAR=2001
-# 2/13-12/7 Guy Albertelli
-# 12/21 Gerd Kortemeyer
-# 12/25,12/28 Gerd Kortemeyer
-# YEAR=2002
-# 1/4 Gerd Kortemeyer
-# 6/24,7/2 H. K. Ng
 
 # Makes a table out of the previous attempts
 # Inputs result_from_symbread, user, domain, course_id
@@ -73,11 +66,9 @@ use HTML::Entities;
 
 my $readit;
 
-=pod 
-
-=head1 Global Variables
-
-=cut
+##
+## Global Variables
+##
 
 # ----------------------------------------------- Filetypes/Languages/Copyright
 my %language;
@@ -204,10 +195,6 @@ BEGIN {
 
 =pod 
 
-=head1 General Subroutines
-
-=over 4
-
 =head1 HTML and Javascript Functions
 
 =over 4
@@ -219,8 +206,6 @@ containing javascript with two functions
 C<opensearcher>. Returned string does not contain E<lt>scriptE<gt>
 tags.
 
-=over 4
-
 =item * openbrowser(formname,elementname,only,omit) [javascript]
 
 inputs: formname, elementname, only, omit
@@ -241,8 +226,6 @@ Inputs: formname, elementname
 formname and elementname specify the name of the html form and the name
 of the element the selection from the search results will be placed in.
 
-=back
-
 =cut
 
 sub browser_and_searcher_javascript {
@@ -887,6 +870,8 @@ Outputs:
 
 =back
 
+=back 
+
 =cut
 
 ###############################################################
@@ -925,12 +910,6 @@ sub decode_user_agent {
             $clientunicode,$clientos,);
 }
 
-=pod
-
-=back
-
-=cut
-
 ###############################################################
 ##    Authentication changing form generation subroutines    ##
 ###############################################################
@@ -971,6 +950,8 @@ See loncreateuser.pm for invocation and
 
 =back
 
+=back 
+
 =cut
 
 #-------------------------------------------
@@ -1155,12 +1136,6 @@ sub authform_filesystem{
     return $result;
 }
 
-=pod
-
-=back
-
-=cut
-
 ###############################################################
 ##    Get Authentication Defaults for Domain                 ##
 ###############################################################
@@ -2140,7 +2115,6 @@ sub bodytag {
     my $bodytag = <<END;
 <style>
 h1, h2, h3, th { font-family: Arial, Helvetica, sans-serif }
-a:hover { color: black; background: yellow }
 a:focus { color: red; background: yellow } 
 </style>
 <body bgcolor="$pgbg" text="$font" alink="$alink" vlink="$vlink" link="$link"
@@ -2730,8 +2704,12 @@ sub check_if_partid_hidden {
 
 =pod
 
+=back 
+
 =head1 cgi-bin script and graphing routines
 
+=over 4
+
 =item get_cgi_id
 
 Inputs: none
@@ -2745,9 +2723,10 @@ the routine &Apache::lonnet::transfer_pr
 
 ############################################################
 ############################################################
-
+my $uniq=0;
 sub get_cgi_id {
-    return (time.'_'.int(rand(1000)));
+    $uniq=($uniq+1)%100000;
+    return (time.'_'.$uniq);
 }
 
 ############################################################
@@ -3063,10 +3042,14 @@ sub DrawXYYGraph {
 
 =pod
 
+=back 
+
 =head1 Statistics helper routines?  
 
 Bad place for them but what the hell.
 
+=over 4
+
 =item &chartlink
 
 Returns a link to the chart for a specific student.  
@@ -3083,6 +3066,8 @@ Inputs:
 
 =back
 
+=back
+
 =cut
 
 ############################################################
@@ -3095,9 +3080,135 @@ sub chartlink {
        '">'.$linktext.'</a>';
 }
 
+#######################################################
+#######################################################
+
+=pod
+
+=head1 Course Environment Routines
+
+=over 4
+
+=item &restore_course_settings 
+
+=item &store_course_settings
+
+Restores/Store indicated form parameters from the course environment.
+Will not overwrite existing values of the form parameters.
+
+Inputs: 
+a scalar describing the data (e.g. 'chart', 'problem_analysis')
+
+a hash ref describing the data to be stored.  For example:
+   
+%Save_Parameters = ('Status' => 'scalar',
+    'chartoutputmode' => 'scalar',
+    'chartoutputdata' => 'scalar',
+    'Section' => 'array',
+    'StudentData' => 'array',
+    'Maps' => 'array');
+
+Returns: both routines return nothing
+
+=cut
+
+#######################################################
+#######################################################
+sub store_course_settings {
+    # save to the environment
+    # appenv the same items, just to be safe
+    my $courseid = $ENV{'request.course.id'};
+    my $coursedom = $ENV{'course.'.$courseid.'.domain'};
+    my ($prefix,$Settings) = @_;
+    my %SaveHash;
+    my %AppHash;
+    while (my ($setting,$type) = each(%$Settings)) {
+        my $basename = 'env.internal.'.$prefix.'.'.$setting;
+        my $envname = 'course.'.$courseid.'.'.$basename;
+        if (exists($ENV{'form.'.$setting})) {
+            # Save this value away
+            if ($type eq 'scalar' &&
+                (! exists($ENV{$envname}) || 
+                 $ENV{$envname} ne $ENV{'form.'.$setting})) {
+                $SaveHash{$basename} = $ENV{'form.'.$setting};
+                $AppHash{$envname}   = $ENV{'form.'.$setting};
+            } elsif ($type eq 'array') {
+                my $stored_form;
+                if (ref($ENV{'form.'.$setting})) {
+                    $stored_form = join(',',
+                                        map {
+                                            &Apache::lonnet::escape($_);
+                                        } sort(@{$ENV{'form.'.$setting}}));
+                } else {
+                    $stored_form = 
+                        &Apache::lonnet::escape($ENV{'form.'.$setting});
+                }
+                # Determine if the array contents are the same.
+                if ($stored_form ne $ENV{$envname}) {
+                    $SaveHash{$basename} = $stored_form;
+                    $AppHash{$envname}   = $stored_form;
+                }
+            }
+        }
+    }
+    my $put_result = &Apache::lonnet::put('environment',\%SaveHash,
+                                          $coursedom,
+                                          $ENV{'course.'.$courseid.'.num'});
+    if ($put_result !~ /^(ok|delayed)/) {
+        &Apache::lonnet::logthis('unable to save form parameters, '.
+                                 'got error:'.$put_result);
+    }
+    # Make sure these settings stick around in this session, too
+    &Apache::lonnet::appenv(%AppHash);
+    return;
+}
+
+sub restore_course_settings {
+    my $courseid = $ENV{'request.course.id'};
+    my ($prefix,$Settings) = @_;
+    while (my ($setting,$type) = each(%$Settings)) {
+        next if (exists($ENV{'form.'.$setting}));
+        my $envname = 'course.'.$courseid.'.env.internal.'.$prefix.
+            '.'.$setting;
+        if (exists($ENV{$envname})) {
+            if ($type eq 'scalar') {
+                $ENV{'form.'.$setting} = $ENV{$envname};
+            } elsif ($type eq 'array') {
+                $ENV{'form.'.$setting} = [ 
+                                           map { 
+                                               &Apache::lonnet::unescape($_); 
+                                           } split(',',$ENV{$envname})
+                                           ];
+            }
+        }
+    }
+}
+
 ############################################################
 ############################################################
 
+sub propath {
+    my ($udom,$uname)=@_;
+    $udom=~s/\W//g;
+    $uname=~s/\W//g;
+    my $subdir=$uname.'__';
+    $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;
+    my $proname="$Apache::lonnet::perlvar{'lonUsersDir'}/$udom/$subdir/$uname";
+    return $proname;
+} 
+
+sub icon {
+    my ($file)=@_;
+    my @file_ext = split(/\./,$file);
+    my $curfext = $file_ext[-1];
+    my $iconname="unknown.gif";
+    my $embstyle = &Apache::loncommon::fileembstyle($curfext);
+    # The unless conditional that follows is a bit of overkill
+    $iconname = $curfext.".gif" unless
+	(!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn');
+    return $Apache::lonnet::perlvar{'lonIconsURL'}."/$iconname";
+} 
+
 =pod
 
 =back