Diff for /loncom/interface/lonmenu.pm between versions 1.360 and 1.369.2.44

version 1.360, 2011/11/07 20:05:55 version 1.369.2.44, 2013/08/08 02:24:02
Line 26 Line 26
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 #  #
 # There is one parameter controlling the action of this module:  
 #  
   
 =head1 NAME  =head1 NAME
   
Line 35  Apache::lonmenu Line 33  Apache::lonmenu
   
 =head1 SYNOPSIS  =head1 SYNOPSIS
   
 Coordinates the response to clicking an image.  Loads contents of /home/httpd/lonTabs/mydesk.tab, 
   used to generate inline menu, and Main Menu page. 
   
 This is part of the LearningOnline Network with CAPA project  This is part of the LearningOnline Network with CAPA project
 described at http://www.lon-capa.org.  described at http://www.lon-capa.org.
Line 74  It is set to 'done' in the BEGIN block o Line 73  It is set to 'done' in the BEGIN block o
 =item @primary_menu  =item @primary_menu
   
 The elements of this array reference arrays that are made up of the components  The elements of this array reference arrays that are made up of the components
 of those lines of mydesk.tab that start with prim.  of those lines of mydesk.tab that start with prim:.
 It is used by primary_menu() to generate the corresponding menu.  It is used by primary_menu() to generate the corresponding menu.
 It gets filled in the BEGIN block of this module.  It gets filled in the BEGIN block of this module.
   
   =item %primary_sub_menu
   
   The keys of this hash reference are the names of items in the primary_menu array 
   which have sub-menus.  For each key, the corresponding value is a reference to
   an array containing components extracted from lines in mydesk.tab which begin
   with primsub:.
   This hash, which is used by primary_menu to generate sub-menus, is populated in
   the BEGIN block.
   
 =item @secondary_menu  =item @secondary_menu
   
 The elements of this array reference arrays that are made up of the components  The elements of this array reference arrays that are made up of the components
Line 98  secondary_menu(). Line 106  secondary_menu().
   
 =item primary_menu()  =item primary_menu()
   
 This routine evaluates @primary_menu and returns XHTML for the menu  This routine evaluates @primary_menu and returns a two item array, 
 that contains following links: About, Message, Roles, Help, Logout  with the array elements containing XHTML for the left and right sides of 
   the menu that contains the following links: About, Message, Roles, Help, Logout 
 @primary_menu is filled within the BEGIN block of this module with   @primary_menu is filled within the BEGIN block of this module with 
 entries from mydesk.tab   entries from mydesk.tab
   
 =item secondary_menu()  =item secondary_menu()
   
 Same as primary_menu() but operates on @secondary_menu.  Same as primary_menu() but operates on @secondary_menu.
   
   =item create_submenu()
   
   Creates XHTML for unordered list of sub-menu items which belong to a
   particular top-level menu item. Uses hover pseudo class in css to display
   dropdown list when mouse hovers over top-level item. Support for IE6
   (no hover psuedo class) via LC_hoverable class for <li> tag for top-
   level item, which employs jQuery to handle behavior on mouseover.
   
   Inputs: 4 - (a) link and (b) target for anchor href in top level item,
               (c) title for text wrapped by anchor tag in top level item.
               (d) reference to array of arrays of sub-menu items.
   
 =item innerregister()  =item innerregister()
   
 This gets called in order to register a URL in the body of the document  This gets called in order to register a URL in the body of the document
   
   =item loadevents()
   
   =item unloadevents()
   
   =item startupremote()
   
   =item setflags()
   
   =item maincall()
   
   =item load_remote_msg()
   
   =item get_menu_name()
   
   =item reopenmenu()
   
   =item open()
   
   Open the menu
   
 =item clear()  =item clear()
   
 =item switch()  =item switch()
Line 129  The javascript is usually similar to "go Line 170  The javascript is usually similar to "go
   
 =item utilityfunctions()  =item utilityfunctions()
   
   Output from this routine is a number of javascript functions called by
   items in the inline menu, and in some cases items in the Main Menu page. 
   
 =item serverform()  =item serverform()
   
 =item constspaceform()  =item constspaceform()
Line 153  use Apache::lonhtmlcommon(); Line 197  use Apache::lonhtmlcommon();
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonmsg();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
 use HTML::Entities();  use HTML::Entities();
 use Apache::lonwishlist();  use Apache::lonwishlist();
   
 use vars qw(@desklines %category_names %category_members %category_positions   use vars qw(@desklines %category_names %category_members %category_positions 
             $readdesk @primary_menu @secondary_menu);              $readdesk @primary_menu %primary_submenu @secondary_menu %secondary_submenu);
   
 my @inlineremote;  my @inlineremote;
   
Line 179  sub prep_menuitem { Line 224  sub prep_menuitem {
            . qq| href="$$menuitem[0]" target="_top">$link</a></li>|;             . qq| href="$$menuitem[0]" target="_top">$link</a></li>|;
 }  }
   
 # primary_menu() evaluates @primary_menu and returns XHTML for the menu  # primary_menu() evaluates @primary_menu and returns a two item array,
 # that contains following links:  # with the array elements containing XHTML for the left and right sides of 
 # About, Message, Roles, Help, Logout  # the menu that contains the following links:
   # Personal, About, Message, Roles, Help, Logout
 # @primary_menu is filled within the BEGIN block of this module with   # @primary_menu is filled within the BEGIN block of this module with 
 # entries from mydesk.tab  # entries from mydesk.tab
 sub primary_menu {  sub primary_menu {
     my $menu;      my %menu;
     # each element of @primary contains following array:      # each element of @primary contains following array:
     # (link url, icon path, alt text, link text, condition)      # (link url, icon path, alt text, link text, condition, position)
     my $public;      my $public;
     if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))      if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
         || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {          || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
Line 211  sub primary_menu { Line 257  sub primary_menu {
         next if    $$menuitem[4]        eq 'courses'   ##'Roles' wanted          next if    $$menuitem[4]        eq 'courses'   ##'Roles' wanted
                 && !&Apache::loncommon::show_course(); ##                  && !&Apache::loncommon::show_course(); ##
                   
                       my $title = $menuitem->[3];
         if ($$menuitem[3] eq 'Help') { # special treatment for helplink          my $position = $menuitem->[5];
           if ($position eq '') {
               $position = 'right';
           }
           if (defined($primary_submenu{$title})) {
               my ($link,$target);
               if ($menuitem->[0] ne '') {
                   $link = $menuitem->[0];
                   $target = '_top';
               } else {
                   $link = '#';
               }
               my @primsub;
               if (ref($primary_submenu{$title}) eq 'ARRAY') {
                   foreach my $item (@{$primary_submenu{$title}}) {
                       next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'})); 
                       next if ((($item->[2] eq 'portfolio') || 
                                ($item->[2] eq 'blog')) && 
                                (!&Apache::lonnet::usertools_access('','',$item->[2],
                                                              undef,'tools')));
                       push(@primsub,$item);
                   }
                   if (@primsub > 0) {
                       $menu{$position} .= &create_submenu($link,$target,$title,\@primsub);
                   } elsif ($link) {
                       $menu{$position} .= '<li><a href="'.$link.'" target="'.$target.'">'.&mt($title).'</a></li>';
                   }
               }
           } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink
             if ($public) {              if ($public) {
                 my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};                  my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
                 my $defdom = &Apache::lonnet::default_login_domain();                  my $defdom = &Apache::lonnet::default_login_domain();
Line 220  sub primary_menu { Line 294  sub primary_menu {
                                                                   'helpdeskmail',                                                                    'helpdeskmail',
                                                                   $defdom,$origmail);                                                                    $defdom,$origmail);
                 if ($to ne '') {                  if ($to ne '') {
                     $menu .= &prep_menuitem($menuitem);                       $menu{$position} .= &prep_menuitem($menuitem); 
                 }                  }
             } else {              } else {
                 $menu .= '<li>'.&Apache::loncommon::top_nav_help('Help').'</li>';                  $menu{$position} .= '<li>'.&Apache::loncommon::top_nav_help('Help').'</li>';
             }              }
         } else {          } else {
             $menu .= prep_menuitem($menuitem);              $menu{$position} .= prep_menuitem($menuitem);
         }          }
     }      }
     $menu =~ s/\[domain\]/$env{'user.domain'}/g;      return ("<ol class=\"LC_primary_menu LC_floatleft\">$menu{'left'}</ol>",
     $menu =~ s/\[user\]/$env{'user.name'}/g;              "<ol class=\"LC_primary_menu LC_floatright LC_right\">$menu{'right'}</ol>");
   
     return "<ol class=\"LC_primary_menu LC_right\">$menu</ol>";  
 }  }
   
 #returns hashref {user=>'',dom=>''} containing:  #returns hashref {user=>'',dom=>''} containing:
