--- loncom/interface/londocs.pm	2006/11/20 17:45:11	1.254
+++ loncom/interface/londocs.pm	2007/01/05 18:45:40	1.267
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.254 2006/11/20 17:45:11 albertel Exp $
+# $Id: londocs.pm,v 1.267 2007/01/05 18:45:40 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -42,7 +42,7 @@ use HTML::Entities;
 use GDBM_File;
 use Apache::lonlocal;
 use Cwd;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
 
 my $iconpath;
 
@@ -99,7 +99,7 @@ sub authorhosts {
 		$ca=$env{'user.name'};
 		$cd=$env{'user.domain'};
 	    } else {
-		($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/);
+		($cd,$ca)=($realm=~/^\/($match_domain)\/($match_username)$/);
 	    }
 	    my $allowed=0;
 	    my $myhome=&Apache::lonnet::homeserver($ca,$cd);
@@ -147,6 +147,7 @@ sub dumpcourse {
     my $type = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page('Dump '.$type.' DOCS to Construction Space').
 	      '<form name="dumpdoc" method="post">');
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Dump '.$type.' DOCS to Construction Space'));
     my ($home,$other,%outhash)=&authorhosts();
     unless ($home) { return ''; }
     my $origcrsid=$env{'request.course.id'};
@@ -315,6 +316,7 @@ sub exportcourse {
             }
         }
         $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package'));
