--- loncom/interface/londocs.pm	2006/06/30 20:33:49	1.237
+++ loncom/interface/londocs.pm	2006/11/22 14:07:13	1.256
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.237 2006/06/30 20:33:49 albertel Exp $
+# $Id: londocs.pm,v 1.256 2006/11/22 14:07:13 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -33,16 +33,15 @@ use Apache::Constants qw(:common :http);
 use Apache::imsexport;
 use Apache::lonnet;
 use Apache::loncommon;
-use Apache::lonratedt;
-use Apache::lonratsrv;
+use LONCAPA::map();
+use Apache::lonratedt();
 use Apache::lonxml;
-use Apache::loncreatecourse;
+use Apache::lonclonecourse;
 use Apache::lonnavmaps;
 use HTML::Entities;
 use GDBM_File;
 use Apache::lonlocal;
 use Cwd;
-use lib '/home/httpd/lib/perl/';
 use LONCAPA;
 
 my $iconpath;
@@ -58,7 +57,7 @@ my $hadchanges;
 
 my %help=();
 
-# Mapread read maps into lonratedt::global arrays 
+# Mapread read maps into LONCAPA::map:: global arrays 
 # @order and @resources, determines status
 # sets @order - pointer to resources in right order
 # sets @resources - array with the resources with correct idx
@@ -67,15 +66,15 @@ my %help=();
 sub mapread {
     my ($coursenum,$coursedom,$map)=@_;
     return
-      &Apache::lonratedt::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
-                                $map);
+      &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
+			     $map);
 }
 
 sub storemap {
     my ($coursenum,$coursedom,$map)=@_;
     my ($outtext,$errtext)=
-      &Apache::lonratedt::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
-                                $map,1);
+      &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'.
+			      $map,1);
     if ($errtext) { return ($errtext,2); }
     
     $hadchanges=1;