Line 268  sub secondary_menu { Line 340  sub secondary_menu {
                                                ? "/$env{'request.course.sec'}"                                                 ? "/$env{'request.course.sec'}"
                                                : '');                                                 : '');
     my $canedit       = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});      my $canedit       = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
     my $canviewgrps   = &Apache::lonnet::allowed('vcg', $crs_sec);       my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'};
     my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec);       if ($canviewroster eq 'disabled') {
     my $canviewwnew   = &Apache::lonnet::allowed('whn', $crs_sec);           undef($canviewroster);
       }
       my $canviewgrps   = &Apache::lonnet::allowed('vcg', $crs_sec);
       my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec);
       my $canviewwnew   = &Apache::lonnet::allowed('whn', $crs_sec);
     my $canmodpara    = &Apache::lonnet::allowed('opa', $crs_sec);      my $canmodpara    = &Apache::lonnet::allowed('opa', $crs_sec);
     my $canvgr        = &Apache::lonnet::allowed('vgr', $crs_sec);      my $canvgr        = &Apache::lonnet::allowed('vgr', $crs_sec);
     my $canmgr        = &Apache::lonnet::allowed('mgr', $crs_sec);       my $canmgr        = &Apache::lonnet::allowed('mgr', $crs_sec);
     my $author        = &getauthor();      my $author        = &getauthor();
   
       my ($cdom,$cnum,$showsyllabus,$showfeeds);
       if ($env{'request.course.id'}) {
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           unless ($canedit) {
               unless (&Apache::lonnet::is_on_map("public/$cdom/$cnum/syllabus")) {
                   if (($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'}) ||
                       ($env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'}) ||
                       ($env{'course.'.$env{'request.course.id'}.'.updatedsyllabus'}) ||
                       ($env{'request.course.syllabustime'})) {
                       $showsyllabus = 1;
                   }
               }
               if ($env{'request.course.feeds'}) {
                   $showfeeds = 1;
               }
           }
       }
   
       my ($canmodifycoauthor);
       if ($env{'request.role'} eq "au./$env{'user.domain'}/") {
           my $extent = "$env{'user.domain'}/$env{'user.name'}";
           if ((&Apache::lonnet::allowed('cca',$extent)) ||
               (&Apache::lonnet::allowed('caa',$extent))) {
               $canmodifycoauthor = 1;
           }
       }
   
     my %groups = &Apache::lonnet::get_active_groups(      my %groups = &Apache::lonnet::get_active_groups(
                      $env{'user.domain'}, $env{'user.name'},                       $env{'user.domain'}, $env{'user.name'},
                      $env{'course.' . $env{'request.course.id'} . '.domain'},                       $env{'course.' . $env{'request.course.id'} . '.domain'},
                      $env{'course.' . $env{'request.course.id'} . '.num'});                       $env{'course.' . $env{'request.course.id'} . '.num'});
   
       my ($roleswitcher_js,$roleswitcher_form);
   
     foreach my $menuitem (@secondary_menu) {      foreach my $menuitem (@secondary_menu) {
         # evaluate conditions           # evaluate conditions 
         next if    ref($menuitem)  ne 'ARRAY';          next if    ref($menuitem)  ne 'ARRAY';
         next if    $$menuitem[4]   ne 'always'          next if    $$menuitem[4]   ne 'always'
                 && $$menuitem[4]   ne 'author'                  && ($$menuitem[4]  ne 'author' && $$menuitem[4] ne 'cca')
                 && !$env{'request.course.id'};                  && !$env{'request.course.id'};
         next if    $$menuitem[4]   =~ /^mdc/          next if    $$menuitem[4]   =~ /^mdc/
                 && !$canedit;                  && !$canedit;
           next if    $$menuitem[4]  eq 'mdcCourse'
                   && ($crstype eq 'Community');
           next if    $$menuitem[4]  eq 'mdcCommunity'
                   && ($crstype eq 'Course');
         next if    $$menuitem[4]  eq 'nvgr'          next if    $$menuitem[4]  eq 'nvgr'
                 && $canvgr;                  && $canvgr;
         next if    $$menuitem[4]  eq 'vgr'          next if    $$menuitem[4]  eq 'vgr'
Line 296  sub secondary_menu { Line 406  sub secondary_menu {
         next if    $$menuitem[4]   eq 'cst'          next if    $$menuitem[4]   eq 'cst'
                 && !$canmodifyuser;                  && !$canmodifyuser;
         next if    $$menuitem[4]   eq 'ncst'          next if    $$menuitem[4]   eq 'ncst'
                 && $canmodifyuser;                  && ($canmodifyuser || !$canviewroster);
         next if    $$menuitem[4]   eq 'mgr'          next if    $$menuitem[4]   eq 'mgr'
                 && !$canmgr;                  && !$canmgr;
         next if    $$menuitem[4]   eq 'nmgr'          next if    $$menuitem[4]   eq 'nmgr'
Line 305  sub secondary_menu { Line 415  sub secondary_menu {
                 && !$canviewwnew;                  && !$canviewwnew;
         next if    $$menuitem[4]   eq 'opa'          next if    $$menuitem[4]   eq 'opa'
                 && !$canmodpara;                  && !$canmodpara;
         next if    $$menuitem[4]   =~ /showgroups$/          next if    $$menuitem[4]   eq 'nvcg'
                 && !$canviewgrps                  && ($canviewgrps || !%groups);
                 && !%groups;          next if    $$menuitem[4]   eq 'showsyllabus'
                   && !$showsyllabus;
           next if    $$menuitem[4]   eq 'showfeeds'
                   && !$showfeeds;
         next if    $$menuitem[4]    eq 'author'          next if    $$menuitem[4]    eq 'author'
                 && !$author;                  && !$author;
           next if    $$menuitem[4]    eq 'cca'
                   && !$canmodifycoauthor;
   
         if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {          my $title = $menuitem->[3];
           if (defined($secondary_submenu{$title})) {
               my ($link,$target);
               if ($menuitem->[0] ne '') {
                   $link = $menuitem->[0];
                   $target = '_top';
               } else {
                   $link = '#';
               }
               my @scndsub;
               if (ref($secondary_submenu{$title}) eq 'ARRAY') {
                   foreach my $item (@{$secondary_submenu{$title}}) {
                       if (ref($item) eq 'ARRAY') {
                           next if ($item->[2] eq 'vgr' && !$canvgr);
                           next if ($item->[2] eq 'opa' && !$canmodpara);
                           next if ($item->[2] eq 'cst' && !$canmodifyuser);
                           next if ($item->[2] eq 'mgr' && !$canmgr);
                           next if ($item->[2] eq 'vcg' && !$canviewgrps);
                           next if ($item->[2] eq 'mdc' && !$canedit);
                           push(@scndsub,$item); 
                       }
                   }
                   if (@scndsub > 0) {
                       $menu .= &create_submenu($link,$target,$title,\@scndsub);
                   } elsif ($link ne '#') {
                       $menu .= '<li><a href="'.$link.'" target="'.$target.'">'.&mt($title).'</a></li>';
                   }
               }
           } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
             # special treatment for role selector              # special treatment for role selector
             my $roles_selector = &roles_selector(              ($roleswitcher_js,$roleswitcher_form,my $switcher) =
                   &roles_selector(
                         $env{'course.' . $env{'request.course.id'} . '.domain'},                          $env{'course.' . $env{'request.course.id'} . '.domain'},
                         $env{'course.' . $env{'request.course.id'} . '.num'}  );                          $env{'course.' . $env{'request.course.id'} . '.num'}
                   );
             $menu .= $roles_selector ? "<li>$roles_selector</li>"              $menu .= $switcher;
                                      : '';  
         } else {          } else {
               if ($$menuitem[3] eq 'Syllabus' && $env{'request.course.id'}) {
                   my $url = $$menuitem[0];
                   $url =~ s{\[cdom\]/\[cnum\]}{$cdom/$cnum};
                   if (&Apache::lonnet::is_on_map($url)) {
                       unless ($$menuitem[0] =~ /\?register=1/) {
                           $$menuitem[0] .= '?register=1';
                       }
                   } else {
                       $$menuitem[0] =~ s{\?register=1}{};
                   }
               }
             $menu .= &prep_menuitem(\@$menuitem);              $menu .= &prep_menuitem(\@$menuitem);
         }          }
     }      }
Line 343  sub secondary_menu { Line 497  sub secondary_menu {
     }      }
     $menu =~ s/\[uname\]/$$author{user}/g;      $menu =~ s/\[uname\]/$$author{user}/g;
     $menu =~ s/\[udom\]/$$author{dom}/g;      $menu =~ s/\[udom\]/$$author{dom}/g;
       if ($env{'request.course.id'}) {  
     return "<ul id=\"LC_secondary_menu\">$menu</ul>";          $menu =~ s/\[cnum\]/$cnum/g;
           $menu =~ s/\[cdom\]/$cdom/g;
       }
       if ($menu) {
           $menu = "<ul id=\"LC_secondary_menu\">$menu</ul>";
       }
       if ($roleswitcher_form) {
           $menu .= "\n$roleswitcher_js\n$roleswitcher_form";
       }
       return $menu;
   }
   
   sub create_submenu {
       my ($link,$target,$title,$submenu) = @_;
       return unless (ref($submenu) eq 'ARRAY');
       my $disptarget;
       if ($target ne '') {
           $disptarget = ' target="'.$target.'"';
       }
       my $name;
       if ($title eq 'Personal') {
           if ($env{'user.name'} && $env{'user.domain'}) {
               $name = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
           } else {
               $name = &mt($title);
           }
       } else {
           $name = &mt($title);
       }
       my $menu = '<li class="LC_hoverable">'.
                  '<a href="'.$link.'"'.$disptarget.'>'.
                  '<span class="LC_nobreak">'.$name.
                  '<span class="LC_fontsize_small" style="font-weight:normal;">'.
                  ' &#9660;</span></span></a>'.
                  '<ul>';
       my $count = 0;
       my $numsub = scalar(@{$submenu});
       foreach my $item (@{$submenu}) {
           $count ++;
           if (ref($item) eq 'ARRAY') {
               my $href = $item->[0];
               if ($href =~ /(aboutme|rss\.html)$/) {
                   next unless (($env{'user.name'} ne '') && ($env{'user.domain'} ne ''));
                   $href =~ s/\[domain\]/$env{'user.domain'}/g;
                   $href =~ s/\[user\]/$env{'user.name'}/g;
               }
               my $borderbot;
               if ($count == $numsub) {
                   $borderbot = 'border-bottom:1px solid black;';
               }
               $menu .= '<li style="margin:0;padding:0;'.
                        $borderbot.'"><a href="'.$href.'">'.
                        &mt($item->[1]).'</a></li>';
           }
       }
       $menu .= '</ul></li>';
       return $menu;
   }
   
   sub registerurl {
       my ($forcereg) = @_;
       my $result = '';
       if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
       my $force_title='';
       if ($env{'request.state'} eq 'construct') {
           $force_title=&Apache::lonxml::display_title();
       }
       if (($env{'environment.remote'} ne 'on') ||
           ((($env{'request.publicaccess'}) ||
            (!&Apache::lonnet::is_on_map(
              &unescape($env{'request.noversionuri'})))) &&
           (!$forcereg))) {
           return
           $result
          .'<script type="text/javascript">'."\n"
          .'// <![CDATA['."\n"
          .'function LONCAPAreg(){;} function LONCAPAstale(){}'."\n"
          .'// ]]>'."\n"
          .'</script>'
          .$force_title;
       }
   # Graphical display after login only
       if ($env{'request.registered'} && !$forcereg) { return ''; }
       $result.=&innerregister($forcereg);
       return $result.$force_title;
 }  }
   
 sub innerregister {  sub innerregister {
     my ($forcereg,$bread_crumbs) = @_;      my ($forcereg,$bread_crumbs,$group) = @_;
     my $const_space = ($env{'request.state'} eq 'construct');      my $const_space = ($env{'request.state'} eq 'construct');
     my $is_const_dir = 0;      my $is_const_dir = 0;
   
Line 356  sub innerregister { Line 594  sub innerregister {
   
     $env{'request.registered'} = 1;      $env{'request.registered'} = 1;
   
       my $noremote = ($env{'environment.remote'} ne 'on');
   
     undef(@inlineremote);      undef(@inlineremote);
   
     my $resurl;       my $reopen=&Apache::lonmenu::reopenmenu();
     if ( $env{'request.symb'} && $env{'request.course.id'} ) {  
   
         (my $mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());      my $newmail='';
         my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};  
       if (&Apache::lonmsg::newmail() && !$noremote) {
           # We have new mail and remote is up
           $newmail= 'swmenu.setstatus("you have","messages");';
       }
   
       my ($mapurl,$resurl);
   
       if ($env{'request.course.id'}) {
           if ($env{'request.symb'}) {
               ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
               my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
   
               my $maptitle = &Apache::lonnet::gettitle($mapurl);
               my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());
   
         my $maptitle = &Apache::lonnet::gettitle($mapurl);  
         my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());  
   
 #SD  #SD
 #course_type only Course and Community?  #course_type only Course and Community?
 #  #
         my @crumbs;              my @crumbs;
         unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps')              unless (($forcereg) && 
                 && ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {                      ($env{'request.noversionuri'} eq '/adm/navmaps') &&
             @crumbs = ({text  => Apache::loncommon::course_type()                       ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
                                 . ' Contents',                   @crumbs = ({text  => Apache::loncommon::course_type() 
                         href  => "Javascript:gopost('/adm/navmaps','')"});                                      . ' Contents', 
         }                              href  => "Javascript:gopost('/adm/navmaps','')"});
         if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) {               }
             push(@crumbs, {text  => '...',              if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { 
                            no_mt => 1});                  push(@crumbs, {text  => '...',
         }                                 no_mt => 1});
               }
         push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle   
                                                    && $maptitle ne 'default.sequence'               push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle 
                                                    && $maptitle ne $coursetitle);                                                         && $maptitle ne 'default.sequence' 
                                                          && $maptitle ne $coursetitle);
         push @crumbs, {text => $restitle, no_mt => 1} if $restitle;   
               push @crumbs, {text => $restitle, no_mt => 1} if $restitle; 
         &Apache::lonhtmlcommon::clear_breadcrumbs();              &Apache::lonhtmlcommon::clear_breadcrumbs();
         &Apache::lonhtmlcommon::add_breadcrumb(@crumbs);              &Apache::lonhtmlcommon::add_breadcrumb(@crumbs);
     }elsif (! $const_space){          } else {
               $resurl = $env{'request.noversionuri'};
               my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'});
               my $crstype = &Apache::loncommon::course_type();
               my $title = &mt('View Resource');
               if ($resurl =~ m{^\Q/uploaded$courseurl/supplemental/\E(default|\d+)/}) {
                   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folderpath','title']);
                   &Apache::lonhtmlcommon::clear_breadcrumbs();
                   if ($env{'form.title'}) {
                       $title = $env{'form.title'};
                   }
                   my $trail;
                   if ($env{'form.folderpath'}) {
                       &prepare_functions($resurl,$forcereg,$group,undef,undef,1);
                       ($trail) =
                           &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
                   } else {
                       &Apache::lonhtmlcommon::add_breadcrumb(
                       {text  => "Supplemental $crstype Content",
                        href  => "javascript:gopost('/adm/supplemental','')"});
                       $title = &mt('View Resource');
                       ($trail) =
                           &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
                   }
                   return $trail;
               } elsif ($resurl =~ m{^\Q/uploaded$courseurl/portfolio/syllabus/}) {
                   &Apache::lonhtmlcommon::clear_breadcrumbs();
                   &prepare_functions('/public'.$courseurl."/syllabus",
                                      $forcereg,$group,undef,undef,1);
                   $title = &mt('Syllabus File');
                   my ($trail) =
                       &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);
                   return $trail;
               }
               unless ($env{'request.state'} eq 'construct') {
                   &Apache::lonhtmlcommon::clear_breadcrumbs();
                   &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
               }
           }
       } elsif (! $const_space){
         #a situation when we're looking at a resource outside of context of a           #a situation when we're looking at a resource outside of context of a 
         #course or construction space (e.g. with cumulative rights)          #course or construction space (e.g. with cumulative rights)
         &Apache::lonhtmlcommon::clear_breadcrumbs();          &Apache::lonhtmlcommon::clear_breadcrumbs();
         &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});          unless ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) {
               &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
           }
     }      }
       my $timesync   = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' );
 # =============================================================================  # =============================================================================
 # ============================ This is for URLs that actually can be registered  # ============================ This is for URLs that actually can be registered
     return '' unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/})       if ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/})
                        || $forcereg );                         || ($forcereg)) {
   
 # -- This applies to homework problems for users with grading privileges  
  my $crs='/'.$env{'request.course.id'};  
  if ($env{'request.course.sec'}) {  
     $crs.='_'.$env{'request.course.sec'};  
  }  
  $crs=~s/\_/\//g;  
   
           my %swtext;
           if ($noremote) {
               %swtext = &get_inline_text();
           } else {
               %swtext = &get_rc_text();
           }
         my $hwkadd='';          my $hwkadd='';
         if ($env{'request.symb'} ne '' &&  
     $env{'request.filename'}=~/$LONCAPA::assess_re/) {          my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,
     if (&Apache::lonnet::allowed('mgr',$crs)) {              $forceview,$editbutton);
  $hwkadd.=&switch('','',7,2,'pgrd.png','Content Grades','grades[_4]',          if (($resurl =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) ||
                        "gocmd('/adm/grades','gradingmenu')",              ($env{'request.role'} !~/^(aa|ca|au)/)) {
                        'Content Grades');              if (($env{'environment.remote'} eq 'on') && ($env{'request.symb'})) {
             } elsif (&Apache::lonnet::allowed('vgr',$crs)) {                  &Apache::lonhtmlcommon::clear_breadcrumbs();
  $hwkadd.=&switch('','',7,2,'subm.png','Content Submissions','missions[_1]',  
                        "gocmd('/adm/grades','submission')",  
        'Content Submissions');  
             }              }
  }              $editbutton = &prepare_functions($resurl,$forcereg,$group);
  if ($env{'request.symb'} ne '' &&  
     &Apache::lonnet::allowed('opa',$crs)) {  
     $hwkadd.=&switch('','',7,3,'pparm.png','Content Settings','parms[_2]',  
      "gocmd('/adm/parmset','set')",  
      'Content Settings');  
  }  
 # -- End Homework  
         ###  
         ### Determine whether or not to display the 'cstr' button for this  
         ### resource  
         ###  
         my $editbutton = '';  
         my $noeditbutton = 1;  
         my ($cnum,$cdom);  
         if ($env{'request.course.id'}) {  
             $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
             $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
         }          }
         if ($env{'user.author'}) {          if ($editbutton eq '') {
             if ($env{'request.role'}=~/^(aa|ca|au)/) {              $editbutton = &clear(6,1);
           }
   
 #  #
 # We have the role of an author  # This applies in course context
 #  #
                 # Set defaults for authors          if ($env{'request.course.id'}) {
                 my ($top,$bottom) = ('con-','struct');              $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
                 my $action = "go('/priv/".$env{'user.domain'}.'/'.$env{'user.name'}."');";              $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                 my $cadom  = $env{'request.role.domain'};              $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
                 my $caname = $env{'user.name'};              my @privs;
                 my $desc = "Enter my construction space";              if ($env{'request.symb'} ne '') {
                 # Set defaults for co-authors                  if ($env{'request.filename'}=~/$LONCAPA::assess_re/) {
                 if ($env{'request.role'} =~ /^ca/) {                       push(@privs,('mgr','vgr'));
                     ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);                  }
                     ($top,$bottom) = ('co con-','struct');                  push(@privs,'opa');
                     $action = "go('/priv/".$cadom.'/'.$caname."');";              }
                     $desc = "Enter construction space as co-author";              foreach my $priv (@privs) {
                 } elsif ($env{'request.role'} =~ /^aa/) {                  $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'});
                     ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);                  if (!$perms{$priv} && $env{'request.course.sec'} ne '') {
                     ($top,$bottom) = ('co con-','struct');                      $perms{$priv} =
                     $action = "go('/priv/".$cadom.'/'.$caname."');";                          &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}");
                     $desc = "Enter construction space as assistant co-author";  
                 }  
                 # Check that we are on the correct machine  
                 my $home = &Apache::lonnet::homeserver($caname,$cadom);  
  my $allowed=0;  
  my @ids=&Apache::lonnet::current_machine_ids();  
  foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }  
  if (!$allowed) {  
     $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc);  
                     $noeditbutton = 0;  
                 }                  }
             }              }
 #  #
 # We are an author for some stuff, but currently do not have the role of author.  # Determine whether or not to show Grades and Submissions buttons
 # Figure out if we have authoring privileges for the resource we are looking at.  #
 # This should maybe become a privilege check in lonnet              if ($env{'request.symb'} ne '' &&
 #                  $env{'request.filename'}=~/$LONCAPA::assess_re/) {
             ##                  if ($perms{'mgr'}) {
             ## Determine if user can edit url.                      $hwkadd.= &switch('','',7,2,'pgrd.png','Content Grades',
             ##                                        'grades[_4]',
             my $cfile='';                                        "gocmd('/adm/grades','gradingmenu')",
             my $cfuname='';                                        'Content Grades');
             my $cfudom='';                  } elsif ($perms{'vgr'}) {
             my $uploaded;                      $hwkadd .= &switch('','',7,2,'subm.png','Content Submissions',
             my $switchserver='';                                         'missions[_1]',
             my $home;                                         "gocmd('/adm/grades','submission')",
             if ($env{'request.filename'}) {                                         'Content Submissions');
                 my $file=&Apache::lonnet::declutter($env{'request.filename'});                  }
                 if (defined($cnum) && defined($cdom)) {              }
                     $uploaded = &is_course_upload($file,$cnum,$cdom);              if (($env{'request.symb'} ne '') && ($perms{'opa'})) {
                 }                  $hwkadd .= &switch('','',7,3,'pparm.png','Content Settings',
                 if (!$uploaded) {                                     'parms[_2]',"gocmd('/adm/parmset','set')",
                                      'Content Settings');
                     $file=~s{^(priv/$match_domain/$match_username)}{/$1};  
                     $file=~s{^($match_domain/$match_username)}{/priv/$1};  
   
                     # Check that the user has permission to edit this resource  
                     my $setpriv = 1;  
                     ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$setpriv);  
                     if (defined($cfudom)) {  
         $home=&Apache::lonnet::homeserver($cfuname,$cfudom);  
         my $allowed=0;  
         my @ids=&Apache::lonnet::current_machine_ids();  
         foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }  
         if ($allowed) {  
                             $cfile=$file;  
                         } else {  
                             $switchserver=$file;  
                         }  
                     }  
                 }  
             }  
             # Finally, turn the button on or off  
             if (($cfile || $switchserver) && !$const_space) {  
                 my $nocrsedit;  
                 # Suppress display where CC has switched to student role.  
                 if ($env{'request.course.id'}) {  
                     unless(&Apache::lonnet::allowed('mdc',  
                                                     $env{'request.course.id'})) {  
                         $nocrsedit = 1;  
                     }  
                 }  
                 if ($nocrsedit) {  
                     $editbutton=&clear(6,1);  
                 } else {  
                     my $bot = "go('$cfile')";  
                     if ($switchserver) {  
                         if ( $env{'request.symb'} && $env{'request.course.id'} ) {  
                             $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.  
                                      &HTML::Entities::encode($env{'request.role'},'"<>&').'&amp;symb='.  
                                      &HTML::Entities::encode($env{'request.symb'},'"<>&');  
                             $bot = "need_switchserver('$cfile');";  
                         }  
                     }  
                     $editbutton=&switch  
                        ('','',6,1,'pcstr.png','Edit','resource[_2]',  
                         $bot,"Edit this resource");  
                     $noeditbutton = 0;  
                 }  
             } elsif ($editbutton eq '') {  
                 $editbutton=&clear(6,1);  
             }  
         }  
         if (($noeditbutton) && ($env{'request.filename'})) {   
             if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  
                 my $file=&Apache::lonnet::declutter($env{'request.filename'});  
                 if (defined($cnum) && defined($cdom)) {  
                     if (&is_course_upload($file,$cnum,$cdom)) {  
                         my $cfile = &edit_course_upload($file,$cnum,$cdom);  
                         if ($cfile) {  
                             $editbutton=&switch  
                                         ('','',6,1,'pcstr.png','Edit',  
                                          'resource[_2]',"go('".$cfile."');",  
                                          'Edit this resource');  
                         }  
                     }  
                 }  
             }              }
         }  # End grades/submissions check
         if ($env{'request.course.id'}) {  
             if ($resurl eq "public/$cdom/$cnum/syllabus") {  #
                 if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) {  # This applies to items inside a folder/page modifiable in the course.
                     if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  #
                         $editbutton=&switch('','',6,1,'pcstr.png','Edit',              if (($env{'request.symb'}=~/^uploaded/) && ($perms{'mdc'})) {
                                             'resource[_2]',                  my $text = 'Edit Folder';
                                             "go('/adm/courseprefs?phase=display&actions=courseinfo')",                  if (($mapurl =~ /\.page$/) ||
                                             'Edit this resource');                      ($env{'request.symb'}=~
                     }                           m{uploaded/$cdom/$cnum/default_\d+\.page$}))  {
                 }                      $text = 'Edit Page';
                   }
                   $hwkadd .= &switch('','',7,4,'docs-22x22.png',$text,'parms[_2]',
                                      "gocmd('/adm/coursedocs','direct')",
                                      'Folder/Page Content');
             }              }
   # End modifiable folder/page container check
         }          }
         ###  # End course context
         ###  
 # Prepare the rest of the buttons  # Prepare the rest of the buttons
         my $menuitems;          my ($menuitems,$got_prt,$got_wishlist,$cstritems);
         if ($const_space) {          if ($const_space) {
 #  #
 # We are in construction space  # We are in construction space
Line 600  s&6&3&pub.png&Publish&resource[_3]&gocst Line 805  s&6&3&pub.png&Publish&resource[_3]&gocst
 s&7&1&del.png&Delete&resource[_2]&gocstr('/adm/cfile?action=delete','/priv/$udom/$uname/$cleandisfn')&Delete this resource  s&7&1&del.png&Delete&resource[_2]&gocstr('/adm/cfile?action=delete','/priv/$udom/$uname/$cleandisfn')&Delete this resource
 s&7&2&prt.png&Print&printout[_1]&gocstr('/adm/printout','/priv/$udom/$uname/$cleandisfn')&Prepare a printable document  s&7&2&prt.png&Print&printout[_1]&gocstr('/adm/printout','/priv/$udom/$uname/$cleandisfn')&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
                   unless ($noremote) {
                       $cstritems = $menuitems;
                       undef($menuitems);
                   }
             }              }
                 if (ref($bread_crumbs) eq 'ARRAY') {              if (ref($bread_crumbs) eq 'ARRAY') {
                     &Apache::lonhtmlcommon::clear_breadcrumbs();                  &Apache::lonhtmlcommon::clear_breadcrumbs();
                     foreach my $crumb (@{$bread_crumbs}){                  foreach my $crumb (@{$bread_crumbs}){
                         &Apache::lonhtmlcommon::add_breadcrumb($crumb);                       &Apache::lonhtmlcommon::add_breadcrumb($crumb);
                     }  
                 }                  }
               }
         } elsif ( defined($env{'request.course.id'}) &&           } elsif ( defined($env{'request.course.id'}) && 
  $env{'request.symb'} ne '' ) {   $env{'request.symb'} ne '' ) {
 #  #
 # We are in a course and looking at a registred URL  # We are in a course and looking at a registered URL
 # Should probably be in mydesk.tab  # Should probably be in mydesk.tab
 #  #
   
     $menuitems=(<<ENDMENUITEMS);      $menuitems=(<<ENDMENUITEMS);
 c&3&1  c&3&1
 s&2&1&back.png&&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1  s&2&1&back.png&$swtext{'back'}&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1
 s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3  s&2&3&forw.png&$swtext{'forw'}&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3
 c&6&3  c&6&3
 c&8&1  c&8&1
 c&8&2  c&8&2
 s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document  s&8&3&prt.png&$swtext{'prt'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
             if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F' && $env{'request.uri'} =~ /^\/res/) {              $got_prt = 1;
               if (($env{'user.adv'}) && ($env{'request.uri'} =~ /^\/res/)
                   && (!$env{'request.enc'})) {
                 # wishlist is only available for users with access to resource-pool                  # wishlist is only available for users with access to resource-pool
                 # and links can only be set for resources within the resource-pool                  # and links can only be set for resources within the resource-pool
                 $menuitems .= (<<ENDMENUITEMS);                  $menuitems .= (<<ENDMENUITEMS);
 s&9&1&wishlist-link.png&Wishlist&wishlistlink[_2]&set_wishlistlink()&Set a link for this resource to wishlist&&1  s&9&1&alnk.png&$swtext{'alnk'}&linkstor[_1]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
 ENDMENUITEMS  ENDMENUITEMS
                   $got_wishlist = 1;
             }              }
   
 my $currentURL = &Apache::loncommon::get_symb();  my $currentURL = &Apache::loncommon::get_symb();
Line 639  if(length($annotation) > 0){ Line 852  if(length($annotation) > 0){
 }else{  }else{
  $menuitems.="anot.png";   $menuitems.="anot.png";
 }  }
 $menuitems.="&Notes&&annotate()&";  $menuitems.="&$swtext{'anot'}&tations[_1]&annotate()&";
 $menuitems.="Make notes and annotations about this resource&&1\n";  $menuitems.="Make notes and annotations about this resource&&1\n";
   
             unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) {              unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) {
  if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) {   if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/}) && ($env{'request.noversionuri'} !~ m{^/uploaded/$match_domain/$match_courseid/docs/})) {
     $menuitems.=(<<ENDREALRES);      $menuitems.=(<<ENDREALRES);
 s&6&3&catalog.png&Info&info[_1]&catalog_info()&Show Metadata  s&6&3&catalog.png&$swtext{'catalog'}&info[_1]&catalog_info()&Show Metadata
   ENDREALRES
                   }
                   unless ($env{'request.noversionuri'} =~ m{^/uploaded/$match_domain/$match_courseid/docs/}) {
               $menuitems.=(<<ENDREALRES);
   s&8&1&eval.png&$swtext{'eval'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
 ENDREALRES  ENDREALRES
                 }                  }
         $menuitems.=(<<ENDREALRES);                  $menuitems.=(<<ENDREALRES);
 s&8&1&eval.png&Evaluate&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource  s&8&2&fdbk.png&$swtext{'fdbk'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource
 s&8&2&fdbk.png&Communicate&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource  
 ENDREALRES  ENDREALRES
     }      }
         }          }
  if ($env{'request.uri'} =~ /^\/res/) {   if ($env{'request.uri'} =~ /^\/res/) {
     $menuitems .= (<<ENDMENUITEMS);              unless ($got_prt) {
 s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document          $menuitems .= (<<ENDMENUITEMS);
   s&8&3&prt.png&$swtext{'prt'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
             if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F') {                  $got_prt = 1;
                 # wishlist is only available for users with access to resource-pool              }
                 $menuitems .= (<<ENDMENUITEMS);              unless ($got_wishlist) {
 s&9&1&wishlist-link.png&Wishlist&wishlistlink[_2]&set_wishlistlink()&Set a link for this resource to wishlist&&1                  if (($env{'user.adv'}) && (!$env{'request.enc'})) {
                       # wishlist is only available for users with access to resource-pool
                       $menuitems .= (<<ENDMENUITEMS);
   s&9&1&alnk.png&$swtext{'alnk'}&linkstor[_1]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
 ENDMENUITEMS  ENDMENUITEMS
                       $got_wishlist = 1;
                   }
             }              }
  }   }
           unless ($got_prt) {
               $menuitems .= (<<ENDMENUITEMS);
   c&8&3
   ENDMENUITEMS
           }
           unless ($got_wishlist) {
               $menuitems .= (<<ENDMENUITEMS);
   c&9&1
   ENDMENUITEMS
           }
         my $buttons='';          my $buttons='';
         foreach (split(/\n/,$menuitems)) {          foreach (split(/\n/,$menuitems)) {
     my ($command,@rest)=split(/\&/,$_);      my ($command,@rest)=split(/\&/,$_);
Line 683  ENDMENUITEMS Line 916  ENDMENUITEMS
                 }                  }
             }              }
         }          }
           if ($noremote) {
     my $addremote=0;      my $addremote=0;
     foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }      foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }
     if ($addremote) {              if ($addremote) {
   
         &Apache::lonhtmlcommon::clear_breadcrumb_tools();                  &Apache::lonhtmlcommon::clear_breadcrumb_tools();
   
             &Apache::lonhtmlcommon::add_breadcrumb_tool(                  &Apache::lonhtmlcommon::add_breadcrumb_tool(
                 'navigation', @inlineremote[21,23]);                      'navigation', @inlineremote[21,23]);
   
         if(hidden_button_check() ne 'yes') {                  my $countdown = &countdown_timer();
             &Apache::lonhtmlcommon::add_breadcrumb_tool(                  if (&hidden_button_check() eq 'yes') {
                 'tools', @inlineremote[93,91,81,82,83]);                      if ($countdown) {
                           &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown);
                       }
                   } else {
                       my @tools = @inlineremote[93,91,81,82,83];
                       if ($countdown) {
                           unshift(@tools,$countdown);
                       }
                       &Apache::lonhtmlcommon::add_breadcrumb_tool(
                           'tools',@tools);
   
             #publish button in construction space                      #publish button in construction space
             if ($env{'request.state'} eq 'construct'){                      if ($env{'request.state'} eq 'construct'){
                 &Apache::lonhtmlcommon::add_breadcrumb_tool(                          &Apache::lonhtmlcommon::add_breadcrumb_tool(
                      'advtools', $inlineremote[63]);                              'advtools', $inlineremote[63]);
             } else {                      } else {
                 &Apache::lonhtmlcommon::add_breadcrumb_tool(                          &Apache::lonhtmlcommon::add_breadcrumb_tool(
                      'tools', $inlineremote[63]);                              'tools', $inlineremote[63]);
             }                      }
                                   &advtools_crumbs(@inlineremote);
             unless ($env{'request.noversionuri'}=~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {                  }
                 &Apache::lonhtmlcommon::add_breadcrumb_tool(  
                     'advtools', @inlineremote[61,71,72,73,92]);  
             }              }
               return   &Apache::lonhtmlcommon::scripttag('', 'start')
                      . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
                      . &Apache::lonhtmlcommon::scripttag('', 'end');
   
           } else {
               my $cstrcrumbs;
               if ($const_space) {
                   foreach (split(/\n/,$cstritems)) {
                       my ($command,@rest)=split(/\&/,$_);
                       my $idx=10*$rest[0]+$rest[1];
                       &switch('','',@rest);
                   }
                   &Apache::lonhtmlcommon::add_breadcrumb_tool('advtools',
                                                               @inlineremote[63,61,71,72]);
   
                   $cstrcrumbs = &Apache::lonhtmlcommon::scripttag('', 'start')
                                .&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
                                .&Apache::lonhtmlcommon::scripttag('', 'end');
               }
               my $requri=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
               $requri=&Apache::lonenc::check_encrypt(&unescape($requri));
               my $cursymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
               my $navstatus=&get_nav_status();
               my $clearcstr;
   
               if ($env{'user.adv'}) { $clearcstr='clearbut(6,1)'; }
               return <<ENDREGTHIS;
   
   <script type="text/javascript">
   // <![CDATA[
   // BEGIN LON-CAPA Internal
   var swmenu=null;
   
       function LONCAPAreg() {
             swmenu=$reopen;
             swmenu.clearTimeout(swmenu.menucltim);
             $timesync
             $newmail
             $buttons
             swmenu.currentURL="$requri";
             swmenu.reloadURL=swmenu.currentURL+window.location.search;
             swmenu.currentSymb="$cursymb";
             swmenu.reloadSymb="$cursymb";
             swmenu.currentStale=0;
             $navstatus
             $hwkadd
             $editbutton
       }
   
       function LONCAPAstale() {
             swmenu=$reopen
             swmenu.currentStale=1;
             if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) {
                swmenu.switchbutton
                (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');
             }
             swmenu.clearbut(7,2);
             swmenu.clearbut(7,3);
             swmenu.menucltim=swmenu.setTimeout(
    'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
    'clearbut(9,1);clearbut(9,3);clearbut(6,3);$clearcstr',
                             2000);
         }
   
   // END LON-CAPA Internal
   // ]]>
   </script>
   
   $cstrcrumbs
   ENDREGTHIS
           }
       } else {
          unless ($noremote) {
   # Not registered, graphical
              return (<<ENDDONOTREGTHIS);
   
   <script type="text/javascript">
   // <![CDATA[
   // BEGIN LON-CAPA Internal
   var swmenu=null;
   
       function LONCAPAreg() {
             swmenu=$reopen
             $timesync
             swmenu.currentStale=1;
             swmenu.clearbut(2,1);
             swmenu.clearbut(2,3);
             swmenu.clearbut(8,1);
             swmenu.clearbut(8,2);
             swmenu.clearbut(8,3);
             swmenu.clearbut(9,1);
             if (swmenu.currentURL) {
                swmenu.switchbutton
                 (3,1,'reload.gif','return','location','go(currentURL)');
             } else {
                 swmenu.clearbut(3,1);
             }
       }
   
       function LONCAPAstale() {
       }
   
   // END LON-CAPA Internal
   // ]]>
   </script>
   ENDDONOTREGTHIS
   
         }          }
           return '';
     }      }
   }
   
     return   &Apache::lonhtmlcommon::scripttag('', 'start')  sub get_inline_text {
            . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)      my %text = (
            . &Apache::lonhtmlcommon::scripttag('', 'end');                   pgrd     => 'Content Grades',
                    subm     => 'Content Submissions',
                    pparm    => 'Content Settings',
                    docs     => 'Folder/Page Content',
                    pcstr    => 'Edit',
                    prt      => 'Print',
                    alnk     => 'Stored Links',
                    anot     => 'Notes',
                    catalog  => 'Info',
                    eval     => 'Evaluate',
                    fdbk     => 'Feedback',
       );
       return %text;
 }  }
   
 sub is_course_upload {  sub get_rc_text {
     my ($file,$cnum,$cdom) = @_;      my %text = (
     my $uploadpath = &LONCAPA::propath($cdom,$cnum);                     pgrd    => 'problem[_1]',
     $uploadpath =~ s{^\/}{};                     subm    => 'view sub-[_1]',
     if (($file =~ m{^\Q$uploadpath\E/userfiles/docs/}) ||                     pparm   => 'problem[_2]',
         ($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/docs/})) {                     pcstr   => 'edit[_1]',
         return 1;                     prt     => 'prepare[_1]',
                      back    => 'backward[_1]',
                      forw    => 'forward[_1]',
                      alnk    => 'add to[_1]',
                      anot    => 'anno-[_1]',
                      catalog => 'catalog[_2]',
                      eval    => 'evaluate[_1]',
                      fdbk    => 'feedback[_1]',
       );
       return %text;
   }
   
   sub loadevents() {
       if ($env{'request.state'} eq 'construct' ||
           $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
       return 'LONCAPAreg();';
   }
   
   sub unloadevents() {
       if ($env{'request.state'} eq 'construct' ||
           $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
       return 'LONCAPAstale();';
   }
   
   sub startupremote {
       my ($lowerurl)=@_;
       unless ($env{'environment.remote'} eq 'on') {
           return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');
     }      }
     return;  #
   # The Remote actually gets launched!
   #
       my $configmenu=&rawconfig();
       my $esclowerurl=&escape($lowerurl);
       my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited');
       return(<<ENDREMOTESTARTUP);
   <script type="text/javascript">
   // <![CDATA[
   var timestart;
   function wheelswitch() {
       if (typeof(document.wheel) != 'undefined') {
           if (typeof(document.wheel.spin) != 'undefined') {
               var date=new Date();
               var waited=Math.round(30-((date.getTime()-timestart)/1000));
               document.wheel.spin.value=$message;
           }
       }
      if (window.status=='|') {
         window.status='/';
      } else {
         if (window.status=='/') {
            window.status='-';
         } else {
            if (window.status=='-') {
               window.status='\\\\';
            } else {
               if (window.status=='\\\\') { window.status='|'; }
            }
         }
      }
 }  }
   
 sub edit_course_upload {  // ---------------------------------------------------------- The wait function
     my ($file,$cnum,$cdom) = @_;  var canceltim;
     my $cfile;  function wait() {
     if ($file =~/\.(htm|html|css|js|txt)$/) {     if ((menuloaded==1) || (tim==1)) {
         my $ext = $1;        window.status='Done.';
         my $url = &Apache::lonnet::hreflocation('',$file);        if (tim==0) {
         my $home = &Apache::lonnet::homeserver($cnum,$cdom);           clearTimeout(canceltim);
         my @ids=&Apache::lonnet::current_machine_ids();           $configmenu
         my $dest;           window.location='$lowerurl';
         if ($home && grep(/^\Q$home\E$/,@ids)) {        } else {
             $dest = $url.'?forceedit=1';            window.location='/adm/remote?action=collapse&url=$esclowerurl';
         }
      } else {
         wheelswitch();
         setTimeout('wait();',200);
      }
   }
   
   function main() {
      canceltim=setTimeout('tim=1;',30000);
      window.status='-';
      var date=new Date();
      timestart=date.getTime();
      wait();
   }
   
   // ]]>
   </script>
   ENDREMOTESTARTUP
   }
   
   sub setflags() {
       return(<<ENDSETFLAGS);
   <script type="text/javascript">
   // <![CDATA[
       menuloaded=0;
       tim=0;
   // ]]>
   </script>
   ENDSETFLAGS
   }
   
   sub maincall() {
       unless ($env{'environment.remote'} eq 'on') { return ''; }
       return(<<ENDMAINCALL);
   <script type="text/javascript">
   // <![CDATA[
       main();
   // ]]>
   </script>
   ENDMAINCALL
   }
   
   sub load_remote_msg {
       my ($lowerurl)=@_;
   
       unless ($env{'environment.remote'} eq 'on') { return ''; }
   
       my $esclowerurl=&escape($lowerurl);
       my $link=&mt('[_1]Continue[_2] on in Inline Menu mode'
                   ,'<a href="/adm/remote?action=collapse&amp;url='.$esclowerurl.'">'
                   ,'</a>');
       return(<<ENDREMOTEFORM);
   <p>
   <form name="wheel">
   <input name="spin" type="text" size="60" />
   </form>
   </p>
   <p>$link</p>
   ENDREMOTEFORM
   }
   
   sub get_menu_name {
       my $hostid = $Apache::lonnet::perlvar{'lonHostID'};
       $hostid =~ s/\W//g;
       return 'LCmenu'.$hostid;
   }
   
   
   sub reopenmenu {
      unless ($env{'environment.remote'} eq 'on') { return ''; }
      my $menuname = &get_menu_name();
      my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
      return('window.open('.$nothing.',"'.$menuname.'","",false);');
   }
   
   
   sub open {
       my $returnval='';
       unless ($env{'environment.remote'} eq 'on') {
           return
           '<script type="text/javascript">'."\n"
          .'// <![CDATA['."\n"
          .'self.name="loncapaclient";'."\n"
          .'// ]]>'."\n"
          .'</script>';
       }
       my $menuname = &get_menu_name();
   
   #    unless (shift eq 'unix') {
   # resizing does not work on linux because of virtual desktop sizes
   #       $returnval.=(<<ENDRESIZE);
   #if (window.screen) {
   #    self.resizeTo(screen.availWidth-215,screen.availHeight-55);
   #    self.moveTo(190,15);
   #}
   #ENDRESIZE
   #    }
       $returnval=(<<ENDOPEN);
   // <![CDATA[
   window.status='Opening LON-CAPA Remote Control';
   var menu=window.open("/res/adm/pages/menu.html?inhibitmenu=yes","$menuname",
   "height=375,width=150,scrollbars=no,menubar=no,top=5,left=5,screenX=5,screenY=5");
   self.name='loncapaclient';
   // ]]>
   ENDOPEN
       return '<script type="text/javascript">'.$returnval.'</script>';
   }
   
   sub get_editbutton {
       my ($cfile,$home,$switchserver,$forceedit,$forceview,$forcereg) = @_;
       my $jscall;
       if (($forceview) && ($env{'form.todocs'})) {
           my ($folderpath,$command);
           if ($env{'request.symb'}) {
               $folderpath = &Apache::loncommon::symb_to_docspath($env{'request.symb'});
           } elsif ($env{'form.folderpath'} =~ /^supplemental/) {
               $folderpath = $env{'form.folderpath'};
               $command = '&forcesupplement=1';
           }
           $folderpath = &escape(&HTML::Entities::encode(&escape($folderpath),'<>&"'));
           $jscall = "go('/adm/coursedocs?folderpath=$folderpath$command')";
       } else {
           $jscall = &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,$switchserver,
                                                   $forceedit,$forcereg,$env{'request.symb'},
                                                   &escape($env{'form.folderpath'}),
                                                   &escape($env{'form.title'}),$env{'form.idx'},
                                                   &escape($env{'form.suppurl'},$env{'form.todocs'}));
       }
       if ($jscall) {
           my $icon = 'pcstr.png';
           my $label = 'Edit';
           if ($forceview) {
               $icon = 'tolastloc.png';
               $label = 'Exit Editing';
           }
           my $infunc = 1;
           my $clearbutton;
           if ($env{'environment.remote'} eq 'on') {
               if ($cfile =~ m{^/priv/}) {
                   undef($infunc);
                   $label = 'edit';
               } else {
                   $clearbutton = 1;
               }
           }
           my $editor = &switch('','',6,1,$icon,$label,'resource[_2]',
                                $jscall,"Edit this resource",'','',$infunc);
           if ($infunc) {
               return 1;
           } elsif ($clearbutton) {
               return &clear(6,1);
         } else {          } else {
             unless (&Apache::lonnet::get_locks()) {              return $editor;
                 $dest = '/adm/switchserver?otherserver='.          }
                         $home.'&role='.$env{'request.role'}.      }
                         '&url='.$url.'&forceedit=1';      return;
   }
   
   sub prepare_functions {
       my ($resurl,$forcereg,$group,$bread_crumbs,$advtools,$docscrumbs,$forbodytag) = @_;
       unless ($env{'request.registered'}) {
           undef(@inlineremote);
       }
       my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,
           $forceview);
   
       if ($env{'request.course.id'}) {
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
       }
   
       my $editbutton = '';
   #
   # Determine whether or not to display 'Edit' icon/button
   #
       if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) {
           my $file=&Apache::lonnet::declutter($env{'request.filename'});
           ($cfile,$home,$switchserver,$forceedit,$forceview) =
               &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,
                   &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group);
           if (($cfile) && ($home ne '') && ($home ne 'no_host')) {
               $editbutton = &get_editbutton($cfile,$home,$switchserver,
                                             $forceedit,$forceview,$forcereg);
           }
       } elsif ((!$env{'request.course.id'}) &&
                ($env{'user.author'}) && ($env{'request.filename'}) &&
                ($env{'request.role'} !~/^(aa|ca|au)/)) {
   #
   # Currently do not have the role of author or co-author.
   # Do we have authoring privileges for the resource?
   #
           my $file=&Apache::lonnet::declutter($env{'request.filename'});
           ($cfile,$home,$switchserver,$forceedit,$forceview) =
               &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,
                   &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group);
           if (($cfile) && ($home ne '') && ($home ne 'no_host')) {
               $editbutton = &get_editbutton($cfile,$home,$switchserver,
                                             $forceedit,$forceview,$forcereg);
           }
       } elsif ($env{'request.course.id'}) {
   #
   # This applies in course context
   #
           if (($perms{'mdc'}) &&
               (($resurl eq "/public/$cdom/$cnum/syllabus") ||
               ($resurl =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/}))) {
               $cfile = $resurl;
               $home = &Apache::lonnet::homeserver($cnum,$cdom);
               if ($env{'form.forceedit'}) {
                   $forceview = 1;
               } else {
                   $forceedit = 1;
               }
               $editbutton = &get_editbutton($cfile,$home,$switchserver,
                                             $forceedit,$forceview,$forcereg);
           } elsif (($resurl eq '/adm/extresedit') &&
                    (($env{'form.symb'}) || ($env{'form.folderpath'}))) {
               ($cfile,$home,$switchserver,$forceedit,$forceview) =
               &Apache::lonnet::can_edit_resource($resurl,$cnum,$cdom,$resurl,
                                                  $env{'form.symb'});
               if ($cfile ne '') {
                   $editbutton = &get_editbutton($cfile,$home,$switchserver,
                                                 $forceedit,$forceview,$forcereg,
                                                 $env{'form.title'},$env{'form.suppurl'});
               }
           } elsif (($resurl =~ m{^/?adm/viewclasslist$}) &&
                    (&Apache::lonnet::allowed('opa',$env{'request.course.id'}))) {
               ($cfile,$home,$switchserver,$forceedit,$forceview) =
               &Apache::lonnet::can_edit_resource($resurl,$cnum,$cdom,$resurl,
                                                  $env{'form.symb'});
               $editbutton = &get_editbutton($cfile,$home,$switchserver,
                                             $forceedit,$forceview,$forcereg);
           } elsif (($resurl !~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) &&
                    ($resurl ne '/cgi-bin/printout.pl')) {
               if ($env{'request.filename'}) {
                   my $file=&Apache::lonnet::declutter($env{'request.filename'});
                   ($cfile,$home,$switchserver,$forceedit,$forceview) =
                       &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,
                           &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group);
                   if ($cfile ne '') {
                       $editbutton = &get_editbutton($cfile,$home,$switchserver,
                                                     $forceedit,$forceview,$forcereg);
                   }
               }
           }
       }
   # End determination of 'Edit' icon/button display
   
       if ($env{'request.course.id'}) {
   # This applies to about me page for users in a course
           if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) {
               my ($sdom,$sname) = ($1,$2);
               unless (&Apache::lonnet::is_course($sdom,$sname)) {
                   &switch('','',6,4,'mail-message-new-22x22.png','Message to user',
                           '',
                           "go('/adm/email?compose=individual&amp;recname=$sname&amp;recdom=$sdom')",
                               'Send message to specific user','','',1);
               }
               my $hideprivileged = 1;
               if (&Apache::lonnet::in_course($sdom,$sname,$cdom,$cnum,undef,
                                              $hideprivileged)) {
                   foreach my $priv ('vsa','vgr','srm') {
                       $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'});
                       if (!$perms{$priv} && $env{'request.course.sec'} ne '') {
                           $perms{$priv} =
                               &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}");
                       }
                   }
                   if ($perms{'vsa'}) {
                       &switch('','',6,5,'trck-22x22.png','Activity',
                               '',
                               "go('/adm/trackstudent?selected_student=$sname:$sdom')",
                               'View recent activity by this person','','',1);
                   }
                   if ($perms{'vgr'}) {
                       &switch('','',6,6,'rsrv-22x22.png','Reservations',
                               '',
                               "go('/adm/slotrequest?command=showresv&amp;origin=aboutme&amp;uname=$sname&amp;udom=$sdom')",
                               'Slot reservation history','','',1);
                   }
                   if ($perms{'srm'}) {
                       &switch('','',6,7,'contact-new-22x22.png','Records',
                               '',
                               "go('/adm/email?recordftf=retrieve&amp;recname=$sname&amp;recdom=$sdom')",
                               'Add records','','',1);
                   }
               }
           }
           if (($env{'form.folderpath'} =~ /^supplemental/) &&
               (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&
               (($resurl =~ m{^/adm/wrapper/ext/}) ||
                ($resurl =~ m{^/uploaded/$cdom/$cnum/supplemental/}) ||
                ($resurl eq '/adm/supplemental') ||
                ($resurl =~ m{^/public/$cdom/$cnum/syllabus$}) ||
                ($resurl =~ m{^/adm/$match_domain/$match_username/aboutme$}))) {
               my @folders=split('&',$env{'form.folderpath'});
               if ((@folders > 2) || ($resurl ne '/adm/supplemental')) {
                   my $esc_path=&escape(&HTML::Entities::encode(&escape($env{'form.folderpath'}),'<>&"'));
                   &switch('','',7,4,'docs-22x22.png','Edit Folder','parms[_2]',
                           "location.href='/adm/coursedocs?command=direct&amp;forcesupplement=1&amp;supppath=$esc_path'",
                           'Folder/Page Content','','',1);
             }              }
         }          }
         if ($dest) {      }
             $cfile = &HTML::Entities::encode($dest,'"<>&');  
   # End checking for items for about me page for users in a course
       if ($docscrumbs) {
           &Apache::lonhtmlcommon::clear_breadcrumb_tools();
           &advtools_crumbs(@inlineremote);
           return $editbutton;
       } elsif (($env{'request.registered'}) && (!ref($forbodytag))) {
           return $editbutton;
       } else {
           if (ref($bread_crumbs) eq 'ARRAY') {
               if (@inlineremote > 0) {
                   if (ref($advtools) eq 'ARRAY') {
                       @{$advtools} = @inlineremote;
                   }
               }
               return;
           } elsif (@inlineremote > 0) {
               &Apache::lonhtmlcommon::clear_breadcrumb_tools();
               &advtools_crumbs(@inlineremote);
               if (ref($forbodytag)) {
                   $$forbodytag =
                       &Apache::lonhtmlcommon::scripttag('', 'start')
                      .&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
                      .&Apache::lonhtmlcommon::scripttag('', 'end');
               }
               return;
         }          }
     }      }
     return $cfile;  }
   
   sub advtools_crumbs {
       my @funcs = @_;
       if ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) {
           &Apache::lonhtmlcommon::add_breadcrumb_tool(
               'advtools', @funcs[61,64,65,66,67,74]);
       } elsif ($env{'request.noversionuri'} !~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {
           &Apache::lonhtmlcommon::add_breadcrumb_tool(
               'advtools', @funcs[61,71,72,73,74,92]);
       } elsif ($env{'request.noversionuri'} eq '/adm/viewclasslist') {
           &Apache::lonhtmlcommon::add_breadcrumb_tool(
               'advtools', $funcs[61]);
       }
 }  }
   
 # ================================================================== Raw Config  # ================================================================== Raw Config
   
 sub clear {  sub clear {
     my ($row,$col)=@_;      my ($row,$col)=@_;
     $inlineremote[10*$row+$col]='';      if ($env{'environment.remote'} eq 'on') {
     return '';          if (($row<1) || ($row>13)) { return ''; }
          return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););
       } else {
           $inlineremote[10*$row+$col]='';
           return '';
       }
 }  }
   
 # ============================================ Switch a button or create a link  # ============================================ Switch a button or create a link