+	$r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
         $r->print($outcome);
         $r->print(&Apache::loncommon::end_page());
     } else {
@@ -364,7 +366,7 @@ sub exportcourse {
             if (ref($curRes)) {
                 my $symb = $curRes->symb();
                 my $ressymb = $symb;
-                if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
+                if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
                     unless ($ressymb =~ m|adm/wrapper/adm|) {
                         $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                     }
@@ -456,6 +458,7 @@ function containerCheck(item) {
         |;
 	$r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package',
 						 $scripttag));
+	$r->print(&Apache::lonhtmlcommon::breadcrumbs('Export '.lc($type).' to IMS content package'));
 	$r->print($display.'</table>'.
                   '<p><input type="hidden" name="finishexport" value="1">'.
                   '<input type="submit" name="exportcourse" value="'.
@@ -610,7 +613,7 @@ sub build_package {
                         if (grep/^$count$/,@$discussions) {
                             my $ressymb = $symb;
                             my $mode;
-                            if ($ressymb =~ m|adm/(\w+)/(\w+)/(\d+)/bulletinboard$|) {
+                            if ($ressymb =~ m|adm/($match_domain)/($match_username)/(\d+)/bulletinboard$|) {
                                 unless ($ressymb =~ m|adm/wrapper/adm|) {
                                     $ressymb = 'bulletin___'.$3.'___adm/wrapper/adm/'.$1.'/'.$2.'/'.$3.'/bulletinboard';
                                 }
@@ -695,7 +698,7 @@ sub process_content {
         }
     } elsif ($symb =~ m-lib/templates/examupload\.problem$-) {
         $content_type = 'examupload';
-    } elsif ($symb =~ m-adm/(\w+)/(\w+)/(\d+)/bulletinboard$-) {
+    } elsif ($symb =~ m-adm/($match_domain)/($match_username)/(\d+)/bulletinboard$-) {
         $content_type = 'bulletinboard';
         my $contents =  &Apache::imsexport::templatedpage($content_type,$3,$count,\@uploads,$1,$2);
         if ($contents) {
@@ -910,7 +913,7 @@ sub group_import {
     while (@_) {
 	my $name = shift;
 	my $url = shift;
-        if (($url =~ m#^/uploaded/$coursedom/$coursenum/(default_\d+\.)(page|sequence)$#) && ($caller eq 'londocs')) {
+        if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) && ($caller eq 'londocs')) {
             my $errtext = '';
             my $fatal = 0;
             my $newmapstr = '<map>'."\n".
@@ -933,7 +936,7 @@ sub group_import {
 	    my $idx = &LONCAPA::map::getresidx($url);
 	    $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx;
 	    my $ext = 'false';
-	    if ($url=~/^http:\/\//) { $ext = 'true'; }
+	    if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; }
 	    $url =~ s/:/\&colon;/g;
 	    $name =~ s/:/\&colon;/g;
 	    $LONCAPA::map::resources[$idx] = 
@@ -985,7 +988,8 @@ sub breadcrumbs {
 		      {'href'=>$url.$cpinfo,
 		       'title'=>$name,
 		       'text'=>'<font size="+1">'.
-			   $name.'</font>'
+			   $name.'</font>',
+		       'no_mt'=>1,
 		       });
 	$plain.=$name.' &gt; ';
     }
@@ -1025,7 +1029,8 @@ sub log_docs {
 
     sub log_differences {
         my ($plain)=@_;
-        my %storehash=('folder' => $plain);
+        my %storehash=('folder' => $plain,
+                       'currentfolder' => $env{'form.folder'});
         if ($parmidx) {
            $storehash{'parameter_res'}=$oldresources[$parmidx];
            foreach my $parm (keys %parmaction) {
@@ -1060,9 +1065,9 @@ sub log_docs {
 #
 sub docs_change_log {
     my ($r)=@_;
+    my $folder=$env{'form.folder'};
     $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'});
@@ -1083,12 +1088,8 @@ sub docs_change_log {
 	    '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>'.
+    $r->print(&Apache::loncommon::display_filter().
+              '<input type="hidden" name="folder" value="'.$folder.'" />'.
               '<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>'.
@@ -1096,7 +1097,18 @@ sub docs_change_log {
               &Apache::loncommon::end_data_table_header_row());
     my $shown=0;
     foreach my $id (sort { $docslog{$b}{'exe_time'}<=>$docslog{$a}{'exe_time'} } (keys(%docslog))) {
+	if ($env{'form.displayfilter'} eq 'currentfolder') {
+	    if ($docslog{$id}{'logentry'}{'currentfolder'} ne $folder) { next; }
+	}
         my @changes=keys(%{$docslog{$id}{'logentry'}});
+        if ($env{'form.displayfilter'} eq 'containing') {
+	    my $wholeentry=$docslog{$id}{'exe_uname'}.':'.$docslog{$id}{'exe_udom'}.':'.
+		&Apache::loncommon::plainname($docslog{$id}{'exe_uname'},$docslog{$id}{'exe_udom'});
+	    foreach my $key (@changes) {
+		$wholeentry.=':'.$docslog{$id}{'logentry'}{$key};
+	    }
+	    if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }         
+	}
         my $count = 0;
         my $time =
             &Apache::lonlocal::locallocaltime($docslog{$id}{'exe_time'});
@@ -1212,27 +1224,33 @@ sub editor {
 	    if ($env{'form.changeparms'}) {
 		my $idx=$env{'form.setparms'};
 # set parameters
-		if ($env{'form.randpick_'.$idx}) {
-		    &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
-                    &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
-		} else {
-		    &LONCAPA::map::delparameter($idx,'parameter_randompick');
-                    &remember_parms($idx,'randompick','del');
+		if ($env{'form.changeparms'} eq 'randompick') {
+		    if ($env{'form.randpick_'.$idx}) {
+			&LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos');
+			&remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx});
+		    } else {
+			&LONCAPA::map::delparameter($idx,'parameter_randompick');
+			&remember_parms($idx,'randompick','del');
+		    }
+		}
+		if ($env{'form.changeparms'} eq 'hiddenresource') {
+		    if ($env{'form.hidprs_'.$idx}) {
+			&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.changeparms'} eq 'encrypturl') {
+		    if ($env{'form.encprs_'.$idx}) {
+			&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');
+		    }
 		}
-		if ($env{'form.hidprs_'.$idx}) {
-		    &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}) {
-		    &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) {
@@ -1292,7 +1310,7 @@ sub editor {
 		    $url=~/^(.+)\.(\w+)$/;
 		    my $newurl=$1.$newid.'.'.$2;
 		    my $storefn=$newurl;
-                    $storefn=~s/^\/\w+\/\w+\/\w+\///;
+                    $storefn=~s{^/\w+/$match_domain/$match_username/}{};
 		    &Apache::lonclonecourse::writefile
 			($env{'request.course.id'},$storefn,
 			 &Apache::lonnet::getfile($url));
@@ -1600,7 +1618,7 @@ sub process_secondary_uploads {
     $destination .= $newidx;
     my ($url,$filename);
     $url=&Apache::lonnet::userfileupload($formname.$num,1,$destination);
-    ($filename) = ($url =~ m-^/uploaded/$coursedom/$coursenum/$destination/(.+)$-);
+    ($filename) = ($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/\Q$destination\E/(.+)$});
     return $filename;
 }
 
@@ -1615,7 +1633,7 @@ sub entryline {
     my $foldertitle=$title;
     my $pagetitle=$title;
     my $orderidx=$LONCAPA::map::order[$index];
-    if ($title=~ /^(\d+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(\w+)___&amp;&amp;&amp;___(.*)$/	) { 
+    if ($title=~ /^(\d+)___&amp;&amp;&amp;___($match_username)___&amp;&amp;&amp;___($match_domain)___&amp;&amp;&amp;___(.*)$/	) { 
 	$foldertitle=&Apache::lontexconvert::msgtexconverted($4);
 	$renametitle=$4;
 	$title='<i>'.&Apache::lonlocal::locallocaltime($1).'</i> '.
@@ -1686,13 +1704,19 @@ sub entryline {
 		}
 	    }
 	}
+        if ($url=~/^\/res\/lib\/templates\//) { $nocopy=1; }
         my $copylink='&nbsp;';
+        my $cutlink='&nbsp;';
         if ($env{'form.pagepath'}) {
            unless ($nocopy) {
                $copylink=(<<ENDCOPY);
 <a href='javascript:markcopy("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
 ENDCOPY
+               $cutlink=(<<ENDCUT);
+<a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
+<font size="-2" color="#550044">$lt{'ct'}</font></a>
+ENDCUT
             }
             $line.=(<<END);
 <form name="entry_$index" action="/adm/coursedocs" method="post">
@@ -1714,8 +1738,7 @@ ENDCOPY
 </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>
-<a href='javascript:cutres("$pagepath","$index","$renametitle","page","$pagesymb");'>
-<font size="-2" color="#550044">$lt{'ct'}</font></a>
+$cutlink
 <a href='javascript:changename("$pagepath","$index","$renametitle","page","$pagesymb");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a>
 $copylink
@@ -1726,6 +1749,10 @@ END
 <a href='javascript:markcopy("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#000099">$lt{'cp'}</font></a></td>
 ENDCOPY
+               $cutlink=(<<ENDCUT);
+<a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
+<font size="-2" color="#550044">$lt{'ct'}</font></a>
+ENDCUT
             }
             $line.=(<<END); 
 <form name="entry_$index" action="/adm/coursedocs" method="post">
@@ -1746,8 +1773,7 @@ ENDCOPY
 </td><td bgcolor="#DDDDDD">
 <a href='javascript:removeres("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#990000">$lt{'rm'}</font></a>
-<a href='javascript:cutres("$folderpath","$index","$renametitle","sequence");'>
-<font size="-2" color="#550044">$lt{'ct'}</font></a>
+$cutlink
 <a href='javascript:changename("$folderpath","$index","$renametitle","sequence");'>
 <font size="-2" color="#009900">$lt{'rn'}</font></a>
 $copylink
@@ -1766,13 +1792,13 @@ END
     if ($uploaded) {
 	if ($extension eq 'sequence') {
 	    $icon=$iconpath.'/folder_closed.gif';
-	    $url=~/$coursenum\/([\/\w]+)\.sequence$/;
+	    $url=~/\Q$coursenum\E\/([\/\w]+)\.sequence$/;
 	    $url='/adm/coursedocs?';
 	    $folderarg=$1;
 	    $isfolder=1;
         } elsif ($extension eq 'page') {
             $icon=$iconpath.'/page.gif';
-            $url=~/$coursenum\/([\/\w]+)\.page$/;
+            $url=~/\Q$coursenum\E\/([\/\w]+)\.page$/;
             $pagearg=$1;
             $url='/adm/coursedocs?';
             $ispage=1;
@@ -1831,7 +1857,7 @@ END
                                               'parameter_encrypturl'))[0]=~/^yes$/i);
 	$url.='folderpath='.&escape($folderpath).$cpinfo;
 	$parameterset='<label>'.&mt('Randomly Pick: ').
-	    '<input type="text" size="4" onChange="this.form.changeparms.value=1;this.form.submit()" name="randpick_'.$orderidx.'" value="'.
+	    '<input type="text" size="4" onChange="this.form.changeparms.value='."'randompick'".';this.form.submit()" name="randpick_'.$orderidx.'" value="'.
 	    (&LONCAPA::map::getparameter($orderidx,
                                               'parameter_randompick'))[0].
                                               '" />'.
@@ -1870,9 +1896,9 @@ END
 	    ((&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.changeparms.value=1;this.form.submit()" $hidtext /> $lt{'hd'}</label></nobr></td>
+<nobr><label><input type="checkbox" name="hidprs_$orderidx" onClick="this.form.changeparms.value='hiddenresource';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.changeparms.value=1;this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
+<nobr><label><input type="checkbox" name="encprs_$orderidx" onClick="this.form.changeparms.value='encrypturl';this.form.submit()" $enctext /> $lt{'ec'}</label></nobr></td>
 <td bgcolor="#BBBBFF"><font size="-2">$parameterset</font></td>
 ENDPARMS
     }
@@ -1986,6 +2012,7 @@ sub list_symbs {
     my ($r) = @_;
 
     $r->print(&Apache::loncommon::start_page('Symb List'));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs('Symb List'));
     my $navmap = Apache::lonnavmaps::navmap->new();
     $r->print("<pre>\n");
     foreach my $res ($navmap->retrieveResources()) {
@@ -2005,6 +2032,7 @@ sub verifycontent {
    my $loaderror=&Apache::lonnet::overloaderror($r);
    if ($loaderror) { return $loaderror; }
    $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents'));
+   $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents'));
    $hashtied=0;
    undef %alreadyseen;
    %alreadyseen=();
@@ -2040,6 +2068,7 @@ sub checkversions {
     my ($r) = @_;
     my $type = &Apache::loncommon::course_type();
     $r->print(&Apache::loncommon::start_page("Check $type Document Versions"));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions"));
     my $header='';
     my $startsel='';
     my $monthsel='';
@@ -2331,6 +2360,22 @@ sub changewarning {
 $help{'Caching'}.'</font></h3></form>'."\n\n");
 }
 
+# =========================================== Breadcrumbs for special functions
+
+sub init_breadcrumbs {
+    my ($form,$text)=@_;
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
+    &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs",
+					    text=>&Apache::loncommon::course_type()." Documents",
+					    faq=>273,
+					    bug=>'Instructor Interface',
+                                            help => 'Docs_Adding_Course_Doc'});
+    &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1',
+					    text=>$text,
+					    faq=>273,
+					    bug=>'Instructor Interface'});
+}
+
 # ================================================================ Main Handler
 sub handler {
     my $r = shift;
@@ -2359,22 +2404,28 @@ 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
     my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'});
-
   if ($allowed && $env{'form.verify'}) {
+      &init_breadcrumbs('verify','Verify Content');
       &verifycontent($r);
   } elsif ($allowed && $env{'form.listsymbs'}) {
+      &init_breadcrumbs('listsymbs','List Symbs');
       &list_symbs($r);
   } elsif ($allowed && $env{'form.docslog'}) {
+      &init_breadcrumbs('docslog','Show Log');
       &docs_change_log($r);
   } elsif ($allowed && $env{'form.versions'}) {
+      &init_breadcrumbs('versions','Check/Set Resource Versions');
       &checkversions($r);
   } elsif ($allowed && $env{'form.dumpcourse'}) {
+      &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space');
       &dumpcourse($r);
   } elsif ($allowed && $env{'form.exportcourse'}) {
+      &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS');
       &exportcourse($r);
   } else {
 # is this a standard course?
@@ -2448,7 +2499,8 @@ sub handler {
   my %codebase = ();
   my ($upload_result,$upload_output);
   if ($allowed) {
-      if (($env{'form.uploaddoc.filename'}) &&                                               ($env{'form.cmd'}=~/^upload_(\w+)/)) {
+      if (($env{'form.uploaddoc.filename'}) &&
+	  ($env{'form.cmd'}=~/^upload_(\w+)/)) {
 # Process file upload - phase one - upload and parse primary file.  
           $upload_result = &process_file_upload(\$upload_output,$coursenum,
 						$coursedom,\%allfiles,
@@ -2553,6 +2605,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',
@@ -2592,7 +2645,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">
@@ -2606,6 +2659,7 @@ $exportbut
 </td><td bgcolor="#DDDDCC">
     <input type="submit" name="listsymbs" value="$lt{'ls'}" />
 </td><td bgcolor="#DDDDCC">
+    <input type="hidden" name="folder" value="$env{'form.folder'}" />
     <input type="submit" name="docslog" value="$lt{'sl'}" />
 </td></tr></table>
 </form>
@@ -2706,7 +2760,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'}
@@ -2724,7 +2778,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');"
@@ -2733,7 +2787,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');"
@@ -2742,8 +2796,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'}
@@ -2751,8 +2805,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'}
@@ -2760,7 +2814,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'}
@@ -2768,7 +2822,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'}
@@ -2776,7 +2830,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();" />
@@ -2784,7 +2838,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();" />
@@ -2793,7 +2847,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();" />
@@ -2802,8 +2856,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'}
@@ -2811,19 +2865,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'}
@@ -2831,7 +2894,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();" />
@@ -2895,7 +2958,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');"
@@ -2904,7 +2967,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');"
@@ -2913,8 +2976,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'}
@@ -2922,8 +2985,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'}