@@ -186,13 +185,13 @@ sub dumpcourse {
 	    $r->print('<br /><tt>'.$_.'</tt> => <tt>'.$newfilename.'</tt>: ');
 	    if (my $fh=Apache::File->new('>'.$path.'/'.$newfilename)) {
 		if ($_=~/\.(sequence|page|html|htm|xml|xhtml)$/) {
-		    print $fh &Apache::loncreatecourse::rewritefile(
-         &Apache::loncreatecourse::readfile($env{'request.course.id'},$_),
+		    print $fh &Apache::lonclonecourse::rewritefile(
+         &Apache::lonclonecourse::readfile($env{'request.course.id'},$_),
 				     (%replacehash,$crs => '')
 								    );
 		} else {
 		    print $fh
-         &Apache::loncreatecourse::readfile($env{'request.course.id'},$_);
+         &Apache::lonclonecourse::readfile($env{'request.course.id'},$_);
 		       }
 		$fh->close();
 	    } else {
@@ -230,7 +229,7 @@ sub dumpcourse {
 	$r->print('<h3>'.&mt('Folder in Construction Space').'</h3><input type="text" size="50" name="authorfolder" value="'.$title.'" /><br />');
 	&tiehash();
 	$r->print('<h3>'.&mt('Filenames in Construction Space').'</h3><table border="2"><tr><th>'.&mt('Internal Filename').'</th><th>'.&mt('Title').'</th><th>'.&mt('Save as ...').'</th></tr>');
-	foreach (&Apache::loncreatecourse::crsdirlist($origcrsid,'userfiles')) {
+	foreach (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
 	    $r->print('<tr><td>'.$_.'</td>');
 	    my ($ext)=($_=~/\.(\w+)$/);
 	    my $title=$hash{'title_'.$hash{
@@ -931,13 +930,13 @@ sub group_import {
             }
         }
 	if ($url) {
-	    my $idx = &Apache::lonratedt::getresidx($url);
-	    $Apache::lonratedt::order[$#Apache::lonratedt::order+1]=$idx;
+	    my $idx = &LONCAPA::map::getresidx($url);
+	    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
 	    my $ext = 'false';
 	    if ($url=~/^http:\/\//) { $ext = 'true'; }
 	    $url =~ s/:/\&colon;/g;
 	    $name =~ s/:/\&colon;/g;
-	    $Apache::lonratedt::resources[$idx] = 
+	    $LONCAPA::map::resources[$idx] = 
 		join ':', ($name, $url, $ext, 'normal', 'res');
 	}
     }
@@ -955,12 +954,16 @@ sub breadcrumbs {
     }
     my $folderpath;
     my $cpinfo='';
+    my $plain='';
     if ($env{'form.markedcopy_url'}) {
        $cpinfo='&markedcopy_url='.
                &escape($env{'form.markedcopy_url'}).
                '&markedcopy_title='.
                &escape($env{'form.markedcopy_title'});
     }
+    my $randompick=-1;
+    my $isencrypted=0;
+    my $ishidden=0;
     while (@folders) {
 	my $folder=shift(@folders);
 	my $foldername=shift(@folders);
@@ -968,17 +971,209 @@ sub breadcrumbs {
 	$folderpath.=$folder.'&'.$foldername;
 	my $url='/adm/coursedocs?folderpath='.
 	    &escape($folderpath);
+            my $name=&unescape($foldername);
+# randompick number, hidden, encrypted is appended with ":"s to the foldername	
+            $name=~s/\:(\d*)\:(\w*)\:(\w*)$//;
+            if ($1 ne '') { 
+               $randompick=$1;
+            } else {
+               $randompick=-1;
+            }
+            if ($2) { $ishidden=1; }
+            if ($3) { $isencrypted=1; }
 	    &Apache::lonhtmlcommon::add_breadcrumb(
 		      {'href'=>$url.$cpinfo,
-		       'title'=>&unescape($foldername),
+		       'title'=>$name,
 		       'text'=>'<font size="+1">'.
-			   &unescape($foldername).'</font>'
+			   $name.'</font>'
 		       });
-		       
-						 
+	$plain.=$name.' &gt; ';
+    }
+    $plain=~s/\&gt\;\s*$//;
+    return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
+					       'LC_docs_path'),$randompick,$ishidden,$isencrypted,$plain);
+}
+
+sub log_docs {
+    return &Apache::lonnet::instructor_log('docslog',@_);
+}
+
+{
+    my @oldresources=();
+    my @oldorder=();
+    my $parmidx;
+    my %parmaction=();
+    my %parmvalue=();
+    my $changedflag;
+
+    sub snapshotbefore {
+        @oldresources=@LONCAPA::map::resources;
+        @oldorder=@LONCAPA::map::order;
+        $parmidx=undef;
+        %parmaction=();
+        %parmvalue=();
+        $changedflag=0;
+    }
+
+    sub remember_parms {
+        my ($idx,$parameter,$action,$value)=@_;
+        $parmidx=$idx;
+        $parmaction{$parameter}=$action;
+        $parmvalue{$parameter}=$value;
+        $changedflag=1;
+    }
+
+    sub log_differences {
+        my ($plain)=@_;
+        my %storehash=('folder' => $plain);
+        if ($parmidx) {
+           $storehash{'parameter_res'}=$oldresources[$parmidx];
+           foreach my $parm (keys %parmaction) {
+              $storehash{'parameter_action_'.$parm}=$parmaction{$parm};
+              $storehash{'parameter_value_'.$parm}=$parmvalue{$parm};
+           }
+        }
+        my $maxidx=$#oldresources;
+        if ($#LONCAPA::map::resources>$#oldresources) {
+           $maxidx=$#LONCAPA::map::resources;
+        }
+        for (my $idx=0; $idx<=$maxidx; $idx++) {
+           if ($LONCAPA::map::resources[$idx] ne $oldresources[$idx]) {
+              $storehash{'before_resources_'.$idx}=$oldresources[$idx];
+              $storehash{'after_resources_'.$idx}=$LONCAPA::map::resources[$idx];
+              $changedflag=1;
+           }
+           if ($LONCAPA::map::order[$idx] ne $oldorder[$idx]) {
+              $storehash{'before_order_res_'.$idx}=$oldresources[$oldorder[$idx]];
+              $storehash{'after_order_res_'.$idx}=$LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
+              $changedflag=1;
+           }
+        }
+	$storehash{'maxidx'}=$maxidx;
+        if ($changedflag) { &log_docs(\%storehash); }
+    }
+}
+
+
+#
+# Docs Change Log
+#
+sub docs_change_log {
+    my ($r)=@_;
+    $r->print(&Apache::loncommon::start_page('Course Document Change Log'));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log'));
+
+    my %docslog=&Apache::lonnet::dump('nohist_docslog',
+                                      $env{'course.'.$env{'request.course.id'}.'.domain'},
+                                      $env{'course.'.$env{'request.course.id'}.'.num'});
+
+    if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); }
+
+    $r->print('<form action="/adm/coursedocs" method="post" name="docslog">'.
+              '<input type="hidden" name="docslog" value="1" />');
+
+    my %saveable_parameters = ('show' => 'scalar',);
+    &Apache::loncommon::store_course_settings('docs_log',
+                                              \%saveable_parameters);
+    &Apache::loncommon::restore_course_settings('docs_log',
+                                                \%saveable_parameters);
+    if (!$env{'form.show'}) { $env{'form.show'}=10; }
+    my %lt=('hiddenresource' => 'Resources hidden',
+	    'encrypturl'     => 'URL hidden',
+	    'randompick'     => 'Randomly pick',
+	    'set'            => 'set to',
+	    'del'            => 'deleted');
+
+    my $countselect =
+        &Apache::lonmeta::selectbox('show',$env{'form.show'},undef,
+                                    (&mt('all'),10,20,50,100,1000,10000));
+
+    $r->print('<nobr>'.&mt('[_1] Records',$countselect).'</nobr>'.
+              '<input type="submit" value="'.&mt('Display').'" /></form>');
+    $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
+              '<th>'.&mt('Time').'</th><th>'.&mt('User').'</th><th>'.&mt('Folder').'</th><th>'.&mt('Before').'</th><th>'.
+              &mt('After').'</th>'.
+              &Apache::loncommon::end_data_table_header_row());
+    my $shown=0;
+    foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
+        my @changes=keys(%{$docslog{$id}{'logentry'}});
+        my $count = 0;
+        my $time =
+            &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
+        my $plainname =
+            &Apache::loncommon::plainname($docslog{$id}{'exe_uname'},
+                                          $docslog{$id}{'exe_udom'});
+        my $about_me_link =
+            &Apache::loncommon::aboutmewrapper($plainname,
+                                               $docslog{$id}{'exe_uname'},
+                                               $docslog{$id}{'exe_udom'});
+        my $send_msg_link='';
+        if ((($docslog{$id}{'exe_uname'} ne $env{'user.name'})
+             || ($docslog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
+            $send_msg_link ='<br />'.
+                &Apache::loncommon::messagewrapper(&mt('Send message'),
+                                                   $docslog{$id}{'exe_uname'},
+                                                   $docslog{$id}{'exe_udom'});
+        }
+        $r->print(&Apache::loncommon::start_data_table_row());
+        $r->print('<td>'.$time.'</td>
+                       <td>'.$about_me_link.
+                  '<br /><tt>'.$docslog{$id}{'exe_uname'}.
+                                  ':'.$docslog{$id}{'exe_udom'}.'</tt>'.
+                  $send_msg_link.'</td><td>'.
+                  $docslog{$id}{'logentry'}{'folder'}.'</td><td>');
+# Before
+	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
+	    my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
+	    my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
+	    if ($oldname ne $newname) {
+		$r->print(&LONCAPA::map::qtescape($oldname));
+	    }
+	}
+	$r->print('<ul>');
+	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
+            if ($docslog{$id}{'logentry'}{'before_order_res_'.$idx}) {
+		$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'before_order_res_'.$idx}))[0]).'</li>');
+	    }
+	}
+	$r->print('</ul>');
+# After
+        $r->print('</td><td>');
+
+	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
+	    my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0];
+	    my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0];
+	    if ($oldname ne $newname) {
+		$r->print(&LONCAPA::map::qtescape($newname));
+	    }
+	}        
+	$r->print('<ul>');
+	for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) {
+            if ($docslog{$id}{'logentry'}{'after_order_res_'.$idx}) {
+		$r->print('<li>'.&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'after_order_res_'.$idx}))[0]).'</li>');
+	    }
+	}
+	$r->print('</ul>');
+	if ($docslog{$id}{'logentry'}{'parameter_res'}) {
+	    $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');
+	    foreach my $parameter ('randompick','hiddenresource','encrypturl') {
+		if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
+		    $r->print('<li>'.
+			      &mt($lt{$parameter}.' '.$lt{$docslog{$id}{'logentry'}{'parameter_action_'.$parameter}}.' [_1]',
+				  $docslog{$id}{'logentry'}{'parameter_value_'.$parameter})
+			      .'</li>');
+		}
+	    }
+	    $r->print('</ul>');
+	}
+# End
+        $r->print('</td>'.&Apache::loncommon::end_data_table_row());
+        $shown++;
+        if (!($env{'form.show'} eq &mt('all')
+              || $shown<=$env{'form.show'})) { last; }
     }