Line 767  sub clear { Line 1525  sub clear {
 # The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".  # The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".
   
 sub switch {  sub switch {
     my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak)=@_;      my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak,$infunc)=@_;
     $act=~s/\$uname/$uname/g;      $act=~s/\$uname/$uname/g;
     $act=~s/\$udom/$udom/g;      $act=~s/\$udom/$udom/g;
     $top=&mt($top);      $top=&mt($top);
Line 776  sub switch { Line 1534  sub switch {
     my $idx=10*$row+$col;      my $idx=10*$row+$col;
     $category_members{$cat}.=':'.$idx;      $category_members{$cat}.=':'.$idx;
   
       if (($env{'environment.remote'} eq 'on') && (!$infunc)) {
           if (($row<1) || ($row>13)) { return ''; }
           if ($env{'request.state'} eq 'construct') {
               my $text = $top.' '.$bot;
               $text=~s/\s*\-\s*//gs;
               my $pic = '<img alt="'.$text.'" src="'.
                         &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).
                         '" align="'.($nobreak==3?'right':'left').'" class="LC_icon" />';
              $inlineremote[$idx] =
                  '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.
                  $pic.'<span class="LC_menubuttons_inline_text">'.$top.'&nbsp;</span></a>';
           }
   # Remote
           $img=~s/\.png$/\.gif/;
           return "\n".
    qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););
       }
   
 # Inline Menu  # Inline Menu
     if ($nobreak==2) { return ''; }      if ($nobreak==2) { return ''; }
     my $text=$top.' '.$bot;      my $text=$top.' '.$bot;
Line 806  sub switch { Line 1582  sub switch {
    }     }
     } else {      } else {
 # Inline Menu  # Inline Menu
       $inlineremote[$idx]=          my @tools = (93,91,81,82,83);
           unless ($env{'request.state'} eq 'construct') {
               push(@tools,63);
           }
           if (($env{'environment.icons'} eq 'iconsonly') &&
               (grep(/^$idx$/,@tools))) {
               $inlineremote[$idx] =
           '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.'</a>';
           } else {
               $inlineremote[$idx] =
        '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.         '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.
        '<span class="LC_menubuttons_inline_text">'.$top.'&nbsp;</span></a>';         '<span class="LC_menubuttons_inline_text">'.$top.'&nbsp;</span></a>';
           }
     }      }
     return '';      return '';
 }  }
