--- loncom/interface/londocs.pm	2022/10/19 00:03:10	1.682
+++ loncom/interface/londocs.pm	2023/03/23 22:54:38	1.697
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Documents
 #
-# $Id: londocs.pm,v 1.682 2022/10/19 00:03:10 raeburn Exp $
+# $Id: londocs.pm,v 1.697 2023/03/23 22:54:38 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -183,43 +183,62 @@ sub default_folderpath {
     }
 }
 
-sub validate_folderpath {
-    my ($supplementalflag) = @_;
-    if ($env{'form.folderpath'} ne '') {
-        my @items = split(/\&/,$env{'form.folderpath'});
-        my $badpath;
-        for (my $i=0; $i<@items; $i++) {
-            my $odd = $i%2;
-            if (($odd) && (!$supplementalflag) && ($items[$i] !~ /^[^:]*:(|\d+):(|1):(|1):(|1):(|1)$/)) {
-                $badpath = 1;
-            } elsif ((!$odd) && ($items[$i] !~ /^(default|supplemental)(|_\d+)$/)) {
-                $badpath = 1;
-            }
-            last if ($badpath);
-        }
-        if ($badpath) {
-            delete($env{'form.folderpath'});
-        }
-    }
-    return;
-}
-
-sub validate_suppath {
+sub validate_supppath {
+    my ($coursenum,$coursedom) = @_;
+    my $backto;
     if ($env{'form.supppath'} ne '') {
         my @items = split(/\&/,$env{'form.supppath'});
-        my $badpath;
+        my ($badpath,$got_supp,$supppath,%supphidden,%suppids);
         for (my $i=0; $i<@items; $i++) {
             my $odd = $i%2;
             if ((!$odd) && ($items[$i] !~ /^supplemental(|_\d+)$/)) {
                 $badpath = 1;
+                last;
+            } elsif ($odd) {
+                my $suffix;
+                my $idx = $i-1;
+                if ($items[$i] =~ /^([^:]*)::(|1):::$/) {
+                    $backto .= '&'.$1;
+                } elsif ($items[$idx] eq 'supplemental') {
+                    $backto .= '&'.$items[$i];
+                } else {
+                    $backto .= '&'.$items[$i];
+                    my $is_hidden;
+                    unless ($got_supp) {
+                        my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
+                        if (ref($supplemental) eq 'HASH') {
+                            if (ref($supplemental->{'hidden'}) eq 'HASH') {
+                                %supphidden = %{$supplemental->{'hidden'}};
+                            }
+                            if (ref($supplemental->{'ids'}) eq 'HASH') {
+                                %suppids = %{$supplemental->{'ids'}};
+                            }
+                        }
+                        $got_supp = 1;
+                    }
+                    if (ref($suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}) eq 'ARRAY') {
+                        my $mapid = $suppids{"/uploaded/$coursedom/$coursenum/$items[$idx].sequence"}->[0];
+                        if ($supphidden{$mapid}) {
+                            $is_hidden = 1;
+                        }
+                    }
+                    $suffix = '::'.$is_hidden.':::';
+                }
+                $supppath .= '&'.$items[$i].$suffix;
+            } else {
+                $supppath .= '&'.$items[$i];
+                $backto .= '&'.$items[$i];
             }
-            last if ($badpath);
         }
         if ($badpath) {
             delete($env{'form.supppath'});
+        } else {
+            $supppath =~ s/^\&//;
+            $backto =~ s/^\&//;
+            $env{'form.supppath'} = $supppath;
         }
     }
-    return;
+    return $backto;
 }
 
 sub dumpcourse {
@@ -1188,7 +1207,13 @@ sub docs_change_log {
 	}
 	$r->print('</ul>');
 	if ($docslog{$id}{'logentry'}{'parameter_res'}) {
-	    $r->print(&LONCAPA::map::qtescape((split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'}))[0]).':<ul>');
+            my ($title,$url) = split(/\:/,$docslog{$id}{'logentry'}{'parameter_res'},3);
+            if ($title eq '') {
+                ($title) = ($url =~ m{/([^/]+)$});
+            } elsif ($is_supp) {
+                $title = &Apache::loncommon::parse_supplemental_title($title);
+            }
+            $r->print(&LONCAPA::map::qtescape($title).':<ul>');
 	    foreach my $parameter ('randompick','hiddenresource','encrypturl','randomorder','gradable') {
 		if ($docslog{$id}{'logentry'}{'parameter_action_'.$parameter}) {
 # FIXME: internationalization seems wrong here
@@ -3090,7 +3115,7 @@ sub update_parameter {
             my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]);
             $name=&LONCAPA::map::qtescape($name);
             $url=&LONCAPA::map::qtescape($url);
-            next unless ($name && $url);
+            next unless $url;
             my $is_map;
             if ($url =~ m{/uploaded/.+\.(page|sequence)$}) {
                 $is_map = 1;
@@ -3277,28 +3302,11 @@ sub editor {
         return $errtext if ($fatal);
     }
 
-    my (%supphidden,%suppids,$suppmapid);
-
     if ($#LONCAPA::map::order<1) {
 	my $idx=&LONCAPA::map::getresidx();
 	if ($idx<=0) { $idx=1; }
        	$LONCAPA::map::order[0]=$idx;
         $LONCAPA::map::resources[$idx]='';
-    } elsif ($supplementalflag && !$allowed) {
-        my ($supplemental) = &Apache::lonnet::get_supplemental($coursenum,$coursedom);
-        if (ref($supplemental) eq 'HASH') {
-            if (ref($supplemental->{'hidden'}) eq 'HASH') {
-                %supphidden = %{$supplemental->{'hidden'}};
-            }
-            if (ref($supplemental->{'ids'}) eq 'HASH') {
-                %suppids = %{$supplemental->{'ids'}};
-            }
-        }
-        if ($folder eq 'supplemental') {
-            $suppmapid = 0;
-        } elsif ($folder =~ /^supplemental_(\d+)$/) {
-            $suppmapid = $1;
-        }
     }
 
 # ------------------------------------------------------------ Process commands
@@ -3559,6 +3567,21 @@ sub editor {
         $r->print('</div>');
     }
 
+    if ((!$allowed) && ($folder =~ /^supplemental_\d+$/)) {
+        my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
+        if (ref($supplemental) eq 'HASH') {
+            if ((ref($supplemental->{'hidden'}) eq 'HASH') &&
+                (ref($supplemental->{'ids'}) eq 'HASH')) {
+                if (ref($supplemental->{'ids'}->{"/uploaded/$coursedom/$coursenum/$folder.$container"}) eq 'ARRAY') {
+                    my $mapnum = $supplemental->{'ids'}->{"/uploaded/$coursedom/$coursenum/$folder.$container"}->[0];
+                    if ($supplemental->{'hidden'}->{$mapnum}) {
+                        $ishidden = 1;
+                    }
+                }
+            }
+        }
+    }
+
     my ($to_show,$output,@allidx,@allmapidx,%filters,%lists,%curr_groups);
     %filters =  (
                   canremove      => [],
@@ -3583,14 +3606,16 @@ sub editor {
         }
 
         if (($supplementalflag) && (!$allowed) && (!$env{'request.role.adv'})) {
-            next if ($supphidden{$suppmapid.':'.$res});
+            if (($ishidden) || ((&LONCAPA::map::getparameter($res,'parameter_hiddenresource'))[0]=~/^yes$/i)) {
+                $idx++;
+                next;
+            }
         }
         $output .= &entryline($idx,$name,$url,$folder,$allowed,$res,
                               $coursenum,$coursedom,$crstype,
                               $pathitem,$supplementalflag,$container,
                               \%filters,\%curr_groups,$ltitoolsref,$canedit,
-                              $isencrypted,$navmapref,$hostname,
-                              \%supphidden,\%suppids,$suppmapid);
+                              $isencrypted,$ishidden,$navmapref,$hostname);
         $idx++;
         $shown++;
     }
@@ -3972,13 +3997,14 @@ sub is_supplemental_title {
 sub entryline {
     my ($index,$title,$url,$folder,$allowed,$residx,$coursenum,$coursedom,
         $crstype,$pathitem,$supplementalflag,$container,$filtersref,$currgroups,
-        $ltitoolsref,$canedit,$isencrypted,$navmapref,$hostname,
-        $supphidden,$suppids,$suppmapid)=@_;
-    my ($foldertitle,$renametitle,$oldtitle);
+        $ltitoolsref,$canedit,$isencrypted,$ishidden,$navmapref,$hostname)=@_;
+    my ($foldertitle,$renametitle,$oldtitle,$encodedtitle);
     if (&is_supplemental_title($title)) {
 	($title,$foldertitle,$renametitle) = &Apache::loncommon::parse_supplemental_title($title);
+        $encodedtitle=$title;
     } else {
 	$title=&HTML::Entities::encode($title,'"<>&\'');
+        $encodedtitle=$title;
 	$renametitle=$title;
 	$foldertitle=$title;
     }
@@ -4205,6 +4231,7 @@ END
     my $ispage;
     my $containerarg;
     my $folderurl;
+    my $plainurl;
     if ($uploaded) {
         if (($extension eq 'sequence') || ($extension eq 'page')) {
             $url=~/\Q$coursenum\E\/([\/\w]+)\.\Q$extension\E$/;
@@ -4223,7 +4250,7 @@ END
                 $url='/adm/supplemental?';
             }
 	} else {
-	    &Apache::lonnet::allowuploaded('/adm/coursedoc',$url);
+	    $plainurl = $url;
 	}
     }
 
@@ -4273,7 +4300,7 @@ END
                     $nomodal = 1;
                 }
             }
-            my ($checkencrypt,$shownurl);
+            my $checkencrypt;
             if (!$env{'request.role.adv'}) {
                 if (((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i) ||
                     ($isencrypted) || (&Apache::lonnet::EXT('resource.0.encrypturl',$symb) =~ /^yes$/i)) {
@@ -4293,7 +4320,7 @@ END
                 my $currenc = $env{'request.enc'};
                 $env{'request.enc'} = 1;
                 $shownsymb = &Apache::lonenc::encrypted($symb);
-                $shownurl = &Apache::lonenc::encrypted($url);
+                my $shownurl = &Apache::lonenc::encrypted($url);
                 if (&Apache::lonnet::symbverify($symb,$url)) {
                     $url = $shownurl;
                 } else {
@@ -4308,7 +4335,8 @@ END
                         $url = &Apache::lonnet::clutter($url);
                     }
                 }
-                $shownurl = $url;
+            } else {
+                $url = '';
             }
             unless ($env{'request.role.adv'}) {
                 if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
@@ -4319,8 +4347,8 @@ END
                     $hiddenres = 1;
                 }
             }
-            if ($url ne '') {
-                $url = $shownurl.(($shownurl=~/\?/)?'&':'?').'symb='.&escape($shownsymb);
+            if (($url ne '') && ($shownsymb ne '')) {
+                $url .= (($url=~/\?/)?'&':'?').'symb='.&escape($shownsymb);
             }
 	}
     } elsif ($supplementalflag) {
@@ -4349,6 +4377,22 @@ END
                 }
                 $nomodal = 1;
             }
+        } elsif (($uploaded) && (!$allowed) && ($url ne '/adm/supplemental?')) {
+            my $embstyle=&Apache::loncommon::fileembstyle($extension);
+            unless ($embstyle eq 'ssi') {
+                if (($embstyle eq 'img')
+                 || ($embstyle eq 'emb')
+                 || ($embstyle eq 'wrp')) {
+                    $url='/adm/wrapper'.$url;
+                } elsif ($url !~ /\.(sequence|page)$/) {
+                    $url='/adm/coursedocs/showdoc'.$url;
+                }
+            }
+        }
+        unless ($allowed && $env{'request.role.adv'}) {
+            if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
+                $hiddenres = 1;
+            }
         }
     }
     my ($rand_pick_text,$rand_order_text,$hiddenfolder);