-    return &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp',
-					       'LC_docs_path');
+    $r->print(&Apache::loncommon::end_data_table());
+    $r->print(&Apache::loncommon::end_page());
 }
 
 sub editor {
@@ -991,19 +1186,20 @@ sub editor {
     }
     ($errtext,$fatal)=
               &mapread($coursenum,$coursedom,$folder.'.'.$container);
-    if ($#Apache::lonratedt::order<1) {
-	my $idx=&Apache::lonratedt::getresidx();
+    if ($#LONCAPA::map::order<1) {
+	my $idx=&LONCAPA::map::getresidx();
 	if ($idx<=0) { $idx=1; }
-       	$Apache::lonratedt::order[0]=$idx;
-        $Apache::lonratedt::resources[$idx]='';
+       	$LONCAPA::map::order[0]=$idx;
+        $LONCAPA::map::resources[$idx]='';
     }
     if (defined($env{'form.markcopy'})) {
 # Mark for copying
-	my ($title,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$env{'form.markcopy'}]]);
+	my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]);
 	$env{'form.markedcopy_title'}=$title;
 	$env{'form.markedcopy_url'}=$url;
     }
-    $r->print(&breadcrumbs($folder));
+    my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain)=&breadcrumbs($folder);
+    $r->print($breadcrumbtrail);
     if ($fatal) {
 	   $r->print('<p><font color="red">'.$errtext.'</font></p>');
     } else {
@@ -1012,68 +1208,79 @@ sub editor {
 # ---------------- if they are for this folder and user allowed to make changes
 	if (($allowed) && ($env{'form.folder'} eq $folder)) {
 # set parameters and change order
-	    if (defined($env{'form.setparms'})) {
+            &snapshotbefore();
+	    if ($env{'form.changeparms'}) {
 		my $idx=$env{'form.setparms'};
 # set parameters
 		if ($env{'form.randpick_'.$idx}) {
-		    &Apache::lonratedt::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
+		    &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
+                    &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
 		} else {
-		    &Apache::lonratedt::delparameter($idx,'parameter_randompick');
+		    &LONCAPA::map::delparameter($idx,'parameter_randompick');
+                    &remember_parms($idx,'randompick','del');
 		}
 		if ($env{'form.hidprs_'.$idx}) {
-		    &Apache::lonratedt::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
-		} else {
-		    &Apache::lonratedt::delparameter($idx,'parameter_hiddenresource');
-		}
+		    &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno');
+                    &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx});
+ 		} else {
+		    &LONCAPA::map::delparameter($idx,'parameter_hiddenresource');
+                    &remember_parms($idx,'hiddenresource','del');
+ 		}
 		if ($env{'form.encprs_'.$idx}) {
-		    &Apache::lonratedt::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
-		} else {
-		    &Apache::lonratedt::delparameter($idx,'parameter_encrypturl');
+		    &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno');
+                    &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx});
+ 		} else {
+		    &LONCAPA::map::delparameter($idx,'parameter_encrypturl');
+                    &remember_parms($idx,'encrypturl','del');
+ 		}
+# store the changed version
+		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
+		if ($fatal) {
+		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
+		    return;
 		}