Line 827  sub secondlevel { Line 1613  sub secondlevel {
     return $output;      return $output;
 }  }
   
   sub openmenu {
       my $menuname = &get_menu_name();
       unless ($env{'environment.remote'} eq 'on') { return ''; }
       my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
       return "window.open(".$nothing.",'".$menuname."');";
   }
   
 sub inlinemenu {  sub inlinemenu {
     undef(@inlineremote);      undef(@inlineremote);
     undef(%category_members);      undef(%category_members);
Line 869  sub rawconfig { Line 1662  sub rawconfig {
 #  #
     my $textualoverride=shift;      my $textualoverride=shift;
     my $output='';      my $output='';
     return '' unless $textualoverride;      if ($env{'environment.remote'} eq 'on') {
          $output.=
    "window.status='Opening Remote Control';var swmenu=".&openmenu().
   "\nwindow.status='Configuring Remote Control ';";
       } else {
           unless ($textualoverride) { return ''; }
       }
     my $uname=$env{'user.name'};      my $uname=$env{'user.name'};
     my $udom=$env{'user.domain'};      my $udom=$env{'user.domain'};
     my $adv=$env{'user.adv'};      my $adv=$env{'user.adv'};
Line 1044  sub rawconfig { Line 1843  sub rawconfig {
           $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);            $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
         }          }
     }      }
       if ($env{'environment.remote'} eq 'on') {
           $output.="\nwindow.status='Synchronizing Time';swmenu.syncclock(1000*".time.");\nwindow.status='Remote Control Configured.';";
           if (&Apache::lonmsg::newmail()) {
               $output.='swmenu.setstatus("you have","messages");';
           }
       }
     return $output;      return $output;
 }  }
   