@@ -4360,10 +4404,8 @@ END
         if (!$allowed && $supplementalflag) {
             $folderpath.=$containerarg.'&'.$foldername;
             $url.='folderpath='.&escape($folderpath);
-            if (ref($supphidden) eq 'HASH') {
-                if ($supphidden->{$suppmapid.':'.$residx}) {
-                    $hiddenfolder = 1;
-                }
+            if ($ishidden || (&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
+                $hiddenfolder = 1;
             }
         } else {
             my $rpicknum = (&LONCAPA::map::getparameter($orderidx,
@@ -4450,7 +4492,7 @@ $form_end;
         $url .= ($url =~ /\?/) ? '&amp;':'?';
         $url .= 'folderpath='.&HTML::Entities::encode($esc_path,'<>&"');
         if ($title) {
-            $url .= '&amp;title='.&HTML::Entities::encode($renametitle,'<>&"');
+            $url .= '&amp;title='.$encodedtitle;
         }
         if ((($isexternal) || ($isexttool)) && $orderidx) {
             $url .= '&amp;idx='.$orderidx;
@@ -4458,11 +4500,6 @@ $form_end;
         if ($anchor ne '') {
             $url .= '&amp;anchor='.&HTML::Entities::encode($anchor,'"<>&');
         }
-        if (ref($supphidden) eq 'HASH') {
-            if ($supphidden->{$suppmapid.':'.$residx}) {
-                $hiddenres = 1;
-            }
-        }
     }
     my ($tdalign,$tdwidth);
     if ($allowed) {
@@ -4521,9 +4558,18 @@ $form_end;
         }
     }
     $line.='</td><td>';
-    my $link;
+    my ($link,$nolink);
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
-       $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';
+        if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage) {
+            if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
+                $nolink = 1;
+            }
+        }
+        if ($nolink) {
+            $line .= '<img src="'.$icon.'" alt="" class="LC_icon" /></a>';
+        } else {
+            $line.='<a href="'.$url.'"><img src="'.$icon.'" alt="" class="LC_icon" /></a>';
+        }
     } elsif ($url) {
        if ($anchor ne '') {
            if ($supplementalflag) {
@@ -4538,7 +4584,14 @@ $form_end;
            $link = $url;
        }
        $link = &js_escape($link.(($url=~/\?/)?'&amp;':'?').'inhibitmenu=yes'.$anchor);
-       if ($nomodal) {
+       if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage && !$uploaded) {
+           if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
+               $nolink = 1;
+           }
+       }
+       if ($nolink) {
+           $line.='<img src="'.$icon.'" alt="" class="LC_icon" />';
+       } elsif ($nomodal) {
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.
                   '<img src="'.$icon.'" alt="" class="LC_icon" border="0" /></a>';
        } else {
@@ -4550,7 +4603,11 @@ $form_end;
     }
     $line.='</span></td><td'.$tdwidth.'>';
     if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) {
-       $line.='<a href="'.$url.'">'.$title.'</a>';
+       if ($nolink) {
+           $line.=$title;
+       } else {
+           $line.='<a href="'.$url.'">'.$title.'</a>';
+       }
        if (!$allowed && $supplementalflag && $canedit && $isfolder) {
            my $editicon = &Apache::loncommon::lonhttpdurl('/res/adm/pages').'/editmap.png';
            my $editurl = $url;
@@ -4563,7 +4620,9 @@ $form_end;
            $line.= ' <span class="LC_warning">('.&mt('hidden').')</span> ';
        }
     } elsif ($url) {
-       if ($nomodal) {
+       if ($nolink) {
+           $line.=$title;
+       } elsif ($nomodal) {
            $line.='<a href="#" onclick="javascript:window.open('."'$link','syllabuspreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1')".'; return false;" />'.
                   $title.'</a>';
        } else {
@@ -4582,6 +4641,11 @@ $form_end;
     $line .= '</td>';
     $rand_pick_text = '&nbsp;' if ($rand_pick_text eq '');
     $rand_order_text = '&nbsp;' if ($rand_order_text eq '');
+    if ($uploaded && $url && !$isfolder && !$ispage) {
+        if (($plainurl ne '') && ($env{'request.role.adv'} || $allowed || !$hiddenres)) {
+            &Apache::lonnet::allowuploaded('/adm/coursedoc',$plainurl);
+        }
+    }
     if ($allowed) {
         my %lt=&Apache::lonlocal::texthash(
                               'hd' => 'Hidden',
@@ -4589,7 +4653,7 @@ $form_end;
         my ($enctext,$hidtext,$formhidden,$formurlhidden);
         if ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i) {
             $hidtext = ' checked="checked"';
-            if (($ishash) && (ref($filtersref->{'randomorder'}) eq 'ARRAY')) {
+            if (($ishash) && (ref($filtersref->{'hiddenresource'}) eq 'ARRAY')) {
                 push(@{$filtersref->{'hiddenresource'}},$orderidx);
             }
         }
@@ -5644,11 +5708,14 @@ sub handler {
     if ($env{'form.tools'}) { $toolsflag=1; }
 
     if ($env{'form.folderpath'} ne '') {
-        &validate_folderpath($supplementalflag);
+        &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
     }
 
+    my $backto_supppath;
     if ($env{'form.supppath'} ne '') {
-        &validate_suppath();
+        if ($supplementalflag && $allowed) {
+            $backto_supppath = &validate_supppath($coursenum,$coursedom);
+        }
     }
 
     my $script='';
@@ -5669,10 +5736,10 @@ sub handler {
                &Apache::loncommon::symb_to_docspath($env{'form.symb'},\$navmap);
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
                $env{'form.command'}.'_'.$env{'form.symb'}});
-       } elsif ($env{'form.supppath'} ne '') {
+       } elsif (($env{'form.supppath'} ne '') && $supplementalflag && $allowed) {
            $env{'form.folderpath'}=$env{'form.supppath'};
            &Apache::lonnet::appenv({'docs.exit.'.$env{'request.course.id'} =>
-               $env{'form.command'}.'_'.$env{'form.supppath'}});
+               $env{'form.command'}.'_'.$backto_supppath});
        }
    } elsif ($env{'form.command'} eq 'editdocs') {
        $env{'form.folderpath'} = &default_folderpath($coursenum,$coursedom,\$navmap);
@@ -5708,7 +5775,7 @@ sub handler {
             undef($env{'form.folderpath'});
         }
         if ($env{'form.folderpath'} ne '') {
-            &validate_folderpath($supplementalflag);
+            &Apache::loncommon::validate_folderpath($supplementalflag,$allowed,$coursenum,$coursedom);
         }
     }
    
@@ -5724,10 +5791,10 @@ sub handler {
                                   .'&'.
                                   $env{'form.folderpath'};
     }
-# If allowed and user's role is not advanced check folderpath is not hidden  
-    if (($allowed) && (!$env{'request.role.adv'}) && 
-        ($env{'form.folderpath'} ne '') && (!$supplementalflag)) {
-        my $folderurl;
+# If allowed and user's role is not advanced check folderpath is not hidden
+    my $hidden_and_empty;
+    if (($allowed) && (!$env{'request.role.adv'}) && ($env{'form.folderpath'} ne '')) {
+        my ($folderurl,$foldername,$hiddenfolder);
         my @pathitems = split(/\&/,$env{'form.folderpath'});
         my $folder = $pathitems[-2];
         if ($folder eq '') {
@@ -5739,21 +5806,74 @@ sub handler {
             } else {
                 $folderurl .= '.sequence';
             }
-            unless (ref($navmap)) {
-                $navmap = Apache::lonnavmaps::navmap->new();
-            }
-            if (ref($navmap)) {
-                if (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes') {
-                    my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);
-                    unless (@resources) {
-                        undef($env{'form.folderpath'});
+            if ($supplementalflag) {
+                ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*)::(|1):::$/);
+                $foldername = &HTML::Entities::decode(&unescape($foldername));
+                my ($supplemental) = &Apache::loncommon::get_supplemental($coursenum,$coursedom);
+                if (ref($supplemental) eq 'HASH') {
+                    my ($suppmap,$suppmapnum);
+                    if ($folder eq 'supplemental') {
+                        $suppmap = 'default';
+                        $suppmapnum = 0;
+                    } elsif ($folder =~ /^supplemental_(\d+)$/) {
+                        $suppmap = $1;
+                        $suppmapnum = $suppmap;
+                    }
+                    if ($hiddenfolder) {
+                        my $hascontent;
+                        foreach my $key (reverse(sort(keys(%{$supplemental->{'ids'}})))) {
+                            if ($key =~ m{^\Q/uploaded/$coursedom/$coursenum/supplemental/$suppmap/\E}) {
+                                $hascontent = 1;
+                            } elsif (ref($supplemental->{'ids'}->{$key}) eq 'ARRAY') {
+                                foreach my $id (@{$supplemental->{'ids'}->{$key}}) {
+                                    if ($id =~ /^$suppmapnum\:/) {
+                                        $hascontent = 1;
+                                        last;
+                                    }
+                                }
+                            }
+                            last if ($hascontent);
+                        }
+                        unless ($hascontent) {
+                            if ($foldername ne '') {
+                                $hidden_and_empty = $foldername;
+                            } else {
+                                $hidden_and_empty = $folder;
+                            }
+                        }
+                    }
+                }
+            } else {
+                unless (ref($navmap)) {
+                    $navmap = Apache::lonnavmaps::navmap->new();
+                }
+                ($foldername,$hiddenfolder) = ($pathitems[-1] =~ /^([^:]*):|\d+:|1:(|1):|1:|1$/);
+                $foldername = &HTML::Entities::decode(&unescape($foldername));
+                if (ref($navmap)) {
+                    if ($hiddenfolder ||
+                        (lc($navmap->get_mapparam(undef,$folderurl,"0.hiddenresource")) eq 'yes')) {
+                        my @resources = $navmap->retrieveResources($folderurl,$filterFunc,1,1);
+                        unless (@resources) {
+                            if ($foldername ne '') {
+                                $hidden_and_empty = $foldername;
+                            } else {
+                                $hidden_and_empty = $folder;
+                            }
+                        }
                     }
                 }
             }
+            if ($hidden_and_empty ne '') {
+                splice(@pathitems,-2);
+                if (@pathitems) {
+                    $env{'form.folderpath'} = join('&',@pathitems);
+                } else {
+                    undef($env{'form.folderpath'});
+                }
+            }
         }
     }
 
-
 # If after all of this, we still don't have any paths, make them
     unless ($env{'form.folderpath'}) {
        if ($supplementalflag) {
@@ -5847,8 +5967,14 @@ sub handler {
                        &inject_data_js().
                        &Apache::lonhtmlcommon::resize_scrollbox_js('docs',$tabidstr,$tid).
                        &Apache::lonextresedit::extedit_javascript(\%ltitools);
+            my $onload = "javascript:resize_scrollbox('contentscroll','1','1');";
+            if ($hidden_and_empty ne '') {
+                my $alert = &mt("Additional privileges required to edit empty and hidden folder: '[_1]'",
+                                $hidden_and_empty);
+                $onload .= "javascript:alert('".&js_escape($alert)."');";
+            }
             $addentries = {
-                            onload   => "javascript:resize_scrollbox('contentscroll','1','1');",
+                            onload => $onload,
                           };
         }
         $script .= &paste_popup_js(); 
@@ -5872,7 +5998,8 @@ sub handler {
     if ($showdoc) {
         my $args;
         if ($supplementalflag) {
-            my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$env{'form.title'},1);
+            my $title = &HTML::Entities::encode($env{'form.title'},'\'"<>&');
+            my $brcrum = &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
             $args = {'bread_crumbs' => $brcrum};
         } else {
             $args = {'force_register' => $showdoc};
@@ -5931,6 +6058,7 @@ sub handler {
   my %codebase = ();
   my ($upload_result,$upload_output,$uploadphase);
   if ($canedit) {
+      undef($suppchanges);
       if (($env{'form.uploaddoc.filename'}) &&
 	  ($env{'form.cmd'}=~/^upload_(\w+)/)) {
           my $context = $1; 
@@ -5942,6 +6070,10 @@ sub handler {
 	  if ($hadchanges) {
 	      &mark_hash_old();
 	  }
+          if ($suppchanges) {
+              &Apache::lonnet::update_supp_caches($coursedom,$coursenum);
+              undef($suppchanges);
+          }
           $r->print($upload_output);
       } elsif ($env{'form.phase'} eq 'upload_embedded') {
           # Process file upload - phase two - upload embedded objects 
@@ -6010,6 +6142,7 @@ sub handler {
                 'stpr' => 'Standard Problem',
                 'news' => 'New sub-directory',
                 'crpr' => 'Create Problem',
+                'swit' => 'Switch Server',
                 'drbx' => 'Drop Box',
                 'scuf' => 'External Scores (handgrade, upload, clicker)',
                 'bull' => 'Discussion Board',
@@ -6168,12 +6301,12 @@ FUFORM
 SEDFFORM
         my $importcrsresform;
         my ($numdirs,$pickfile) = 
-            &Apache::loncommon::import_crsauthor_form('crsresimportform','coursepath','coursefile',
+            &Apache::loncommon::import_crsauthor_form('coursepath','coursefile',
                                                       "resize_scrollbox('contentscroll','1','0');",
                                                       undef,'res');
         if ($pickfile) {
             $importcrsresform=(<<CRSFORM);
-        <a class="LC_menubuttons_link" href="javascript:toggleImportCrsres('res','$numdirs');">
+        <a class="LC_menubuttons_link" href="javascript:toggleImportCrsres('res');">
         $lt{'imcr'}</a>$help{'Course_Resources'}
         <form action="/adm/coursedocs" method="post" name="crsresimportform" onsubmit="return validImportCrsRes();">
         <fieldset id="importcrsresform" style="display: none;">
@@ -6184,7 +6317,7 @@ SEDFFORM
         $lt{'title'}: <input type="textbox" name="crsrestitle" value="" $disabled />
         </p>
         <input type="hidden" name="importdetail" value="" />
-        <input type="submit" name="crsres" value="$lt{'impo'}" $disabled />
+        <input type="submit" name="crsres" value="$lt{'impo'}" $disabled /><br />
         </fieldset>
         </form>
 CRSFORM
@@ -6204,7 +6337,7 @@ CRSFORM
         { '<img class="LC_noBorder LC_middle" src="/res/adm/pages/sequence.png" alt="'.$lt{impm}.'" onclick="javascript:toggleMap(\'map\');" />' => $importpubform },
         );
         if ($pickfile) {
-            push(@importpubforma,{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{imcr}.'"  onclick="javascript:toggleImportCrsres(\'res\','."'$numdirs'".');"/>' => $importcrsresform});
+            push(@importpubforma,{ '<img class="LC_noBorder LC_middle" src="/res/adm/pages/res.png" alt="'.$lt{imcr}.'"  onclick="javascript:toggleImportCrsres(\'res\');" />' => $importcrsresform});
 	}
 	$importpubform = &create_form_ul(&create_list_elements(@importpubforma));
         my $extresourcesform =
@@ -6406,133 +6539,62 @@ NROSTFORM
 NWEBFORM
 
         my @ids=&Apache::lonnet::current_machine_ids();
-        my %select_menus;
-        my $numauthor = 0;
-        my $numcrsdirs = 0;
-        my $toppath = "/priv/$env{'user.domain'}/$env{'user.name'}"; 
+        my $machines_str = "'".join("','",@ids)."'";
+        my (%is_home,%toppath,$rolehomes);
         if ($env{'user.author'}) {
-            $numauthor ++;
-            $select_menus{'author'}->{'text'} = &Apache::lonnet::plaintext('au');
             if (grep(/^\Q$env{'user.home'}\E$/,@ids)) {
-                my $is_home = 1;
-                my %subdirs;
-                &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);
-                $select_menus{'author'}->{'default'} = '/'; 
-                $select_menus{'author'}->{'select2'}->{'/'} = '/';
-                my @ordered = ('/');
-                foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {
-                    $select_menus{'author'}->{'select2'}->{$relpath} = $relpath;
-                    push(@ordered,$relpath);
-                }
-                $select_menus{'author'}->{'order'} = \@ordered;
-            } else {
-                $select_menus{'author'}->{'select2'}->{'switch'} = &mt('Switch server required');
-                $select_menus{'author'}->{'default'} = 'switch';
-                $select_menus{'author'}->{'order'} = ['switch'];
+                $is_home{'author'} = 1;
             }
+            $rolehomes = '<input type="hidden" id="rolehome_author" name="rolehome_author" value="'.$env{'user.home'}.'" />'."\n";
         }
         my %roleshash = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',
                                                       ['active'],['ca','aa']);
-        my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'};
         my %by_roletype;
         if (keys(%roleshash)) {
             foreach my $entry (keys(%roleshash)) {
                 my ($auname,$audom,$roletype) = split(/:/,$entry);
                 my $key = $entry;
                 $key =~ s/:/___/g;
-                $by_roletype{$roletype}{$auname.'___'.$audom} = 1;
-                $select_menus{$key}->{'text'} = &Apache::lonnet::plaintext($roletype)." ($audom/$auname)";
+                my $author = $auname.'___'.$audom;
+                $by_roletype{$roletype}{$author} = 1;
                 my $rolehome = &Apache::lonnet::homeserver($auname,$audom);
-                if (grep(/^\Q$rolehome\E$/,@ids)) {    
-                    my $is_home = 1;
-                    my (%subdirs,@ordered);
-                    my $toppath="/priv/$audom/$auname";
-                    &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);
-                    $select_menus{$key}->{'default'} = '/';
-                    $select_menus{$key}->{'select2'}->{'/'} = '/';
-                    my @ordered = ('/');
-                    foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {
-                        $select_menus{$key}->{'select2'}->{$relpath} = $relpath;
-                        push(@ordered,$relpath);
-                    }
-                    $select_menus{$key}->{'order'} = \@ordered;
-                } else {
-                    $select_menus{$key}->{'select2'}->{'switch'} = &mt('Switch server required');
-                    $select_menus{$key}->{'default'} = 'switch';
-                    $select_menus{$key}->{'order'} = ['switch'];
-                }
-                $numauthor ++;
-            }
-        }
-        my ($pickdir,$showtitle);
-        if ($numauthor) {
-            my @order;
-            my $defrole;
-            if ($env{'user.author'}) {
-                push(@order,'author');
-                $defrole = 'author';
-            }
-            if (keys(%by_roletype)) {
-                foreach my $possrole ('ca','aa') {
-                    if (ref($by_roletype{$possrole}) eq 'HASH') {
-                        foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) {
-                            unless ($defrole) {
-                                $defrole = $author;
-                            }
-                            push(@order,$author.'___'.$possrole);
-                        }
-                    }
+                $toppath{$author} = "/priv/$audom/$auname";
+                if (grep(/^\Q$rolehome\E$/,@ids)) {
+                    $is_home{$author} = 1;
                 }
+                $rolehomes .= '<input type="hidden" id="rolehome_coauthor_'.$roletype.'_'.$audom.'/'.$auname.'" '.
+                              'name="rolehome_coauthor" value="'.$roletype.'='.$audom.'/'.$auname.'='.$rolehome.'" />'."\n";
             }
-            $select_menus{'course'}->{'text'} = &mt('Course Resource');
-            if (grep(/^\Q$crshome\E$/,@ids)) {
-                my $is_home = 1;
-                my %subdirs;
-                my $toppath="/priv/$coursedom/$coursenum";
-                &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);
-                $numcrsdirs = keys(%subdirs);
-                $select_menus{'course'}->{'default'} = '/';
-                $select_menus{'course'}->{'select2'}->{'/'} = '/';
-                my @ordered = ('/');
-                foreach my $relpath (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {
-                    $select_menus{'course'}->{'select2'}->{$relpath} = $relpath;
-                    push(@ordered,$relpath);
-                }
-                $select_menus{'course'}->{'order'} = \@ordered;
-            } else {
-                $select_menus{'course'}->{'select2'}->{'switch'} = &mt('Switch server required');
-                $select_menus{'course'}->{'default'} = 'switch';
-                $select_menus{'course'}->{'order'} = ['switch'];
-            }
-            push(@order,'course');
-            $pickdir = $lt{'loca'}.
-                       &Apache::loncommon::linked_select_forms('courseresform','<br />'.$lt{'dire'},
-                                                               $defrole,'authorrole','authorpath',
-                                                               \%select_menus,\@order,'toggleCrsResTitle();',
-                                                               '','priv').'<br />';
-            $showtitle = 'none';
-        } else {
-            my $is_home;
-            $showtitle = 'inline';
-            if (grep(/^\Q$crshome\E$/,@ids)) {
-                $is_home = 1;
-                $pickdir .= '<input type="hidden" name="authorrole" value="course" />'; 
-                my $toppath="/priv/$coursedom/$coursenum'}";
-                my %subdirs;
-                &Apache::lonnet::recursedirs($is_home,'priv',$londocroot,$toppath,'',\%subdirs);
-                $numcrsdirs = keys(%subdirs); 
-                if ($numcrsdirs) {
-                    $pickdir .= &mt('Directory: ').'<select name="authorpath">'."\n".
-                                 '<option value="/">/</option>'."\n";
-                    foreach my $key (sort { lc($a) cmp lc($b) } (keys(%subdirs))) {
-                        $pickdir .= '<option value="'.$key.'">'.$key.'</option>'."\n";
+        }
+        my $crshome = $env{'course.'.$env{'request.course.id'}.'.home'};
+        if (grep(/^\Q$crshome\E$/,@ids)) {
+            $is_home{'course'} = 1;
+        }
+        $rolehomes .= '<input type="hidden" id="rolehome_course" name="rolehome_course" value="'.$crshome.'" />'."\n";
+        my $pickdir = $lt{'loca'}.
+                   '<select name="authorrole" onchange="populateDirSelects(this.form,'."'authorrole','authorpath'".',1,1,0);">'."\n".
+                   '<option value="" selected="selected">'.&mt('Select').'</option>'."\n";
+        if ($env{'user.author'}) {
+            $pickdir .= '<option value="author">'.&Apache::lonnet::plaintext('au').'</option>'."\n";
+        }
+        if (keys(%by_roletype)) {
+            foreach my $possrole ('ca','aa') {
+                if (ref($by_roletype{$possrole}) eq 'HASH') {
+                    my $roletitle = &Apache::lonnet::plaintext($possrole);
+                    foreach my $author (sort { lc($a) cmp lc($b) } (keys(%{$by_roletype{$possrole}}))) {
+                        my ($none,$where,$auname,$audom) = split(/\//,$toppath{$author});
+                        $pickdir .= '<option value="'.$author.'___'.$possrole.'">'.
+                                     $roletitle." ($audom/$auname)</option>\n";
                     }
-                    $pickdir .= '</select>';
-                } else {
-                    $pickdir .= '<input type="hidden" name="authorpath" value="/" />'."\n";   
                 }
             }
         }
+        $pickdir .= '<option value="course">'.&mt('Course Resource').'</option>'."\n".
+                    '</select><br />'."\n".
+                    $lt{'dire'}.
+                    '<select name="authorpath" onchange="toggleCrsResTitle();">'.
+                    '<option value=""></option>'.
+                    '</select><br />'."\n";
 
         my %seltemplate_menus;
         my @files = &Apache::lonhomework::get_template_list('problem');
@@ -6575,7 +6637,7 @@ NWEBFORM
         my $templatepreview =  '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true);  return false;">'.
                                '<span id="newresexample">'.&mt('Example').'<span></a>';
         my $crsresform=(<<RESFORM);
-        <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res','$numauthor','$numcrsdirs');">
+        <a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');">
         $lt{'stpr'}</a>$help{'Course_Resource'}
         <form action="/adm/coursedocs" method="post" name="courseresform">
         <fieldset id="crsresform" style="display:none;">
@@ -6583,6 +6645,7 @@ NWEBFORM
         <input type="hidden" name="active" value="bb" />
         <p>
         $pickdir
+        <div id="newstdproblem" style="display:none;">
         <span class="LC_nobreak">$lt{'news'}?&nbsp;
         <label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label>
         &nbsp;
@@ -6593,7 +6656,7 @@ NWEBFORM
         $lt{'fnam'}
         <input type="text" size="20" name="newresourcename" autocomplete="off" $disabled />
         <p>
-        <div id="newresource" style="display:$showtitle">
+        <div id="newresource" style="display:none">
         $lt{'addp'}
         <label><input type="radio" name="newresourceadd" value="0" checked="checked" onclick="toggleNewInCourse(this.form);" $disabled />
         $lt{'no'}</label>&nbsp;&nbsp;
@@ -6618,6 +6681,11 @@ NWEBFORM
         <input type="hidden" name="folderpath" value="$env{'form.folderpath'}" />
         <input type="submit" name="newcrs" value="$lt{'crpr'}" $disabled />
         </span>
+        </div>
+        <div id="stdprobswitch" style="display:none;">
+        $rolehomes
+        <input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" />
+        </div>
         </fieldset>
         </form>
 
@@ -6716,7 +6784,7 @@ NGFFORM
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{sipr}.'" onclick="javascript:makesmpproblem();" />'=>$newsmpproblemform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/dropbox.png" alt="'.$lt{drbx}.'" onclick="javascript:makedropbox();" />'=>$newdropboxform},
         {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/scoreupfrm.png" alt="'.$lt{scuf}.'" onclick="javascript:makeexamupload();" />'=>$newexuploadform},
-        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\','."'$numauthor','$numcrsdirs'".');" />'=>$crsresform},
+        {'<img class="LC_noBorder LC_middle" src="/res/adm/pages/simpprob.png" alt="'.$lt{stpr}.'" onclick="javascript:toggleCrsRes(\'res\');" />'=>$crsresform},
         );
         $gradingform = &create_form_ul(&create_list_elements(@gradingforma));
 
@@ -6766,7 +6834,7 @@ unless ($container eq 'page') {
        unless ($supplementalflag) {
 	   $folder='supplemental';
        }
-       if ($folder =~ /^supplemental$/ &&
+       if (($folder eq 'supplemental') &&
 	   (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) {
           $env{'form.folderpath'} = &supplemental_base();
        } elsif ($allowed) {
@@ -6903,26 +6971,7 @@ my %suporderhash = (
                 $r->print('<p><span class="LC_error">'.$error.'</span></p>');
             }
             if ($suppchanges) {
-                my %servers = &Apache::lonnet::internet_dom_servers($coursedom);
-                my @ids=&Apache::lonnet::current_machine_ids();
-                foreach my $server (keys(%servers)) {
-                    next if (grep(/^\Q$server\E$/,@ids));
-                    my $hashid=$coursenum.':'.$coursedom;
-                    my $cachekey = &escape('showsupp').':'.&escape($hashid);
-                    &Apache::lonnet::remote_devalidate_cache($server,[$cachekey]);
-                }
-                &Apache::lonnet::has_unhidden_suppfiles($coursenum,$coursedom,1);
-                &Apache::lonnet::count_supptools($coursenum,$coursedom,1);
-                my $now = time;
-                if ($env{'request.course.id'} eq $coursedom.'_'.$coursenum) {
-                    &Apache::lonnet::appenv({'request.course.suppupdated' => $now});
-                }
-                &Apache::lonnet::put('environment',{'internal.supplementalchange' => $now},
-                                     $coursedom,$coursenum);
-                &Apache::lonnet::appenv(
-                    {'course.'.$coursedom.'_'.$coursenum.'.internal.supplementalchange' => $now});
-                &Apache::lonnet::do_cache_new('suppchange',$coursedom.'_'.$coursenum,$now,600);
-                &Apache::lonnet::get_numsuppfiles($coursenum,$coursedom,1);
+                &Apache::lonnet::update_supp_caches($coursedom,$coursenum);
                 undef($suppchanges);
             }
         }
@@ -7093,6 +7142,10 @@ sub remove_archive {
             if ($url eq $env{'form.archiveurl'}) {
                 if (&handle_edit_cmd($docuname,$docudom)) {
                     ($errtext,$fatal) = &storemap($docuname,$docudom,$map,1);
+                    if ($suppchanges) {
+                        &Apache::lonnet::update_supp_caches($docudom,$docuname);
+                        undef($suppchanges);
+                    }
                     if ($fatal) {
                         if ($container eq 'page') {
                             $delwarning = &mt('An error occurred updating the contents of the current page.');
@@ -7367,6 +7420,8 @@ sub editing_js {
                                           tinc    => 'Title in course',
                                           sunm    => 'Sub-directory name',
                                           edri    => 'Editing rights unavailable for your current role.',
+                                          sele    => 'Select',
+                                          swit    => 'Switch server required',
                                         );
     &js_escape(\%js_lt);
     my $crstype = &Apache::loncommon::course_type();
@@ -7378,7 +7433,9 @@ sub editing_js {
     my $backtourl;
     my $toplevelmain = &escape(&default_folderpath($coursenum,$coursedom,$navmapref));
     my $toplevelsupp = &supplemental_base();
-
+    my $showfile_js = &Apache::loncommon::show_crsfiles_js();
+    my @ids=&Apache::lonnet::current_machine_ids();
+    my $machines_str = "'".join("','",@ids)."'";
     if ($env{'docs.exit.'.$env{'request.course.id'}} =~ /^direct_(.+)$/) {
         my $caller = $1;
         if ($caller =~ /^supplemental/) {
@@ -7730,27 +7787,21 @@ function toggleMap(caller) {
     return;
 }
 
-function toggleCrsRes(caller,numauthorrole,numcrsdirs) {
+function toggleCrsRes(caller) {
     var disp = 'none';
     if (document.getElementById('crsresform')) {
         if (caller == 'res') {
-            var curr = document.getElementById('crsresform').style.display;
+            var form = document.getElementById('crsresform');
+            var curr = form.style.display;
             if (curr == 'none') {
                 disp='block';
-                numauthor = parseInt(numauthorrole);
-                if (numauthor > 0) {
-                    document.courseresform.authorrole.selectedIndex = 0;
-                    select1priv_changed();
-                    document.courseresform.authorpath.selectedIndex = 0;
-                    document.courseresform.newresourceadd.selectedIndex = 0;
-                    toggleNewInCourse(document.courseresform);
-                    if (document.getElementById('newresource')) {
-                        document.getElementById('newresource').style.display = 'none';
-                    }
-                } else {
-                    if (numcrsdirs) {
-                        document.courseresform.authorpath.selectedIndex = 0;
-                    }
+                document.courseresform.authorrole.selectedIndex = 0;
+                document.courseresform.authorpath.selectedIndex = 0;
+                document.courseresform.newresourceadd.selectedIndex = 0;
+                populateDirSelects(form,'authorrole','authorpath',1,0,0);
+                toggleNewInCourse(document.courseresform);
+                if (document.getElementById('newresource')) {
+                    document.getElementById('newresource').style.display = 'none';
                 }
                 if (document.courseresform.newresusetemp.length) {
                     document.courseresform.newresusetemp[0].checked = true;
@@ -7804,14 +7855,28 @@ function toggleNewsubdir(form) {
 
 function toggleCrsResTitle() {
     if (document.getElementById('newresource')) {
-        if (document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value == 'course') {
+        var selloc = document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value;
+        if (selloc == 'course') {
             document.getElementById('newresource').style.display = 'inline';
             document.courseresform.newresourceadd[0].checked = true;
             toggleNewInCourse(document.courseresform);
         } else {
             document.getElementById('newresource').style.display = 'none';
         }
-    } 
+    }
+    if (document.getElementById('newstdproblem')) {
+        if (document.courseresform.authorpath.options[document.courseresform.authorpath.selectedIndex].value == 'switch') {
+            document.getElementById('newstdproblem').style.display = 'none'; 
+            if (document.getElementById('stdprobswitch')) {
+                document.getElementById('stdprobswitch').style.display = 'block'; 
+            }
+        } else {
+            document.getElementById('newstdproblem').style.display = 'block';
+            if (document.getElementById('stdprobswitch')) {
+                document.getElementById('stdprobswitch').style.display = 'none';
+            }
+        }
+    }
 }
 
 function toggleNewInCourse(form) {
@@ -7891,17 +7956,14 @@ function getExample(width,height,scrolli
     }
 }
 
-function toggleImportCrsres(caller,dircount) {
+function toggleImportCrsres(caller) {
     var disp = 'none';
     if (document.getElementById('importcrsresform')) {
         if (caller == 'res') {
-            var numdirs = parseInt(dircount);
             var curr = document.getElementById('importcrsresform').style.display;
             if (curr == 'none') {
                 disp='block';
-                if (numdirs > 1) {
-                    select1res_changed();
-                }
+                populateCrsSelects(document.crsresimportform,'coursepath','coursefile',1,'',1,0,1,1);
             }
         }
         document.getElementById('importcrsresform').style.display=disp;
@@ -7909,6 +7971,152 @@ function toggleImportCrsres(caller,dirco
     }
     return;
 }
+
+$showfile_js
+
+function populateDirSelects(form,locsel,dirsel,setdir,recurse,nonemptydir) {
+    var location = form.elements[locsel].options[form.elements[locsel].selectedIndex].value;
+    if ((setdir) && (dirsel != null) && (dirsel != 'undefined') && (dirsel != '')) {
+        var selelem = form.elements[dirsel];
+        var i, numfiles = selelem.options.length -1;
+        if (numfiles >=0) {
+            for (i = numfiles; i >= 0; i--) {
+                selelem.remove(i);
+            }
+        }
+        if ((location == '') || (location == null) || (location == 'undefined')) {
+             if (selelem.options.length == 0) {
+                 selelem.options[selelem.options.length] = new Option('','');
+                 selelem.selectedIndex = 0;
+             }
+             if (document.getElementById('newstdproblem')) {
+                 document.getElementById('newstdproblem').style.display = 'none';
+             }
+             return;
+        }
+        var machineIds = new Array($machines_str);
+        var athome = 0;
+        var role = location;
+        if ((location == 'author') || (location == 'course')) {
+            if (document.getElementById('rolehome_'+location)) {
+                var currhome = document.getElementById('rolehome_'+location).value;
+                if ((currhome != '') && (currhome != null) && (currhome != 'undefined')) {
+                    if (machineIds.includes(currhome)) {
+                        athome = 1;
+                    }
+                }
+            }
+        } else {
+            const roleinfo = location.split('___');
+            role = encodeURIComponent(roleinfo[0]+'./'+roleinfo[1]);
+            if (document.getElementById('rolehome_coauthor_'+roleinfo[1]+'_'+roleinfo[0])) {
+                var currhome = document.getElementById('rolehome_coauthor_'+roleinfo[1]+'_'+roleinfo[0]).value;
+                if ((currhome != '') && (currhome != null) && (currhome != 'undefined')) {
+                    if (machineIds.includes(currhome)) {
+                        athome = 1;
+                    }
+                }
+            }
+        }
+        if (athome) {
+            if (document.getElementById('stdprobswitch')) {
+                document.getElementById('stdprobswitch').style.display = 'none';
+            }
+            if (document.getElementById('newstdproblem')) {
+                document.getElementById('newstdproblem').style.display = 'none';
+            }
+            var http = new XMLHttpRequest();
+            var url = "/adm/courseauthor";
+            var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir;
+            http.open("POST", url, true);
+            http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+            http.onreadystatechange = function() {
+                if (http.readyState == 4 && http.status == 200) {
+                    var data = JSON.parse(http.responseText);
+                    if (Array.isArray(data.dirs)) {
+                        var len = data.dirs.length;
+                        if (len) {
+                            if (len > 1) {
+                                selelem.options[selelem.options.length] = new Option('$js_lt{sele}','');
+                            }
+                        }
+                        if (len) {
+                            var j;
+                            for (j = 0; j < len; j++) {
+                                selelem.options[selelem.options.length] = new Option(data.dirs[j],data.dirs[j]);
+                            }
+                            selelem.selectedIndex = 0;
+                            if (len == 1) {
+                                toggleCrsResTitle();
+                            }
+                        }
+                    }
+                }
+            }
+            http.send(params);
+        } else {
+            selelem.options[selelem.options.length] = new Option('$js_lt{swit}','switch');
+            selelem.selectedIndex = 0;
+            if (document.getElementById('stdprobswitch')) {
+                document.getElementById('stdprobswitch').style.display = 'block';
+            }
+            if (document.getElementById('newstdproblem')) {
+                document.getElementById('newstdproblem').style.display = 'none';
+            }
+        }
+    }
+    return;
+}
+
+function switchForProb() {
+    if (document.courseresform.authorpath.options[document.courseresform.authorpath.selectedIndex].value == 'switch') {
+        var url = '/adm/switchserver?otherserver=';
+        var newhostid = '';
+        var role = '';
+        var selloc = document.courseresform.authorrole.options[document.courseresform.authorrole.selectedIndex].value;
+        if (selloc == 'author') {
+            newhostid = document.courseresform.rolehome_author.value;
+            role = "au./&js_escape($env{'user.domain'})/";
+        } else if (selloc == 'course') {
+            newhostid = document.courseresform.rolehome_course.value;
+            role = "&js_escape($env{'request.role'})";
+        } else {
+            var items = new Array();
+            items = selloc.split('___');
+            var len = document.courseresform.rolehome_coauthor.length;
+            if (null == len) {
+                var currval = document.courseresform.rolehome_coauthor.value;
+                if (null != currval) {
+                    var info = new Array();
+                    info = currval.split('=');
+                    newhostid = info[2];
+                    role = info[0]+'./'+info[1];
+                }
+            } else {
+                for (var i=0; i<len; i++) {
+                    var currval = document.courseresform.rolehome_coauthor[i].value;
+                    if (null != currval) {
+                        var info = new Array();
+                        info = currval.split('=');
+                        if ((info[1] == items[1]+'/'+items[0]) && (info[0] == items[2])) {
+                            newhostid = info[2];
+                            role = info[0]+'./'+info[1];
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+        if (newhostid != '') {
+            url += newhostid;
+            if (role != '') {
+                url += '&role='+role;
+            }
+            document.location.href = url;
+        }
+    }
+    return;
+}
 
 function makeims(imsform) {
     if ((imsform.uploaddoc.value == '')  || (!imsform.uploaddoc.value)) {