+	    }
 
-		if ($env{'form.newpos'}) {
+	    if ($env{'form.newpos'}) {
 # change order
-
-		    my $newpos=$env{'form.newpos'}-1;
-		    my $currentpos=$env{'form.currentpos'}-1;
-		    my $i;
-		    my @neworder=();
-		    if ($newpos>$currentpos) {
+		my $newpos=$env{'form.newpos'}-1;
+		my $currentpos=$env{'form.currentpos'}-1;
+		my $i;
+		my @neworder=();
+		if ($newpos>$currentpos) {
 # moving stuff up
-			for ($i=0;$i<$currentpos;$i++) {
-			    $neworder[$i]=$Apache::lonratedt::order[$i];
-			}
-			for ($i=$currentpos;$i<$newpos;$i++) {
-			    $neworder[$i]=$Apache::lonratedt::order[$i+1];
-			}
-                        $neworder[$newpos]=$Apache::lonratedt::order[$currentpos];
-			for ($i=$newpos+1;$i<=$#Apache::lonratedt::order;$i++) {
-			    $neworder[$i]=$Apache::lonratedt::order[$i];
-			}
-		    } else {
+		    for ($i=0;$i<$currentpos;$i++) {
+			$neworder[$i]=$LONCAPA::map::order[$i];
+		    }
+		    for ($i=$currentpos;$i<$newpos;$i++) {
+			$neworder[$i]=$LONCAPA::map::order[$i+1];
+		    }
+		    $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
+		    for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) {
+			$neworder[$i]=$LONCAPA::map::order[$i];
+		    }
+		} else {
 # moving stuff down
-			for ($i=0;$i<$newpos;$i++) {
-			    $neworder[$i]=$Apache::lonratedt::order[$i];
-			}
-			$neworder[$newpos]=$Apache::lonratedt::order[$currentpos];
-			for ($i=$newpos+1;$i<$currentpos+1;$i++) {
-			    $neworder[$i]=$Apache::lonratedt::order[$i-1];
-			}
-			for ($i=$currentpos+1;$i<=$#Apache::lonratedt::order;$i++) {
-			    $neworder[$i]=$Apache::lonratedt::order[$i];
-			}
+		    for ($i=0;$i<$newpos;$i++) {
+			$neworder[$i]=$LONCAPA::map::order[$i];
+		    }
+		    $neworder[$newpos]=$LONCAPA::map::order[$currentpos];
+		    for ($i=$newpos+1;$i<$currentpos+1;$i++) {
+			$neworder[$i]=$LONCAPA::map::order[$i-1];
+		    }
+		    for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) {
+			$neworder[$i]=$LONCAPA::map::order[$i];
 		    }
-		    @Apache::lonratedt::order=@neworder;
 		}
+		@LONCAPA::map::order=@neworder;
 # store the changed version
-
 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
 		if ($fatal) {
 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
 		    return;
 		}
-		
 	    }
+		
 	    if ($env{'form.pastemarked'}) {
 # paste resource to end of list
                 my $url=$env{'form.markedcopy_url'};
@@ -1086,7 +1293,7 @@ sub editor {
 		    my $newurl=$1.$newid.'.'.$2;
 		    my $storefn=$newurl;
                     $storefn=~s/^\/\w+\/\w+\/\w+\///;
-		    &Apache::loncreatecourse::writefile
+		    &Apache::lonclonecourse::writefile
 			($env{'request.course.id'},$storefn,
 			 &Apache::lonnet::getfile($url));
 		    $url=$newurl;
@@ -1098,10 +1305,10 @@ sub editor {
 		if ($url=~/^http\:\/\//) { $ext='true'; }
 		$url=~s/\:/\&colon;/g;
 # Now insert the URL at the bottom
-                my $newidx=&Apache::lonratedt::getresidx($url);
-		$Apache::lonratedt::resources[$newidx]=
+                my $newidx=&LONCAPA::map::getresidx($url);
+		$LONCAPA::map::resources[$newidx]=
 		    $title.':'.$url.':'.$ext.':normal:res';
-		$Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx;
+		$LONCAPA::map::order[1+$#LONCAPA::map::order]=$newidx;
 # Store the result
 		($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container);
 		if ($fatal) {
@@ -1114,55 +1321,54 @@ sub editor {
 	    if ($env{'form.cmd'}) {
                 my ($cmd,$idx)=split(/\_/,$env{'form.cmd'});
                 if ($cmd eq 'del') {
-		    my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);
+		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
 		    if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) &&
 			($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) {
 			&Apache::lonnet::removeuploadedurl($url);
 		    } else {
-			&Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);
+			&LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
 		    }
-		    for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
-                        $Apache::lonratedt::order[$i]=
-                          $Apache::lonratedt::order[$i+1];
+		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
+                        $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
                     }
-                    $#Apache::lonratedt::order--;
+                    $#LONCAPA::map::order--;
                 } elsif ($cmd eq 'cut') {
-		    my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]);
-		    &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]);
-		    for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) {
-                        $Apache::lonratedt::order[$i]=
-                          $Apache::lonratedt::order[$i+1];
+		    my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
+		    &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]);
+		    for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) {
+                        $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1];
                     }