Line 1069  sub check_for_rcrs { Line 1874  sub check_for_rcrs {
     return $showreqcrs;      return $showreqcrs;
 }  }
   
   # ======================================================================= Close
   
   sub close {
       unless ($env{'environment.remote'} eq 'on') { return ''; }
       my $menuname = &get_menu_name();
       return(<<ENDCLOSE);
   <script type="text/javascript">
   // <![CDATA[
   window.status='Accessing Remote Control';
   menu=window.open("/adm/rat/empty.html","$menuname",
                    "height=350,width=150,scrollbars=no,menubar=no");
   window.status='Disabling Remote Control';
   menu.active=0;
   menu.autologout=0;
   window.status='Closing Remote Control';
   menu.close();
   window.status='Done.';
   // ]]>
   </script>
   ENDCLOSE
   }
   
 sub dc_popup_js {  sub dc_popup_js {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           more => '(More ...)',                                            more => '(More ...)',
Line 1080  function showCourseID() { Line 1907  function showCourseID() {
     document.getElementById('dccid').style.display='block';      document.getElementById('dccid').style.display='block';
     document.getElementById('dccid').style.textAlign='left';      document.getElementById('dccid').style.textAlign='left';
     document.getElementById('dccid').style.textFace='normal';      document.getElementById('dccid').style.textFace='normal';
     document.getElementById('dccidtext').innerHTML ='<a href="javascript:hideCourseID();">$lt{'less'}</a>';      document.getElementById('dccidtext').innerHTML ='<a href="javascript:hideCourseID();" class="LC_menubuttons_link">$lt{'less'}</a>';
     return;      return;
 }  }
   
 function hideCourseID() {  function hideCourseID() {
     document.getElementById('dccid').style.display='none';      document.getElementById('dccid').style.display='none';
     document.getElementById('dccidtext').innerHTML ='<a href="javascript:showCourseID()">$lt{'more'}</a>';      document.getElementById('dccidtext').innerHTML ='<a href="javascript:showCourseID()" class="LC_menubuttons_link">$lt{'more'}</a>';
     return;      return;
 }  }
   
Line 1094  END Line 1921  END
   
 }  }
   
   sub countdown_toggle_js {
       return <<"END";
   
   function toggleCountdown() {
       var countdownid = document.getElementById('duedatecountdown');
       var currstyle = countdownid.style.display;
       if (currstyle == 'inline') {
           countdownid.style.display = 'none';
           document.getElementById('ddcountcollapse').innerHTML='';
           document.getElementById('ddcountexpand').innerHTML='&#9668;&nbsp;';
       } else {
           countdownid.style.display = 'inline';
           document.getElementById('ddcountcollapse').innerHTML='&#9658;&nbsp;';
           document.getElementById('ddcountexpand').innerHTML='';
       }
       return;
   }
   
   END
   }
   
 sub utilityfunctions {  sub utilityfunctions {
     my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));      my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
     if ($currenturl =~ m{^/adm/wrapper/ext/}      if ($currenturl =~ m{^/adm/wrapper/ext/}
Line 1122  sub utilityfunctions { Line 1970  sub utilityfunctions {
     my $end_page_annotate =       my $end_page_annotate = 
         &Apache::loncommon::end_page({'js_ready' => 1});          &Apache::loncommon::end_page({'js_ready' => 1});
   
     my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.      my $jumptores = &Apache::lonhtmlcommon::javascript_jumpto_resource();
                          &mt('Switch server?');  
   
       my $esc_url=&escape($currenturl);
       my $esc_symb=&escape($currentsymb);
   
       my $countdown = &countdown_toggle_js();
   
 return (<<ENDUTILITY)  return (<<ENDUTILITY)
   
     var currentURL="$currenturl";      var currentURL=unescape("$esc_url");
     var reloadURL="$currenturl";      var reloadURL=unescape("$esc_url");
     var currentSymb="$currentsymb";      var currentSymb=unescape("$esc_symb");
   
 $dc_popup_cid  $dc_popup_cid
   
Line 1142  function go(url) { Line 1993  function go(url) {
    }     }
 }  }
   
 function need_switchserver(url) {  $jumptores
     if (url!='' && url!= null) {  
         if (confirm("$confirm_switch")) {  
             go(url);   
         }  
     }  
     return;  
 }  
   
 function gopost(url,postdata) {  function gopost(url,postdata) {
    if (url!='') {     if (url!='') {
Line 1223  function golist(url) { Line 2067  function golist(url) {
   
   
 function catalog_info() {  function catalog_info() {
    loncatinfo=window.open(window.location.pathname+'.meta',"LONcatInfo",'height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');     openMyModal(window.location.pathname+'.meta',500,400,'yes');
 }  }
   
 function chat_win() {  function chat_win() {
Line 1249  function annotate() { Line 2093  function annotate() {
    annotator.document.close();     annotator.document.close();
 }  }
   
 function set_wishlistlink(title, path) {  function open_StoredLinks_Import(rat) {
     if (!title) {  
         title = document.title;  
         title = title.replace(/^LON-CAPA /,'');  
     }  
     if (!path) {  
         path = location.pathname;  
     }  
     Win = window.open('/adm/wishlist?mode=newLink&setTitle='+title+'&setPath='+path,  
                       'wishlistNewLink','width=560,height=350,scrollbars=0');  
 }  
   
 function open_Wishlist_Import(rat) {  
    var newWin;     var newWin;
    if (rat) {     if (rat) {
        newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import&rat='+rat,         newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import&rat='+rat,
Line 1274  function open_Wishlist_Import(rat) { Line 2106  function open_Wishlist_Import(rat) {
    newWin.focus();     newWin.focus();
 }  }
   
   (function (\$) {
     \$(document).ready(function () {
       \$.single=function(a){return function(b){a[0]=b;return a}}(\$([1]));
       /*\@cc_on
         if (!window.XMLHttpRequest) {
           \$('.LC_hoverable').each(function () {
             this.attachEvent('onmouseenter', function (evt) { \$.single(evt.srcElement).addClass('hover'); });
             this.attachEvent('onmouseleave', function (evt) { \$.single(evt.srcElement).removeClass('hover'); });
           });
         }
       \@*/
     });
   }(jQuery));
   
   $countdown
   
 ENDUTILITY  ENDUTILITY
 }  }
   
Line 1306  sub constspaceform { Line 2154  sub constspaceform {
 ENDCONSTSPACEFORM  ENDCONSTSPACEFORM
 }  }
   
   sub get_nav_status {
       my $navstatus="swmenu.w_loncapanav_flag=";
       if ($env{'environment.remotenavmap'} eq 'on') {
           $navstatus.="1";
       } else {
           $navstatus.="-1";
       }
       return $navstatus;
   }
   
 sub hidden_button_check {  sub hidden_button_check {
     if ( $env{'request.course.id'} eq ''      if ( $env{'request.course.id'} eq ''
          || $env{'request.role.adv'} ) {           || $env{'request.role.adv'} ) {
Line 1322  sub roles_selector { Line 2180  sub roles_selector {
     my $now = time;      my $now = time;
     my (%courseroles,%seccount,%courseprivs);      my (%courseroles,%seccount,%courseprivs);
     my $is_cc;      my $is_cc;
     my $role_selector;      my ($js,$form,$switcher,$switchtext);
     my $ccrole;      my $ccrole;
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $ccrole = 'co';          $ccrole = 'co';
     } else {      } else {
         $ccrole = 'cc';          $ccrole = 'cc';
     }      }
     my $priv;      my ($priv,$gotsymb,$destsymb);
     my $destinationurl = $ENV{'REQUEST_URI'};      my $destinationurl = $ENV{'REQUEST_URI'};
       if ($destinationurl =~ /\?symb=/) {
           $gotsymb = 1;
       } elsif ($destinationurl =~ m{^/enc/}) {
           my $plainurl = &Apache::lonenc::unencrypted($destinationurl);
           if ($plainurl =~ /\?symb=/) {
               $gotsymb = 1;
           }
       }
       unless ($gotsymb) {
           $destsymb = &Apache::lonnet::symbread();
           if ($destsymb ne '') {
               $destsymb = &Apache::lonenc::check_encrypt($destsymb);
           }
       }
     my $reqprivs = &required_privs();      my $reqprivs = &required_privs();
     if (ref($reqprivs) eq 'HASH') {      if (ref($reqprivs) eq 'HASH') {
         my $destination = $destinationurl;          my $destination = $destinationurl;
Line 1396  sub roles_selector { Line 2268  sub roles_selector {
             }              }
         }          }
     }      }
     my $switchtext;      $switchtext = &mt('Switch role');
     if ($crstype eq 'Community') {  
         $switchtext = &mt('Switch community role to...')  
     } else {  
         $switchtext = &mt('Switch course role to...')  
     }  
     my @roles_order = ($ccrole,'in','ta','ep','ad','st');      my @roles_order = ($ccrole,'in','ta','ep','ad','st');
     if (keys(%courseroles) > 1) {      my $numdiffsec;
         $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$priv);      if (keys(%seccount) == 1) {
         $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">          foreach my $key (keys(%seccount)) {
                           <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';              $numdiffsec = $seccount{$key};
         $role_selector .= '<option value="">'.$switchtext.'</option>';          }
       }
       if ((keys(%seccount) > 1) || ($numdiffsec > 1)) {
           my @submenu;
           $js = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$priv);
           $form = 
               '<form name="rolechooser" method="post" action="/adm/roles">'."\n".
               '  <input type="hidden" name="destinationurl" value="'.
               &HTML::Entities::encode($destinationurl).'" />'."\n".
               '  <input type="hidden" name="gotorole" value="1" />'."\n".
               '  <input type="hidden" name="selectrole" value="" />'."\n".
               '  <input type="hidden" name="switchrole" value="" />'."\n";
           if ($destsymb ne '') {
               $form .= '   <input type="hidden" name="destsymb" value="'.
                            &HTML::Entities::encode($destsymb).'" />'."\n";
           }
           $form .= '</form>'."\n";
         foreach my $role (@roles_order) {          foreach my $role (@roles_order) {
               my $include;
             if (defined($courseroles{$role})) {              if (defined($courseroles{$role})) {
                 $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role,$crstype).'</option>';                   if ($env{'request.role'} =~ m{^\Q$role\E}) {
                       if ($seccount{$role} > 1) {
                           $include = 1;
                       }
                   } else {
                       $include = 1;
                   }
               }
               if ($include) {
                   push(@submenu,['javascript:adhocRole('."'$role'".')',
                                  &Apache::lonnet::plaintext($role,$crstype)]);
             }              }
         }          }
         foreach my $role (sort(keys(%courseroles))) {          foreach my $role (sort(keys(%courseroles))) {
             if ($role =~ /^cr/) {              if ($role =~ /^cr/) {
                 $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>';                   my $include;
                   if ($env{'request.role'} =~ m{^\Q$role\E}) {
                       if ($seccount{$role} > 1) {
                           $include = 1;
                       }
                   } else {
                       $include = 1;
                   }
                   if ($include) {
                       push(@submenu,['javascript:adhocRole('."'$role'".')',
                                      &Apache::lonnet::plaintext($role)]);
                   }
             }              }
         }          }
         $role_selector .= '</select>'."\n".          if (@submenu > 0) {
                '<input type="hidden" name="destinationurl" value="'.              $switcher = &create_submenu('','',$switchtext,\@submenu);
                &HTML::Entities::encode($destinationurl).'" />'."\n".          }
                '<input type="hidden" name="gotorole" value="1" />'."\n".  
                '<input type="hidden" name="selectrole" value="" />'."\n".  
                '<input type="hidden" name="switch" value="1" />'."\n".  
                '</form>';  
     }      }
     return $role_selector;      return ($js,$form,$switcher);
 }  }
   
 sub get_all_courseroles {  sub get_all_courseroles {
Line 1489  sub get_all_courseroles { Line 2390  sub get_all_courseroles {
         push(@{$courseroles->{'st'}},keys(%sections_count));          push(@{$courseroles->{'st'}},keys(%sections_count));
         $seccount->{'st'} = scalar(keys(%sections_count));          $seccount->{'st'} = scalar(keys(%sections_count));
     }      }
       $seccount->{'st'} ++; # Increment for a section-less student role.
     my $rolehash = {      my $rolehash = {
                      'roles'    => $courseroles,                       'roles'    => $courseroles,
                      'seccount' => $seccount,                       'seccount' => $seccount,
Line 1565  sub jump_to_role { Line 2467  sub jump_to_role {
     return <<"END";      return <<"END";
 <script type="text/javascript">  <script type="text/javascript">
 //<![CDATA[  //<![CDATA[
 function adhocRole(roleitem) {  function adhocRole(newrole) {
     $js      $js
     var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;  
     if (newrole == '') {      if (newrole == '') {
         return;          return;
     }       } 
Line 1584  function adhocRole(roleitem) { Line 2485  function adhocRole(roleitem) {
                 if (confirm("$lt{'role'}\\n$lt{'swit'}")) {                  if (confirm("$lt{'role'}\\n$lt{'swit'}")) {
                     document.rolechooser.destinationurl.value = '/adm/menu';                      document.rolechooser.destinationurl.value = '/adm/menu';
                 } else {                  } else {
                     document.rolechooser.elements[roleitem].selectedIndex = 0;  
                     return;                      return;
                 }                  }
             }              }
Line 1627  function adhocRole(roleitem) { Line 2527  function adhocRole(roleitem) {
         return;          return;
     }      }
     if (fullrole == "$env{'request.role'}") {      if (fullrole == "$env{'request.role'}") {
         document.rolechooser.elements[roleitem].selectedIndex = 0;  
         return;          return;
     }      }
     itemid = retrieveIndex('gotorole');      itemid = retrieveIndex('gotorole');
     if (itemid != -1) {      if (itemid != -1) {
         document.rolechooser.elements[itemid].name = fullrole;          document.rolechooser.elements[itemid].name = fullrole;
     }      }
     document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value = fullrole;      document.rolechooser.switchrole.value = fullrole;
     document.rolechooser.selectrole.value = '1';      document.rolechooser.selectrole.value = '1';
     document.rolechooser.submit();      document.rolechooser.submit();
     return;      return;
Line 1661  sub required_privs { Line 2560  sub required_privs {
              '/adm/populate'     => 'cst',               '/adm/populate'     => 'cst',
              '/adm/trackstudent' => 'vsa',               '/adm/trackstudent' => 'vsa',
              '/adm/statistics'   => 'vgr',               '/adm/statistics'   => 'vgr',
                '/adm/setblock'     => 'dcm',
                '/adm/coursedocs'   => 'mdc',
            };             };
     unless ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'spreadsheet') {      unless ($env{'course.'.$env{'request.course.id'}.'.grading'} eq 'spreadsheet') {
         $privs->{'/adm/classcalc'}   => 'vgr',          $privs->{'/adm/classcalc'}   = 'vgr',
         $privs->{'/adm/assesscalc'}  => 'vgr',          $privs->{'/adm/assesscalc'}  = 'vgr',
         $privs->{'/adm/studentcalc'} => 'vgr';          $privs->{'/adm/studentcalc'} = 'vgr';
     }      }
     return $privs;      return $privs;
 }  }
   
   sub countdown_timer {
       if (($env{'request.course.id'}) && ($env{'request.symb'} ne '') &&
           ($env{'request.filename'}=~/$LONCAPA::assess_re/)) {
           my ($type,$hastimeleft,$slothastime);
           my $now = time;
           if ($env{'request.filename'} =~ /\.task$/) {
               $type = 'Task';
           } else {
               $type = 'problem';
           }
           my ($status,$accessmsg,$slot_name,$slot) =
               &Apache::lonhomework::check_slot_access('0',$type);
           if ($slot_name ne '') {
               if (ref($slot) eq 'HASH') {
                   if (($slot->{'starttime'} < $now) &&
                       ($slot->{'endtime'} > $now)) {
                       $slothastime = 1;
                   }
               }
           }
           if ($status ne 'CAN_ANSWER') {
               return;
           }
           my $duedate = &Apache::lonnet::EXT("resource.0.duedate");
           my @interval=&Apache::lonnet::EXT("resource.0.interval");
           if (@interval > 1) {
               my $first_access=&Apache::lonnet::get_first_access($interval[1]);
               if ($first_access > 0) {
                   if ($first_access+$interval[0] > time) {
                       $hastimeleft = 1;
                   }
               }
           }
           if (($duedate && $duedate > time) ||
               (!$duedate && $hastimeleft) ||
               ($slot_name ne '' && $slothastime)) {
               my ($collapse,$expand,$alttxt,$title,$currdisp);
               if ((@interval > 1 && $hastimeleft) ||
                   ($type eq 'Task' && $slothastime)) {
                   $currdisp = 'inline';
                   $collapse = '&#9658;&nbsp;';
               } else {
                   $currdisp = 'none';
                   $expand = '&#9668;&nbsp;';
               }
               unless ($env{'environment.icons'} eq 'iconsonly') {
                   $alttxt = &mt('Timer');
                   $title = $alttxt.'&nbsp;';
               }
               my $desc = &mt('Countdown to due date/time');
               return <<END;
   
   <a href="javascript:toggleCountdown();" class="LC_menubuttons_link">
   <span id="ddcountcollapse" class="LC_menubuttons_inline_text">
   $collapse
   </span></a>
   <span id="duedatecountdown" class="LC_menubuttons_inline_text" style="display: $currdisp;"></span>
   <a href="javascript:toggleCountdown();" class="LC_menubuttons_link">
   <span id="ddcountexpand" class="LC_menubuttons_inline_text" >$expand</span>
   <img src="/res/adm/pages/timer.png" title="$desc" class="LC_icon" alt="$alttxt" /><span class="LC_menubuttons_inline_text">$title</span></a>
   END
           }
       }
       return;
   }
   
 # ================================================================ Main Program  # ================================================================ Main Program
   
 BEGIN {  BEGIN {
Line 1686  BEGIN { Line 2653  BEGIN {
                         $category_positions{$entries[2]}=$entries[1];                          $category_positions{$entries[2]}=$entries[1];
                         $category_names{$entries[2]}=$entries[3];                          $category_names{$entries[2]}=$entries[3];
                     } elsif ($configline=~/^prim\:/) {                      } elsif ($configline=~/^prim\:/) {
                         my @entries = (split(/\:/, $configline))[1..5];                          my @entries = (split(/\:/, $configline))[1..6];
                         push @primary_menu, \@entries;                          push(@primary_menu,\@entries);
                       } elsif ($configline=~/^primsub\:/) {
                           my ($parent,@entries) = (split(/\:/, $configline))[1..4];
                           push(@{$primary_submenu{$parent}},\@entries);
                     } elsif ($configline=~/^scnd\:/) {                      } elsif ($configline=~/^scnd\:/) {
                         my @entries = (split(/\:/, $configline))[1..5];                          my @entries = (split(/\:/, $configline))[1..5];
                         push @secondary_menu, \@entries;                           push(@secondary_menu,\@entries);
                       } elsif ($configline=~/^scndsub\:/) {
                           my ($parent,@entries) = (split(/\:/, $configline))[1..4];
                           push(@{$secondary_submenu{$parent}},\@entries);
                     } elsif ($configline) {                      } elsif ($configline) {
                         push(@desklines,$configline);                          push(@desklines,$configline);
                     }                      }

Removed from v.1.360  
changed lines
  Added in v.1.369.2.44


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>