-                    $#Apache::lonratedt::order--;
+                    $#LONCAPA::map::order--;
                 } elsif ($cmd eq 'up') {
-		  if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) {
-                    my $i=$Apache::lonratedt::order[$idx-1];
-                    $Apache::lonratedt::order[$idx-1]=
-			$Apache::lonratedt::order[$idx];
-                    $Apache::lonratedt::order[$idx]=$i;
+		  if (($idx) && (defined($LONCAPA::map::order[$idx-1]))) {
+                    my $i=$LONCAPA::map::order[$idx-1];
+                    $LONCAPA::map::order[$idx-1] = $LONCAPA::map::order[$idx];
+                    $LONCAPA::map::order[$idx] = $i;
 		   }
                 } elsif ($cmd eq 'down') {
-		   if (defined($Apache::lonratedt::order[$idx+1])) {
-                    my $i=$Apache::lonratedt::order[$idx+1];
-                    $Apache::lonratedt::order[$idx+1]=
-			$Apache::lonratedt::order[$idx];
-                    $Apache::lonratedt::order[$idx]=$i;
+		   if (defined($LONCAPA::map::order[$idx+1])) {
+                    my $i=$LONCAPA::map::order[$idx+1];
+                    $LONCAPA::map::order[$idx+1] = $LONCAPA::map::order[$idx];
+                    $LONCAPA::map::order[$idx] = $i;
 		   }
                 } elsif ($cmd eq 'rename') {
-                    my $ratstr = $Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]];
+                    my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]];
                     my ($rtitle,@rrest)=split(/\:/,
-                       $Apache::lonratedt::resources[
-				       $Apache::lonratedt::order[$idx]]);
+                       $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]);
                     my $comment=
                      &HTML::Entities::decode($env{'form.title'});
                     $comment=~s/\</\&lt\;/g;
                     $comment=~s/\>/\&gt\;/g;
                     $comment=~s/\:/\&colon;/g;
 		    if ($comment=~/\S/) {
-			$Apache::lonratedt::resources[
-				       $Apache::lonratedt::order[$idx]]=
-				            $comment.':'.join(':',@rrest);
+			$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]=
+			    $comment.':'.join(':',@rrest);
 		    }
+# Devalidate title cache
+                    my $renamed_url=$rrest[0];
+# Has the &colon;-escaping
+                    $renamed_url=~s/\&colon\;/\:/g;
+		    &Apache::lonnet::devalidate_title_cache($renamed_url);
                 }
 # Store the changed version
 		($errtext,$fatal)=&storemap($coursenum,$coursedom,
@@ -1175,7 +1381,7 @@ sub editor {
 # Group import/search
 	    if ($env{'form.importdetail'}) {
 		my @imports;
-		&Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
+#		&Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'});
 		foreach (split(/\&/,$env{'form.importdetail'})) {
 		    if (defined($_)) {
 			my ($name,$url)=split(/\=/,$_);
@@ -1185,7 +1391,7 @@ sub editor {
 		    }
 		}
 # Store the changed version
-		($errtext,$fatal)=group_import($coursenum, $coursedom, $folder,
+		($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder,
 					       $container,'londocs',@imports);
 		if ($fatal) {
 		    $r->print('<p><font color="red">'.$errtext.'</font></p>');
@@ -1197,10 +1403,9 @@ sub editor {
                if ($env{'form.importmap'}=~/\w/) {
 	          foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
 		      my ($title,$url,$ext,$type)=split(/\:/,$_);
-                      my $idx=&Apache::lonratedt::getresidx($url);
-                      $Apache::lonratedt::resources[$idx]=$_;
-                      $Apache::lonratedt::order
-		          [$#Apache::lonratedt::order+1]=$idx;
+                      my $idx=&LONCAPA::map::getresidx($url);
+                      $LONCAPA::map::resources[$idx]=$_;
+                      $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
 	          }
 # Store the changed version
   	          ($errtext,$fatal)=&storemap($coursenum,$coursedom,
@@ -1213,16 +1418,27 @@ sub editor {
                    $r->print('<p><font color="red">'.&mt('No map selected.').'</font></p>');
                }
            }
+           &log_differences($plain);
        }
 # ---------------------------------------------------------------- End commands
 # ---------------------------------------------------------------- Print screen
         my $idx=0;
 	my $shown=0;
+        if (($ishidden) || ($isencrypted) || ($randompick>=0)) {
+           $r->print('<p>'.&mt('Parameters').':<ul>'.
+                     ($randompick>=0?'<li>'.&mt('randomly pick [_1] resources',$randompick).'</li>':'').
+                     ($ishidden?'<li>'.&mt('contents hidden').'</li>':'').
+                     ($isencrypted?'<li>'.&mt('URLs hidden').'</li>':'').
+                     '</ul></p>');
+        }                                                                                                     
+        if ($randompick>=0) {
+           $r->print('<p>'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'</p>');
+        }
         $r->print('<table>');
-        foreach (@Apache::lonratedt::order) {
-           my ($name,$url)=split(/\:/,$Apache::lonratedt::resources[$_]);
-	   $name=&Apache::lonratsrv::qtescape($name);
-	   $url=&Apache::lonratsrv::qtescape($url);
+        foreach (@LONCAPA::map::order) {
+           my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);
+	   $name=&LONCAPA::map::qtescape($name);
+	   $url=&LONCAPA::map::qtescape($url);
            unless ($name) {  $name=(split(/\//,$url))[-1]; }
            unless ($name) { $idx++; next; }
            $r->print(&entryline($idx,$name,$url,$folder,$allowed,$_,$coursenum));
@@ -1280,9 +1496,9 @@ sub process_file_upload {
         }
         ($errtext,$fatal)=
               &mapread($coursenum,$coursedom,$folder.'.'.$container);
-        if ($#Apache::lonratedt::order<1) {
-            $Apache::lonratedt::order[0]=1;
-            $Apache::lonratedt::resources[1]='';
+        if ($#LONCAPA::map::order<1) {
+            $LONCAPA::map::order[0]=1;
+            $LONCAPA::map::resources[1]='';
         }
         if ($fatal) {
             return 'failed';
@@ -1298,7 +1514,7 @@ sub process_file_upload {
         }
 # this is for a course, not a user, so set coursedoc flag
 # probably the only place in the system where this should be "1"
-        my $newidx=&Apache::lonratedt::getresidx();
+        my $newidx=&LONCAPA::map::getresidx();
         $destination .= $newidx;
         my $url=&Apache::lonnet::userfileupload('uploaddoc',1,$destination,
 						$parseaction,$allfiles,
@@ -1315,9 +1531,9 @@ sub process_file_upload {
                   $env{'user.domain'}.'___&&&___'.$comment;
         }
 
-        $Apache::lonratedt::resources[$newidx]=
-                  $comment.':'.$url.':'.$ext.':normal:res';
-        $Apache::lonratedt::order[$#Apache::lonratedt::order+1]= $newidx;
+        $LONCAPA::map::resources[$newidx]=
+	    $comment.':'.$url.':'.$ext.':normal:res';
+        $LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx;
         ($errtext,$fatal)=&storemap($coursenum,$coursedom,
 				    $folder.'.'.$container);
         if ($fatal) {
@@ -1398,7 +1614,7 @@ sub entryline {
     my $renametitle=$title;
     my $foldertitle=$title;
     my $pagetitle=$title;
-    my $orderidx=$Apache::lonratedt::order[$index];
+    my $orderidx=$LONCAPA::map::order[$index];
     if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/	) { 
 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
 	$renametitle=$4;
@@ -1434,17 +1650,17 @@ sub entryline {
 	my $incindex=$index+1;
 	my $selectbox='';
 	if (($folder!~/^supplemental/) &&
-	    ($#Apache::lonratedt::order>0) && 
+	    ($#LONCAPA::map::order>0) && 
 	    ((split(/\:/,
-	     $Apache::lonratedt::resources[$Apache::lonratedt::order[0]]))[1] 
+	     $LONCAPA::map::resources[$LONCAPA::map::order[0]]))[1] 
 	     ne '') && 
 	    ((split(/\:/,
-	     $Apache::lonratedt::resources[$Apache::lonratedt::order[1]]))[1] 
+	     $LONCAPA::map::resources[$LONCAPA::map::order[1]]))[1] 
 	     ne '')) {
 	    $selectbox=
 		'<input type="hidden" name="currentpos" value="'.$incindex.'" />'.
 		'<select name="newpos" onChange="this.form.submit()">';
-	    for (my $i=1;$i<=$#Apache::lonratedt::order+1;$i++) {
+	    for (my $i=1;$i<=$#LONCAPA::map::order+1;$i++) {
 		if ($i==$incindex) {
 		    $selectbox.='<option value="" selected="1">('.$i.')</option>';
 		} else {
@@ -1485,6 +1701,7 @@ ENDCOPY
 <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
 <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
 <input type="hidden" name="setparms" value="$orderidx" />
+<input type="hidden" name="changeparms" value="0" />
 <td><table border='0' cellspacing='2' cellpadding='0'>
 <tr><td bgcolor="#DDDDDD">
 <a href='/adm/coursedocs?cmd=up_$index&pagepath=$pagepath&pagesymb=$pagesymb$cpinfo'>
@@ -1516,6 +1733,7 @@ ENDCOPY
 <input type="hidden" name="markedcopy_url" value="$env{'form.markedcopy_url'}" />
 <input type="hidden" name="markedcopy_title" value="$env{'form.markedcopy_title'}" />
 <input type="hidden" name="setparms" value="$orderidx" />
+<input type="hidden" name="changeparms" value="0" />
 <td><table border='0' cellspacing='2' cellpadding='0'>
 <tr><td bgcolor="#DDDDDD">
 <a href='/adm/coursedocs?cmd=up_$index&folderpath=$folderpath$cpinfo'>
@@ -1586,7 +1804,11 @@ END
 	} elsif ($url=~m|^/ext/|) { 
 	    $url='/adm/wrapper'.$url;
 	}
-	$url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
+        if (&Apache::lonnet::symbverify($symb,$url)) {
+	    $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb);
+        } else {
+            $url='';
+        }
 	if ($container eq 'page') {
 	    my $symb=$env{'form.pagesymb'};
 	    	    
@@ -1599,11 +1821,18 @@ END
 	my $foldername=&escape($foldertitle);
 	my $folderpath=$env{'form.folderpath'};
 	if ($folderpath) { $folderpath.='&' };
-	$folderpath.=$folderarg.'&'.$foldername;
+# Append randompick number, hidden, and encrypted with ":" to foldername, 
+# so it gets transferred between levels
+	$folderpath.=$folderarg.'&'.$foldername.':'.(&LONCAPA::map::getparameter($orderidx,
+                                              'parameter_randompick'))[0]
+                                               .':'.((&LONCAPA::map::getparameter($orderidx,
+                                              'parameter_hiddenresource'))[0]=~/^yes$/i)
+                                               .':'.((&LONCAPA::map::getparameter($orderidx,
+                                              'parameter_encrypturl'))[0]=~/^yes$/i);
 	$url.='folderpath='.&escape($folderpath).$cpinfo;
 	$parameterset='<label>'.&mt('Randomly Pick: ').
-	    '<input type="text" size="4" onChange="this.form.submit()" name="randpick_'.$orderidx.'" value="'.
-	    (&Apache::lonratedt::getparameter($orderidx,
+	    '<input type="text" size="4" onChange="this.form.changeparms.value=1;this.form.submit()" name="randpick_'.$orderidx.'" value="'.
+	    (&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randompick'))[0].
                                               '" />'.
 '<font size="-2"><a href="javascript:void(0)">'.&mt('Store').'</a></font></label>';
@@ -1629,20 +1858,21 @@ END
     }
     $line.='<td bgcolor="#FFFFBB"><a href="'.$url.'"><img src="'.$icon.
 	'" border="0"></a></td>'.
-        "<td bgcolor='#FFFFBB'><a href=\"$url\">$title</a></td>";
+        "<td bgcolor='#FFFFBB'>".($url?"<a href=\"$url\">":'').$title.
+        ($url?'</a>':' <font size="-2">'.&mt('(re-initialize course to access)').'</font>')."</td>";
     if (($allowed) && ($folder!~/^supplemental/)) {
  	my %lt=&Apache::lonlocal::texthash(
  			      'hd' => 'Hidden',
  			      'ec' => 'URL hidden');
 	my $enctext=
-	    ((&Apache::lonratedt::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
+	    ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':'');
 	my $hidtext=
-	    ((&Apache::lonratedt::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
+	    ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':'');
 	$line.=(<<ENDPARMS);
 <td bgcolor="#BBBBFF"><font size='-2'>
-<nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
+<nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.changeparms.value=1;this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size='-2'>
-<nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
+<nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.changeparms.value=1;this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
 ENDPARMS
     }
@@ -2129,6 +2359,7 @@ sub handler {
 		    'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages');
     $help{'My Personal Info'} = &Apache::loncommon::help_open_topic(
 		  'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages');
+    $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files');
     $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching');
 
 # does this user have privileges to modify docs
@@ -2138,6 +2369,8 @@ sub handler {
       &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {
       &list_symbs($r);
+  } elsif ($allowed && $env{'form.docslog'}) {
+      &docs_change_log($r);
   } elsif ($allowed && $env{'form.versions'}) {
       &checkversions($r);
   } elsif ($allowed && $env{'form.dumpcourse'}) {
@@ -2197,8 +2430,7 @@ sub handler {
 # get personal data 
     my $uname=$env{'user.name'};
     my $udom=$env{'user.domain'};
-    my $plainname=&escape(
-                     &Apache::loncommon::plainname($uname,$udom));
+    my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom));
 
 # graphics settings
 
@@ -2322,6 +2554,7 @@ sub handler {
                 'scuf' => 'Score Upload Form',
                 'bull' => 'Bulletin Board',
                 'mypi' => 'My Personal Info',
+                'grpo' => 'Group Files',
 		'abou' => 'About User',
                 'imsf' => 'Import IMS package',
                 'file' =>  'File',
@@ -2337,6 +2570,7 @@ sub handler {
 					 'vc' => 'Verify Content',
 					 'cv' => 'Check/Set Resource Versions',
 					 'ls' => 'List Symbs',
+                                         'sl' => 'Show Log'
 					  );
 
        my $folderpath=$env{'form.folderpath'};
@@ -2360,7 +2594,7 @@ sub handler {
 $containertag
 </form>
 <form name="simpleedit" method="post" action="/adm/coursedocs">
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 $uploadtag
 </form>
 <form action="/adm/coursedocs" method="post" name="courseverify">
@@ -2373,6 +2607,8 @@ $dumpbut
 $exportbut
 </td><td bgcolor="#DDDDCC">
     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
+</td><td bgcolor="#DDDDCC">
+    <input type="submit" name="docslog" value="$lt{'sl'}" />
 </td></tr></table>
 </form>
 ENDCOURSEVERIFY
@@ -2472,7 +2708,7 @@ ENDFORM
 <hr />
 <form action="/adm/coursedocs" method="post" name="newext">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newext" type="button" onClick="javascript:makenewext('newext');"
 value="$lt{'extr'}" /> $help{'Adding_External_Resource'}
@@ -2490,7 +2726,7 @@ ENDFORM
            $r->print(<<ENDFORM);
 <br /><form action="/adm/coursedocs" method="post" name="newfolder">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newfolder" type="button"
 onClick="javascript:makenewfolder(this.form,'$folderseq');"
@@ -2499,7 +2735,7 @@ value="$lt{'newf'}" />$help{'Adding_Fold
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newpage">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newpage" type="button"
 onClick="javascript:makenewpage(this.form,'$pageseq');"
@@ -2508,8 +2744,8 @@ value="$lt{'newp'}" />$help{'Adding_Page
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newsyl">
 $uploadtag
-<input type=hidden name="importdetail" 
-value="Syllabus=/public/$coursedom/$coursenum/syllabus">
+<input type="hidden" name="importdetail" 
+value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
 <nobr>
 <input name="newsyl" type="submit" value="$lt{'syll'}" /> 
  $help{'Syllabus'}
@@ -2517,8 +2753,8 @@ value="Syllabus=/public/$coursedom/$cour
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newnav">
 $uploadtag
-<input type=hidden name="importdetail" 
-value="Navigate Content=/adm/navmaps">
+<input type="hidden" name="importdetail" 
+value="Navigate Content=/adm/navmaps" />
 <nobr>
 <input name="newnav" type="submit" value="$lt{'navc'}" />
 $help{'Navigate_Content'}
@@ -2526,7 +2762,7 @@ $help{'Navigate_Content'}
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newsmppg">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newsmppg" type="button" value="$lt{'sipa'}"
 onClick="javascript:makesmppage();" /> $help{'Simple Page'}
@@ -2534,7 +2770,7 @@ onClick="javascript:makesmppage();" /> $
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newsmpproblem">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
 onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
@@ -2542,7 +2778,7 @@ onClick="javascript:makesmpproblem();" /
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newdropbox">
 $uploadtag      
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>          
 <input name="newdropbox" type="button" value="$lt{'drbx'}"
 onClick="javascript:makedropbox();" />
@@ -2550,7 +2786,7 @@ onClick="javascript:makedropbox();" />
 </form> 
 <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newexamupload" type="button" value="$lt{'scuf'}"
 onClick="javascript:makeexamupload();" />
@@ -2559,7 +2795,7 @@ $help{'Score_Upload_Form'}
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newbul">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newbulletin" type="button" value="$lt{'bull'}"
 onClick="javascript:makebulboard();" />
@@ -2568,8 +2804,8 @@ $help{'Bulletin Board'}
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newaboutme">
 $uploadtag
-<input type=hidden name="importdetail" 
-value="$plainname=/adm/$udom/$uname/aboutme">
+<input type="hidden" name="importdetail" 
+value="$plainname=/adm/$udom/$uname/aboutme" />
 <nobr>
 <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
 $help{'My Personal Info'}
@@ -2577,19 +2813,28 @@ $help{'My Personal Info'}
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newaboutsomeone">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newaboutsomeone" type="button" value="$lt{'abou'}" 
 onClick="javascript:makeabout();" />
 </nobr>
 </form>
+<br /><form action="/adm/coursedocs" method="post" name="newgroupfiles">
+$uploadtag
+<input type="hidden" name="importdetail"
+value="Group Files=/adm/$coursedom/$coursenum/aboutme" />
+<nobr>
+<input name="newgroupfiles" type="submit" value="$lt{'grpo'}" />
+$help{'Group Files'}
+</nobr>
+</form>
 ENDFORM
        }
        if ($env{'form.pagepath'}) {
            $r->print(<<ENDBLOCK);
 <form action="/adm/coursedocs" method="post" name="newsmpproblem">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newsmpproblem" type="button" value="$lt{'sipr'}"
 onClick="javascript:makesmpproblem();" />$help{'Simple Problem'}
@@ -2597,7 +2842,7 @@ onClick="javascript:makesmpproblem();" /
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="newexamupload">
 $uploadtag
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newexamupload" type="button" value="$lt{'scuf'}"
 onClick="javascript:makeexamupload();" />
@@ -2661,7 +2906,7 @@ $lt{'comment'}:<br />
 <td bgcolor="#DDDDDD">
 <form action="/adm/coursedocs" method="post" name="supnewfolder">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newfolder" type="button"
 onClick="javascript:makenewfolder(this.form,'$folderseq');"
@@ -2670,7 +2915,7 @@ value="$lt{'newf'}" /> $help{'Adding_Fol
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="supnewext">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
-<input type=hidden name="importdetail" value="">
+<input type="hidden" name="importdetail" value="" />
 <nobr>
 <input name="newext" type="button" 
 onClick="javascript:makenewext('supnewext');"
@@ -2679,8 +2924,8 @@ value="$lt{'extr'}" /> $help{'Adding_Ext
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="supnewsyl">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
-<input type=hidden name="importdetail" 
-value="Syllabus=/public/$coursedom/$coursenum/syllabus">
+<input type="hidden" name="importdetail" 
+value="Syllabus=/public/$coursedom/$coursenum/syllabus" />
 <nobr>
 <input name="newsyl" type="submit" value="$lt{'syll'}" />
 $help{'Syllabus'}
@@ -2688,8 +2933,8 @@ $help{'Syllabus'}
 </form>
 <br /><form action="/adm/coursedocs" method="post" name="subnewaboutme">
 <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
-<input type=hidden name="importdetail" 
-value="$plainname=/adm/$udom/$uname/aboutme">
+<input type="hidden" name="importdetail" 
+value="$plainname=/adm/$udom/$uname/aboutme" />
 <nobr>
 <input name="newaboutme" type="submit" value="$lt{'mypi'}" />
 $help{'My Personal Info'}