Diff for /loncom/interface/lonmenu.pm between versions 1.269 and 1.315.2.9

version 1.269, 2009/06/02 17:25:03 version 1.315.2.9, 2011/03/05 16:34:50
Line 42  Coordinates the response to clicking an Line 42  Coordinates the response to clicking an
 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.
   
   =head1 GLOBAL VARIABLES
   
   =over
   
   =item @desklines
   
   Each element of this array contains a line of mydesk.tab that doesn't start with
   cat, prim or scnd. 
   It gets filled in the BEGIN block of this module.
   
   =item %category_names
   
   The keys of this hash are the abbreviations used in mydesk.tab in those lines that 
   start with cat, the values are strings representing titles. 
   It gets filled in the BEGIN block of this module.
   
   =item %category_members
   
   TODO 
   
   =item %category_positions
   
   The keys of this hash are the abbreviations used in mydesk.tab in those lines that
   start with cat, its values are position vectors (column, row). 
   It gets filled in the BEGIN block of this module.
   
   =item $readdesk
   
   Indicates that mydesk.tab has been read. 
   It is set to 'done' in the BEGIN block of this module.
   
   =item @primary_menu
   
   The elements of this array reference arrays that are made up of the components
   of those lines of mydesk.tab that start with prim.
   It is used by primary_menu() to generate the corresponding menu.
   It gets filled in the BEGIN block of this module.
   
   =item @secondary_menu
   
   The elements of this array reference arrays that are made up of the components
   of those lines of mydesk.tab that start with scnd.
   It is used by secondary_menu() to generate the corresponding menu.
   It gets filled in the BEGIN block of this module.
   
   =back
   
 =head1 SUBROUTINES  =head1 SUBROUTINES
   
 =over  =over
   
 Little texts  =item prep_menuitems(\@menuitem)
   
   This routine wraps a menuitem in proper HTML. It is used by primary_menu() and 
   secondary_menu().
   
 =item initlittle()  =item primary_menu()
   
 =item menubuttons()  This routine evaluates @primary_menu and returns XHTML for the menu
   that contains following links: About, Message, Roles, Help, Logout
   @primary_menu is filled within the BEGIN block of this module with 
   entries from mydesk.tab 
   
 This gets called at the top of the body section  =item secondary_menu()
   
   Same as primary_menu() but operates on @secondary_menu.
   
 =item show_return_link()  =item show_return_link()
   
Line 113  The javascript is usually similar to "go Line 168  The javascript is usually similar to "go
   
 =item get_nav_status()  =item get_nav_status()
   
 =item convert_menu_function()  
   
 FIXME this needs to move into mydesktab and the other locations   
 the text is generated  
   
 =item hidden_button_check()  =item hidden_button_check()
   
 =item roles_selector()  =item roles_selector()
Line 137  use Apache::loncommon(); Line 187  use Apache::loncommon();
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::lonlocal;  use Apache::lonlocal;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   use HTML::Entities();
   
 use vars qw(@desklines %category_names %category_members %category_positions $readdesk);  use vars qw(@desklines %category_names %category_members %category_positions 
               $readdesk @primary_menu @secondary_menu);
   
 my @inlineremote;  my @inlineremote;
   
 sub initlittle {  sub prep_menuitem {
     return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',      my ($menuitem) = @_;
        'nav' => 'Navigate Contents',      return '' unless(ref($menuitem) eq 'ARRAY');
        'main' => 'Main Menu',      my $link;
                                        'roles' => (&Apache::loncommon::show_course()?      if ($$menuitem[1]) { # graphical Link
                                                     'Courses':'Roles'),          $link = "<img class=\"LC_noBorder\""
                                        'other' => 'Other Roles',                . " src=\"" . &Apache::loncommon::lonhttpdurl($$menuitem[1]) . "\"" 
                                        'docs' => 'Edit Course',                . " alt=\"" . &mt($$menuitem[2]) . "\" />";
                                        'exit' => 'Logout',      } else {             # textual Link
                                        'login' => 'Log In',          $link = &mt($$menuitem[3]);
        'launch' => 'Launch Remote Control',      }
                                        'groups' => 'Groups',      return '<li><a'
                                        'gdoc' => 'Group Documents',             # highlighting for new messages
                                        );             . ( $$menuitem[4] eq 'newmsg' ? ' class="LC_new_message"' : '')
 }             . qq| href="$$menuitem[0]" target="_top">$link</a></li>|;
   }
 sub menubuttons {  
     my $forcereg=shift;  # primary_menu() evaluates @primary_menu and returns XHTML for the menu
     my $registration=shift;  # that contains following links:
     my $titletable=shift;  # About, Message, Roles, Help, Logout
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},  # @primary_menu is filled within the BEGIN block of this module with 
     ['inhibitmenu']);  # entries from mydesk.tab
     if (($env{'form.inhibitmenu'} eq 'yes') ||  sub primary_menu {
         ($ENV{'REQUEST_URI'} eq '/adm/logout')) { return ''; }      my $menu;
       # each element of @primary contains following array:
     if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }      # (link url, icon path, alt text, link text, condition)
       my $public;
       if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
           || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
           $public = 1;
       }
       foreach my $menuitem (@primary_menu) {
           # evaluate conditions 
           next if    ref($menuitem)       ne 'ARRAY';    #
           next if    $$menuitem[4]        eq 'nonewmsg'  # show links depending on
                   && &Apache::lonmsg::mynewmail();       # whether a new msg 
           next if    $$menuitem[4]        eq 'newmsg'    # arrived or not
                   && !&Apache::lonmsg::mynewmail();      # 
           next if    $$menuitem[4]        !~ /public/    ##we've a public user,
                   && $public;                            ##who should not see all
                                                          ##links
           next if    $$menuitem[4]        eq 'onlypublic'# hide links which are
                   && !$public;                           # only visible to public
                                                          # users
           next if    $$menuitem[4]        eq 'roles'     ##show links depending on
                   && &Apache::loncommon::show_course();  ##term 'Courses' or
           next if    $$menuitem[4]        eq 'courses'   ##'Roles' wanted
                   && !&Apache::loncommon::show_course(); ##
   
   
           if ($$menuitem[3] eq 'Help') { # special treatment for helplink
               if ($public) {
                   my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
                   my $defdom = &Apache::lonnet::default_login_domain();
                   my $to = &Apache::loncommon::build_recipient_list(undef,
                                                                     'helpdeskmail',
                                                                     $defdom,$origmail);
                   if ($to ne '') {
                       $menu .= &prep_menuitem($menuitem);
                   }
               } else {
                   $menu .= '<li>'.&Apache::loncommon::top_nav_help('Help').'</li>';
               }
           } else {
               $menu .= &prep_menuitem($menuitem);
           }
       }
   
     my %lt=&initlittle();      return "<ol class=\"LC_primary_menu LC_right\">$menu</ol>";
     my $navmaps='';  }
     my $reloadlink='';  
     my $docs='';  
     my $groups='';  
     my $roles='<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>';  
     my $role_selector;  
     my $showgroups=0;  
     my ($cnum,$cdom);  
     my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));  
     my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));  
   
     my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif");  
     $logo = '<a href="/adm/about.html"><img src="'.  
  $logo.'" alt="LON-CAPA Logo" class="LC_noBorder" /></a>';  
   
     if ($env{'request.state'} eq 'construct') {  #returns hashref {user=>'',dom=>''} containing:
         if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) {  #   own name, domain if user is au
             my $returnurl = $env{'request.filename'};  #   name, domain of parent author if user is ca or aa
             $returnurl =~ s:^/home/([^/]+)/public_html/(.*)$:/priv/$1/$2:;  #empty return if user is not an author or not on homeserver
             $escurl = &escape($returnurl);  #
         }  #TODO this should probably be moved somewhere more central
   #since it can be used by different parts of the system
   sub getauthor{
       return unless $env{'request.role'}=~/^(ca|aa|au)/; #nothing to do if user isn't some kind of author
   
                           #co- or assistent author?
       my ($dom, $user) = ($env{'request.role'} =~ /^(?:ca|aa)\.\/($match_domain)\/($match_username)$/)
                          ? ($1, $2) #domain, username of the parent author
                          : @env{ ('request.role.domain', 'user.name') }; #own domain, username
   
       # current server == home server?
       my $home =  &Apache::lonnet::homeserver($user,$dom);
       foreach (&Apache::lonnet::current_machine_ids()){
           return {user => $user, dom => $dom} if $_ eq $home;
     }      }
     if ($env{'request.course.id'}) {  
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      # if wrong server
         $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      return;
         my %coursegroups;  }
         my $viewgrps_permission =  
     &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));  
         if (!$viewgrps_permission) {  sub secondary_menu {
             %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum);      my $menu;
  }  
         if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) {      my $crstype = &Apache::loncommon::course_type();
             $showgroups = 1;      my $crs_sec = $env{'request.course.id'} . ($env{'request.course.sec'}
         }                                                 ? "/$env{'request.course.sec'}"
         $role_selector = &roles_selector($cdom,$cnum);                                                 : '');
         if ($role_selector) {      my $canedit       = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
             $roles = '<span class="LC_nobreak">'.$role_selector.'&nbsp;&nbsp;<a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></span>';      my $canviewgrps   = &Apache::lonnet::allowed('vcg', $crs_sec);
       my $author        = getauthor();
   
       my $showlink = &show_return_link();
       my %groups = &Apache::lonnet::get_active_groups(
                        $env{'user.domain'}, $env{'user.name'},
                        $env{'course.' . $env{'request.course.id'} . '.domain'},
                        $env{'course.' . $env{'request.course.id'} . '.num'});
       foreach my $menuitem (@secondary_menu) {
           # evaluate conditions 
           next if    ref($menuitem)  ne 'ARRAY';
           next if    $$menuitem[4]   ne 'always'
                   && $$menuitem[4]   ne 'author'
                   && !$env{'request.course.id'};
           next if    $$menuitem[4]   eq 'showreturn'
                   && !$showlink
                   && !($env{'request.state'} eq 'construct');
           next if    $$menuitem[4]   =~ /^mdc/
                   && !$canedit;
           next if    $$menuitem[4]  eq 'mdcCourse'
                   && $crstype eq 'Community';
           next if    $$menuitem[4]  eq 'mdcCommunity'
                   && $crstype ne 'Community';
           next if    $$menuitem[4]  =~ /^remotenav/
                   && $env{'environment.remotenavmap'} ne 'on';
           next if    $$menuitem[4]  =~ /noremotenav/
                   && $env{'environment.remotenavmap'} eq 'on';
           next if $$menuitem[4] =~ /^(no|)remotenav$/ 
                   && $crstype eq 'Community';
           next if $$menuitem[4] =~ /^(no|)remotenavCommunity$/ 
                   && $crstype ne 'Community';
           next if    $$menuitem[4]   =~ /showgroups$/
                   && !$canviewgrps
                   && !%groups;
           next if    $$menuitem[4]    eq 'author'
                   && !$author;
   
           if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
               # special treatment for role selector
               my $roles_selector = &roles_selector(
                           $env{'course.' . $env{'request.course.id'} . '.domain'},
                           $env{'course.' . $env{'request.course.id'} . '.num'}  );
   
               $menu .= $roles_selector ? "<li>$roles_selector</li>"
                                        : '';
           } elsif ($env{'environment.remotenavmap'} eq 'on') {
               # open link using javascript when remote navmap is activated
               my @items = @{$menuitem}; 
               if ($menuitem->[4] eq 'remotenav') {
                   $items[0] = "javascript:gonav('$menuitem->[0]');";
               } else {
                   $items[0] = "javascript:go('$menuitem->[0]');";
               }
               $menu .= &prep_menuitem(\@items);
           } else {
               $menu .= &prep_menuitem(\@$menuitem);
         }          }
     }      }
       if ($menu =~ /\[url\].*\[symb\]/) {
           my $escurl  = &escape( &Apache::lonenc::check_encrypt(
                                $env{'request.noversionuri'}));
   
     if ($env{'environment.remote'} eq 'off') {          my $escsymb = &escape( &Apache::lonenc::check_encrypt(
 # Remote Control is switched off                               $env{'request.symb'})); 
 # figure out colors  
         my %lt=&initlittle();          if (    $env{'request.state'} eq 'construct'
               and (   $env{'request.noversionuri'} eq '' 
         my $domain=&Apache::loncommon::determinedomain();                   || !defined($env{'request.noversionuri'}))) 
         my $function =&Apache::loncommon::get_users_function();          {
         my $link=&Apache::loncommon::designparm($function.'.link',$domain);              ($escurl = $env{'request.filename'}) =~ 
         my $alink=&Apache::loncommon::designparm($function.'.alink',$domain);                  s{^/home/([^/]+)/public_html/(.*)$}{/priv/$1/$2};
         my $vlink=&Apache::loncommon::designparm($function.'.vlink',$domain);  
         my $sidebg=&Apache::loncommon::designparm($function.'.sidebg',$domain);              $escurl  = &escape($escurl);
           }    
         if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {          $menu =~ s/\[url\]/$escurl/g;
             return (<<ENDINLINEMENU);          $menu =~ s/\[symb\]/$escsymb/g;
    <table id="LC_top_nav">  
     <tr>  
       <td>$logo</td>  
       <td></td>  
       <td class="LC_top_nav_login">  
         <a href="/adm/roles" target="_top">$lt{'login'}</a>  
      </td>  
     </tr>  
   </table>  
 ENDINLINEMENU  
         }  
         $roles = '<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>';  
 # Do we have a NAV link?  
         if ($env{'request.course.id'}) {  
     my $link='/adm/navmaps?postdata='.$escurl.'&amp;postsymb='.  
  $escsymb;  
     if ($env{'environment.remotenavmap'} eq 'on') {  
  $link="javascript:gonav('".$link."')";  
     }  
     $navmaps=(<<ENDNAV);  
 <li><a href="$link" target="_top">$lt{'nav'}</a></li>  
 ENDNAV  
             my $is_group = (&Apache::loncommon::course_type() eq 'Group');  
     if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  
                 my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'};  
  $docs=(<<ENDDOCS);  
 <li><a href="/adm/coursedocs" target="_top">$text</a></li>  
 ENDDOCS  
             }  
             if ($showgroups) {  
                 $groups =(<<ENDGROUPS);  
 <li><a href="/adm/coursegroups" target="_top">$lt{'groups'}</a></li>  
 ENDGROUPS  
             }  
     if (&show_return_link()) {  
                 my $escreload=&escape('return:');  
                 $reloadlink=(<<ENDRELOAD);  
 <li><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></li>  
 ENDRELOAD  
             }  
             if ($role_selector) {  
             #$roles = '<td>'.$role_selector.'</td><td><a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></td>';  
  $role_selector = '<li>'.$role_selector.'</li>';  
             }  
         }  
  if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) {  
     my $escreload=&escape('return:');  
     $reloadlink=(<<ENDCRELOAD);  
 <li><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></li>  
 ENDCRELOAD  
         }  
         my $reg='';  
         if ($registration) {  
            $reg=&innerregister($forcereg,$titletable);  
         }  
         my $form=&serverform();  
  my $utility=&utilityfunctions();  
   
  my $messagelink = "";  
  if(&Apache::lonmsg::mynewmail()){  
  $messagelink = '<a href="javascript:go(\'/adm/communicate\');">Message(new)</a>'  
  }else{  
  $messagelink = '<a href="javascript:go(\'/adm/communicate\');">Message</a>'  
  }  
         my $helplink=&Apache::loncommon::top_nav_help('Help');  
  return (<<ENDINLINEMENU);  
 <script type="text/javascript">  
 // BEGIN LON-CAPA Internal  
 // <![CDATA[  
 $utility  
 // ]]>  
 </script>  
 <ol class="LC_smallMenu LC_right">  
  <li>$logo</li>  
  <li>$messagelink</li>  
  <li>$roles</li>  
  <li>$helplink</li>  
  <li><a href="/adm/logout" target="_top">$lt{'exit'}</a></li>  
 </ol>  
 <ul id="LC_TabMainMenuContent">  
 <li><a href="/adm/menu" target="_top">$lt{'main'}</a></li>  
 $reloadlink  
 $navmaps  
 $docs  
 $groups  
 $role_selector  
 </ul>  
 $form  
 <script type="text/javascript">  
 // END LON-CAPA Internal  
 </script>  
 $reg  
 ENDINLINEMENU  
     } else {  
  return '';  
     }      }
       $menu =~ s/\[uname\]/$$author{user}/g;
       $menu =~ s/\[udom\]/$$author{dom}/g;
   
       return "<ul id=\"LC_secondary_menu\">$menu</ul>";
 }  }
   
 sub show_return_link {  sub show_return_link {
       if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
           || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
   
           return if ($env{'form.register'});
       }
     return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&      return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
      $env{'request.symb'} eq '')       $env{'request.symb'} eq '')
     ||      ||
Line 332  sub show_return_link { Line 396  sub show_return_link {
     (($env{'request.noversionuri'}=~/^\/adm\//) &&      (($env{'request.noversionuri'}=~/^\/adm\//) &&
      ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&       ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
      ($env{'request.noversionuri'}!~       ($env{'request.noversionuri'}!~
       m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)])        m[^/adm/.*/(smppg|bulletinboard)($|\?)])
      ));       ));
 }  }
   
Line 350  sub registerurl { Line 414  sub registerurl {
          (!&Apache::lonnet::is_on_map(           (!&Apache::lonnet::is_on_map(
    &unescape($env{'request.noversionuri'})))) &&     &unescape($env{'request.noversionuri'})))) &&
         (!$forcereg))) {          (!$forcereg))) {
   return $result.    return
           '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>'.$force_title;          $result
          .'<script type="text/javascript">'."\n"
          .'// <![CDATA['."\n"
          .'function LONCAPAreg(){;} function LONCAPAstale(){}'."\n"
          .'// ]]>'."\n"
          .'</script>'
          .$force_title;
     }      }
 # Graphical display after login only  # Graphical display after login only
     if ($env{'request.registered'} && !$forcereg) { return ''; }      if ($env{'request.registered'} && !$forcereg) { return ''; }
Line 360  sub registerurl { Line 430  sub registerurl {
 }  }
   
 sub innerregister {  sub innerregister {
     my ($forcereg, $titletable) = @_;      my ($forcereg,$titletable,$bread_crumbs) = @_;
     my $result = '';      my $result = '';
     my ($uname,$thisdisfn);      my ($uname,$thisdisfn);
     my $const_space = ($env{'request.state'} eq 'construct');      my $const_space = ($env{'request.state'} eq 'construct');
Line 377  sub innerregister { Line 447  sub innerregister {
     my $reopen=&Apache::lonmenu::reopenmenu();      my $reopen=&Apache::lonmenu::reopenmenu();
   
     my $newmail='';      my $newmail='';
     my $breadcrumb;  
   
     if (&Apache::lonmsg::newmail() && !$noremote) {       if (&Apache::lonmsg::newmail() && !$noremote) { 
         # We have new mail and remote is up          # We have new mail and remote is up
         $newmail= 'swmenu.setstatus("you have","messages");';          $newmail= 'swmenu.setstatus("you have","messages");';
     }       } 
   
       my ($breadcrumb,$separator,$resurl);
     if ($noremote      if ($noremote
      && ($env{'request.symb'})        && ($env{'request.symb'}) 
      && ($env{'request.course.id'})) {       && ($env{'request.course.id'})) {
   
         my ($mapurl,$rid,$resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());          (my $mapurl, my $rid,$resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
         my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};          my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
   
         my $maptitle = &Apache::lonnet::gettitle($mapurl);          my $maptitle = &Apache::lonnet::gettitle($mapurl);
         my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());          my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());
         my @crumbs = ({text  => "Course Content",           my $contentstext;
                        href  => "Javascript:gonav('/adm/navmaps')"},           if ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Community') {
                       {text  => '...',              $contentstext = &mt('Community Contents');
                        no_mt => 1});          } else {
               $contentstext = &mt('Course Contents');
           }
           my @crumbs;
           unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps')
                   && ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
               my $navhref = "javascript:gopost('/adm/navmaps','')";
               if ($env{'environment.remotenavmap'} eq 'on') {
                    $navhref = "javascript:gonav('/adm/navmaps');";
               }
               @crumbs = ({text  => $contentstext,
                           href  => $navhref});
           }
           if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { 
               push(@crumbs, {text  => '...',
                              no_mt => 1});
           }
   
         push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle           push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle 
                                                    && $maptitle ne 'default.sequence'                                                      && $maptitle ne 'default.sequence' 
Line 403  sub innerregister { Line 490  sub innerregister {
   
         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);
         $breadcrumb .= Apache::lonhtmlcommon::breadcrumbs(undef,undef,0);  
           #$breadcrumb .= &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0);
    unless (($env{'request.state'} eq 'edit') || ($newmail) ||
    ($env{'request.state'} eq 'construct') ||
    ($env{'form.register'})) {
               $separator = &Apache::loncommon::head_subbox();
           }
         #          #
       } elsif (!$const_space){
           #a situation when we're looking at a resource outside of context of a
           #course or construction space (e.g. with cumulative rights)
           &Apache::lonhtmlcommon::clear_breadcrumbs();
           &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
     }      }
     if ($env{'request.state'} eq 'construct') {      if ($env{'request.state'} eq 'construct') {
         $newmail = $titletable;          $newmail = $titletable;
Line 416  sub innerregister { Line 514  sub innerregister {
     my $tableend   = ( $noremote ? '</table>' : '');      my $tableend   = ( $noremote ? '</table>' : '');
 # =============================================================================  # =============================================================================
 # ============================ This is for URLs that actually can be registered  # ============================ This is for URLs that actually can be registered
     if (($env{'request.noversionuri'}!~m|^/(res/)*adm/|) || ($forcereg)) {      if (($env{'request.noversionuri'}!~m{^/(res/)*adm/}) || ($forcereg)) {
 # -- This applies to homework problems for users with grading privileges  # -- This applies to homework problems for users with grading privileges
  my $crs='/'.$env{'request.course.id'};   my $crs='/'.$env{'request.course.id'};
  if ($env{'request.course.sec'}) {   if ($env{'request.course.sec'}) {
Line 457  sub innerregister { Line 555  sub innerregister {
         }          }
         if ($env{'user.author'}) {          if ($env{'user.author'}) {
             if ($env{'request.role'}=~/^(aa|ca|au)/) {              if ($env{'request.role'}=~/^(aa|ca|au)/) {
   #
   # We have the role of an author
   #
                 # Set defaults for authors                  # Set defaults for authors
                 my ($top,$bottom) = ('con-','struct');                  my ($top,$bottom) = ('con-','struct');
                 my $action = "go('/priv/".$env{'user.name'}."');";                  my $action = "go('/priv/".$env{'user.name'}."');";
Line 485  sub innerregister { Line 586  sub innerregister {
                     $noeditbutton = 0;                      $noeditbutton = 0;
                 }                  }
             }              }
   #
   # We are an author for some stuff, but currently do not have the role of author.
   # Figure out if we have authoring privileges for the resource we are looking at.
   # This should maybe become a privilege check in lonnet
   #
             ##              ##
             ## Determine if user can edit url.              ## Determine if user can edit url.
             ##              ##
Line 492  sub innerregister { Line 598  sub innerregister {
             my $cfuname='';              my $cfuname='';
             my $cfudom='';              my $cfudom='';
             my $uploaded;              my $uploaded;
               my $switchserver='';
               my $home;
             if ($env{'request.filename'}) {              if ($env{'request.filename'}) {
                 my $file=&Apache::lonnet::declutter($env{'request.filename'});                  my $file=&Apache::lonnet::declutter($env{'request.filename'});
                 if (defined($cnum) && defined($cdom)) {                  if (defined($cnum) && defined($cdom)) {
Line 502  sub innerregister { Line 610  sub innerregister {
                     # Check that the user has permission to edit this resource                      # Check that the user has permission to edit this resource
                     ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);                      ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);
                     if (defined($cfudom)) {                      if (defined($cfudom)) {
         my $home=&Apache::lonnet::homeserver($cfuname,$cfudom);          $home=&Apache::lonnet::homeserver($cfuname,$cfudom);
         my $allowed=0;          my $allowed=0;
         my @ids=&Apache::lonnet::current_machine_ids();          my @ids=&Apache::lonnet::current_machine_ids();
         foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }          foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
         if ($allowed) {          if ($allowed) {
                             $cfile=$file;                              $cfile=$file;
                           } else {
                               $switchserver=$file;
                         }                          }
                     }                      }
                 }                  }
             }              }
             # Finally, turn the button on or off              # Finally, turn the button on or off
             if ($cfile && !$const_space) {              if (($cfile || $switchserver) && !$const_space) {
                 $editbutton=&switch                  my $nocrsedit;
                     ('','',6,1,'pcstr.gif','edit[_1]','resource[_2]',                  # Suppress display where CC has switched to student role.
                      "go('".$cfile."');","Edit this resource");                  if ($env{'request.course.id'}) {
                 $noeditbutton = 0;                      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'} ) {
                               my ($mapurl,$rid,$resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
                               $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.gif','edit[_1]','resource[_2]',
                          $bot,"Edit this resource");
                       $noeditbutton = 0;
                   }
             } elsif ($editbutton eq '') {              } elsif ($editbutton eq '') {
                 $editbutton=&clear(6,1);                  $editbutton=&clear(6,1);
             }              }
Line 538  sub innerregister { Line 670  sub innerregister {
                 }                  }
             }              }
         }          }
           if ($env{'request.course.id'}) {
               if ($resurl eq "public/$cdom/$cnum/syllabus") {
                   if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) {
                       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                           $editbutton=&switch('','',6,1,'pcstr.png','Edit',
                                               'resource[_2]',
                                               "go('/adm/courseprefs?phase=display&actions=courseinfo')",
                                               'Edit this resource');
                       }
                   }
               }
           }
         ###          ###
         ###          ###
 # Prepare the rest of the buttons  # Prepare the rest of the buttons
         my $menuitems;          my $menuitems;
         if ($const_space) {          if ($const_space) {
   #
   # We are in construction space
   #
     my ($uname,$thisdisfn) =      my ($uname,$thisdisfn) =
  ($env{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|);   ($env{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|);
             my $currdir = '/priv/'.$uname.'/'.$thisdisfn;              my $currdir = '/priv/'.$uname.'/'.$thisdisfn;
Line 552  sub innerregister { Line 699  sub innerregister {
                 $currdir =~ s|[^/]+$||;                  $currdir =~ s|[^/]+$||;
  my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn);   my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn);
  my $esc_currdir = &Apache::loncommon::escape_single($currdir);   my $esc_currdir = &Apache::loncommon::escape_single($currdir);
   #
   # Probably should be in mydesk.tab
   #
                 $menuitems=(<<ENDMENUITEMS);                  $menuitems=(<<ENDMENUITEMS);
 s&6&1&list.gif&list[_1]&dir[_1]&golist('$esc_currdir')&List current directory  s&6&1&list.gif&list[_1]&dir[_1]&golist('$esc_currdir')&List current directory
 s&6&2&rtrv.gif&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$cleandisfn')&Retrieve old version  s&6&2&rtrv.gif&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$cleandisfn')&Retrieve old version
Line 560  s&7&1&del.gif&delete[_1]&resource[_2]&go Line 710  s&7&1&del.gif&delete[_1]&resource[_2]&go
 s&7&2&prt.gif&prepare[_1]&printout[_1]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document  s&7&2&prt.gif&prepare[_1]&printout[_1]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
             }              }
               if ($noremote) {
                   if (ref($bread_crumbs) eq 'ARRAY') {
                       &Apache::lonhtmlcommon::clear_breadcrumbs();
                       foreach my $crumb (@{$bread_crumbs}){
                           &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
   # Should probably be in mydesk.tab
   #
     $menuitems=(<<ENDMENUITEMS);      $menuitems=(<<ENDMENUITEMS);
 c&3&1  c&3&1
 s&2&1&back.gif&backward[_1]&&gopost('/adm/flip','back:'+currentURL)&Go to the previous resource in the course sequence&&1  s&2&1&back.gif&backward[_1]&&gopost('/adm/flip','back:'+currentURL)&Go to the previous resource in the course sequence&&1
Line 585  if(length($annotation) > 0){ Line 747  if(length($annotation) > 0){
 $menuitems.="&anno-[_1]&tations[_1]&annotate()&";  $menuitems.="&anno-[_1]&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)(\?|$)/) {              unless ($noremote) { 
  if (!$env{'request.enc'}) {                  my $showreqcrs = &check_for_rcrs();
                   if ($showreqcrs) {
                       $menuitems.="s&8&1&rcrs.gif&request[_1]&course[_16]".
                                   "&go('/adm/requestcourse')&Course requests\n";
                   }
               }
               unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) {
    if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) {
     $menuitems.=(<<ENDREALRES);      $menuitems.=(<<ENDREALRES);
 s&6&3&catalog.gif&catalog[_2]&info[_1]&catalog_info()&Show Metadata  s&6&3&catalog.gif&catalog[_2]&info[_1]&catalog_info()&Show Metadata
 ENDREALRES  ENDREALRES
Line 625  ENDMENUITEMS Line 794  ENDMENUITEMS
     my $addremote=0;      my $addremote=0;
     foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }      foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }
     my $inlinebuttons='';      my $inlinebuttons='';
     if ($addremote) {      if ($addremote) {
             # Registered, textual output  
                     if ($env{'environment.icons'} eq 'iconsonly') {          Apache::lonhtmlcommon::clear_breadcrumb_tools();
                         $inlinebuttons=(<<ENDARROWSINLINE);  
 <tr><td>              Apache::lonhtmlcommon::add_breadcrumb_tool(
 $inlineremote[21] $inlineremote[23]                  'navigation', @inlineremote[21,23]);
 ENDARROWSINLINE  
                         if (&hidden_button_check() ne 'yes') {          if(hidden_button_check() ne 'yes') {
                             $inlinebuttons .= (<<ENDINLINEICONS);              Apache::lonhtmlcommon::add_breadcrumb_tool(
 $inlineremote[61] $inlineremote[63]                  'tools', @inlineremote[93,91,81,82,83]);
 $inlineremote[71] $inlineremote[72] $inlineremote[73]  
 $inlineremote[81] $inlineremote[82] $inlineremote[83]              #publish button in construction space
 $inlineremote[91] $inlineremote[92] $inlineremote[93]</td></tr>              if ($env{'request.state'} eq 'construct'){
 ENDINLINEICONS                  Apache::lonhtmlcommon::add_breadcrumb_tool(
                         }                       'advtools', @inlineremote[63]);
                     } else {              }else{
  if ($inlineremote[21] ne '' || $inlineremote[23] ne '') {                  Apache::lonhtmlcommon::add_breadcrumb_tool(
     $inlinebuttons=(<<ENDFIRSTLINE);                       'tools', @inlineremote[63]);
 <tr><td>$inlineremote[21]</td><td>&nbsp;</td><td>$inlineremote[23]</td></tr>              }
 ENDFIRSTLINE  
                         }              unless ($env{'request.noversionuri'}=~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {
                         if (&hidden_button_check() ne 'yes') {                   Apache::lonhtmlcommon::add_breadcrumb_tool(
     foreach my $row (6..9) {                      'advtools', @inlineremote[61,71,72,73,92]);
  if ($inlineremote[${row}.'1'] ne ''              }
     || $inlineremote[$row.'2'] ne ''          }
     || $inlineremote[$row.'3'] ne '') {  
     $inlinebuttons .= <<"ENDLINE";  #       # Registered, textual output
 <tr><td>$inlineremote["${row}1"]</td><td>$inlineremote["${row}2"]</td><td>$inlineremote["${row}3"]</td></tr>  #        if ( $env{'environment.icons'} eq 'iconsonly' ) {
 ENDLINE  #            $inlinebuttons = (<<ENDARROWSINLINE);
  }  #<tr><td>
     }  #$inlineremote[21] $inlineremote[23]
  }  #ENDARROWSINLINE
     }  #            if ( &hidden_button_check() ne 'yes' ) {
     }  #                $inlinebuttons .= (<<ENDINLINEICONS);
   #$inlineremote[61] $inlineremote[63]
   #$inlineremote[71] $inlineremote[72] $inlineremote[73]
   #$inlineremote[81] $inlineremote[82] $inlineremote[83]
   #$inlineremote[91] $inlineremote[92] $inlineremote[93]</td></tr>
   #ENDINLINEICONS
   #            }
   #        } else { # not iconsonly
   #            if ( $inlineremote[21] ne '' || $inlineremote[23] ne '' ) {
   #                $inlinebuttons = (<<ENDFIRSTLINE);
   #<tr><td>$inlineremote[21]</td><td>&nbsp;</td><td>$inlineremote[23]</td></tr>
   #ENDFIRSTLINE
   #            }
   #            if ( &hidden_button_check() ne 'yes' ) {
   #                foreach my $row ( 6 .. 9 ) {
   #                    if (   $inlineremote[ ${row} . '1' ] ne ''
   #                        || $inlineremote[ $row . '2' ] ne ''
   #                        || $inlineremote[ $row . '3' ] ne '' )
   #                    {
   #                        $inlinebuttons .= <<"ENDLINE";
   #<tr><td>$inlineremote["${row}1"]</td><td>$inlineremote["${row}2"]</td><td>$inlineremote["${row}3"]</td></tr>
   #ENDLINE
   #                    }
   #                }
   #            }
   #        }
       }
           $breadcrumb = &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0);
     $result =(<<ENDREGTEXT);      $result =(<<ENDREGTEXT);
 <script type="text/javascript">  <script type="text/javascript">
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
 </script>  </script>
 $timesync  $timesync
 $breadcrumb  $breadcrumb
 $tablestart  <!-- $tablestart -->
 $inlinebuttons  <!-- $inlinebuttons -->
 $tableend  <!-- $tableend -->
 $newmail  $newmail
   <!-- $separator -->
 <script type="text/javascript">  <script type="text/javascript">
 // END LON-CAPA Internal  // END LON-CAPA Internal
 </script>  </script>
Line 686  ENDREGTEXT Line 883  ENDREGTEXT
     $result = (<<ENDREGTHIS);      $result = (<<ENDREGTHIS);
             
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
 var swmenu=null;  var swmenu=null;
   
Line 721  var swmenu=null; Line 919  var swmenu=null;
       }        }
   
 // END LON-CAPA Internal   // END LON-CAPA Internal 
   // ]]>
 </script>  </script>
 ENDREGTHIS  ENDREGTHIS
         }          }
Line 736  ENDDONOTREGTEXT Line 935  ENDDONOTREGTEXT
            $result = (<<ENDDONOTREGTHIS);             $result = (<<ENDDONOTREGTHIS);
   
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
 var swmenu=null;  var swmenu=null;
   
Line 760  var swmenu=null; Line 960  var swmenu=null;
     }      }
   
 // END LON-CAPA Internal  // END LON-CAPA Internal
   // ]]>
 </script>  </script>
 ENDDONOTREGTHIS  ENDDONOTREGTHIS
        }         }
Line 830  sub startupremote { Line 1031  sub startupremote {
     my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited');      my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited');
     return(<<ENDREMOTESTARTUP);      return(<<ENDREMOTESTARTUP);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 var timestart;  var timestart;
 function wheelswitch() {  function wheelswitch() {
     if (typeof(document.wheel) != 'undefined') {      if (typeof(document.wheel) != 'undefined') {
Line 880  function main() { Line 1082  function main() {
    wait();     wait();
 }  }
   
   // ]]>
 </script>  </script>
 ENDREMOTESTARTUP  ENDREMOTESTARTUP
 }  }
Line 887  ENDREMOTESTARTUP Line 1090  ENDREMOTESTARTUP
 sub setflags() {  sub setflags() {
     return(<<ENDSETFLAGS);      return(<<ENDSETFLAGS);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
     menuloaded=0;      menuloaded=0;
     tim=0;      tim=0;
   // ]]>
 </script>  </script>
 ENDSETFLAGS  ENDSETFLAGS
 }  }
Line 897  sub maincall() { Line 1102  sub maincall() {
     if ($env{'environment.remote'} eq 'off') { return ''; }      if ($env{'environment.remote'} eq 'off') { return ''; }
     return(<<ENDMAINCALL);      return(<<ENDMAINCALL);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
     main();      main();
   // ]]>
 </script>  </script>
 ENDMAINCALL  ENDMAINCALL
 }  }
Line 939  sub reopenmenu { Line 1146  sub reopenmenu {
 sub open {  sub open {
     my $returnval='';      my $returnval='';
     if ($env{'environment.remote'} eq 'off') {       if ($env{'environment.remote'} eq 'off') { 
  return '<script type="text/javascript">self.name="loncapaclient";</script>';   return
           '<script type="text/javascript">'."\n"
          .'// <![CDATA['."\n"
          .'self.name="loncapaclient";'."\n"
          .'// ]]>'."\n"
          .'</script>';
     }      }
     my $menuname = &get_menu_name();      my $menuname = &get_menu_name();
           
Line 952  sub open { Line 1164  sub open {
 #}  #}
 #ENDRESIZE  #ENDRESIZE
 #    }  #    }
     $returnval.=(<<ENDOPEN);      $returnval=(<<ENDOPEN);
   // <![CDATA[
 window.status='Opening LON-CAPA Remote Control';  window.status='Opening LON-CAPA Remote Control';
 var menu=window.open("/res/adm/pages/menu.html","$menuname",  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");  "height=375,width=150,scrollbars=no,menubar=no,top=5,left=5,screenX=5,screenY=5");
 self.name='loncapaclient';  self.name='loncapaclient';
   // ]]>
 ENDOPEN  ENDOPEN
     return '<script type="text/javascript">'.$returnval.'</script>';      return '<script type="text/javascript">'.$returnval.'</script>';
 }  }
Line 967  ENDOPEN Line 1181  ENDOPEN
 sub clear {  sub clear {
     my ($row,$col)=@_;      my ($row,$col)=@_;
     unless ($env{'environment.remote'} eq 'off') {      unless ($env{'environment.remote'} eq 'off') {
          if (($row<1) || ($row>13)) { return ''; }
        return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););         return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););
    } else {      } else { 
        $inlineremote[10*$row+$col]='';         $inlineremote[10*$row+$col]='';
Line 992  sub switch { Line 1207  sub switch {
     $category_members{$cat}.=':'.$idx;      $category_members{$cat}.=':'.$idx;
   
     unless ($env{'environment.remote'} eq 'off') {      unless ($env{'environment.remote'} eq 'off') {
          if (($row<1) || ($row>13)) { return ''; }
 # Remote  # Remote
        return "\n".         return "\n".
  qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););   qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););
Line 1007  sub switch { Line 1223  sub switch {
        my $pic=         my $pic=
    '<img alt="'.$text.'" src="'.     '<img alt="'.$text.'" src="'.
    &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).     &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).
    '" align="'.($nobreak==3?'right':'left').'" class="LC_noBorder" />';     '" align="'.($nobreak==3?'right':'left').'" class="LC_icon" />';
        if ($env{'browser.interface'} eq 'faketextual') {         if ($env{'browser.interface'} eq 'faketextual') {
 # Accessibility  # Main Menu
    if ($nobreak==3) {     if ($nobreak==3) {
        $inlineremote[$idx]="\n".         $inlineremote[$idx]="\n".
    '<td class="LC_menubuttons_text" align="right">'.$text.     '<td class="LC_menubuttons_text" align="right">'.$text.
Line 1033  sub switch { Line 1249  sub switch {
               $inlineremote[$idx]='<a title="'.$desc.'" href="javascript:'.$act.';">'.$pic.'</a>';                $inlineremote[$idx]='<a title="'.$desc.'" href="javascript:'.$act.';">'.$pic.'</a>';
            } else {             } else {
       $inlineremote[$idx]=        $inlineremote[$idx]=
    '<a 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">'.$desc.'</span></a>';     '<span class="LC_menubuttons_inline_text">'.$desc.'</span></a>';
            }             }
        }         }
Line 1065  sub openmenu { Line 1281  sub openmenu {
 sub inlinemenu {  sub inlinemenu {
     undef(@inlineremote);      undef(@inlineremote);
     undef(%category_members);      undef(%category_members);
   # calling rawconfig with "1" will evaluate mydesk.tab, even if there is no active remote control
     &rawconfig(1);      &rawconfig(1);
     my $output='<table id="LC_mainmenu"><tr>';      my $output='<table><tr>';
     for (my $col=1; $col<=2; $col++) {      for (my $col=1; $col<=2; $col++) {
         $output.='<td class="LC_mainmenu_col_fieldset">';          $output.='<td class="LC_mainmenu_col_fieldset">';
         for (my $row=1; $row<=8; $row++) {          for (my $row=1; $row<=8; $row++) {
             foreach my $cat (keys(%category_members)) {              foreach my $cat (keys(%category_members)) {
                if ($category_positions{$cat} ne "$col,$row") { next; }                 if ($category_positions{$cat} ne "$col,$row") { next; }
                #$output.='<table><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';                 #$output.='<table><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';
                $output.='<div class="LC_ContentBoxSpecial">';                 $output.='<div class="LC_Box LC_400Box">';
        $output.='<h4 class="LC_hcell">'.&mt($category_names{$cat}).'</h4>';         $output.='<h3 class="LC_hcell">'.&mt($category_names{$cat}).'</h3>';
                $output.='<table>';                 $output.='<table>';
                my %active=();                 my %active=();
                foreach my $menu_item (split(/\:/,$category_members{$cat})) {                 foreach my $menu_item (split(/\:/,$category_members{$cat})) {
Line 1096  sub inlinemenu { Line 1313  sub inlinemenu {
 }  }
   
 sub rawconfig {  sub rawconfig {
   #
   # This evaluates mydesk.tab
   # Need to add more positions and more privileges to deal with all
   # menu items.
   #
     my $textualoverride=shift;      my $textualoverride=shift;
     my $output='';      my $output='';
     unless ($env{'environment.remote'} eq 'off') {      unless ($env{'environment.remote'} eq 'off') {
Line 1111  sub rawconfig { Line 1333  sub rawconfig {
     my $show_course=&Apache::loncommon::show_course();      my $show_course=&Apache::loncommon::show_course();
     my $author=$env{'user.author'};      my $author=$env{'user.author'};
     my $crs='';      my $crs='';
       my $crstype='';
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
        $crs='/'.$env{'request.course.id'};         $crs='/'.$env{'request.course.id'};
        if ($env{'request.course.sec'}) {         if ($env{'request.course.sec'}) {
    $crs.='_'.$env{'request.course.sec'};     $crs.='_'.$env{'request.course.sec'};
        }         }
        $crs=~s/\_/\//g;         $crs=~s/\_/\//g;
          $crstype = &Apache::loncommon::course_type();
     }      }
     my $pub=($env{'request.state'} eq 'published');      my $pub=($env{'request.state'} eq 'published');
     my $con=($env{'request.state'} eq 'construct');      my $con=($env{'request.state'} eq 'construct');
Line 1126  sub rawconfig { Line 1350  sub rawconfig {
         my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line);          my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line);
         $prt=~s/\$uname/$uname/g;          $prt=~s/\$uname/$uname/g;
         $prt=~s/\$udom/$udom/g;          $prt=~s/\$udom/$udom/g;
         $prt=~s/\$crs/$crs/g;           if ($env{'environment.remotenavmap'} eq 'on') {
                unless ($env{'environment.remote'} eq 'on') {
                    if ($img eq 'nav.gif') {
                        $act = "gonav('/adm/navmaps','')";
                    }
                }
           }
           if ($prt =~ /\$crs/) {
               next unless ($env{'request.course.id'});
               next if ($crstype eq 'Community');
               $prt=~s/\$crs/$crs/g;
           } elsif ($prt =~ /\$cmty/) {
               next unless ($env{'request.course.id'});
               next if ($crstype ne 'Community');
               $prt=~s/\$cmty/$crs/g;
           }
         $prt=~s/\$requested_domain/$requested_domain/g;          $prt=~s/\$requested_domain/$requested_domain/g;
         if ($category_names{$cat}!~/\w/) { $cat='oth'; }          if ($category_names{$cat}!~/\w/) { $cat='oth'; }
         my $type = &Apache::loncommon::course_type();  
         if ($type eq 'Group') {  
             $desc = &convert_menu_function($desc,$type);  
         }  
         if ($pro eq 'clear') {          if ($pro eq 'clear') {
     $output.=&clear($row,$col);      $output.=&clear($row,$col);
         } elsif ($pro eq 'any') {          } elsif ($pro eq 'any') {
Line 1159  sub rawconfig { Line 1394  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);
             }              }
         } elsif (($pro=~/^p(\w+)/) && ($prt)) {          } elsif (($pro=~/^p(\w+)/) && ($prt)) {
     if (&Apache::lonnet::allowed($1,$prt)) {              my $priv = $1;
               if ($priv =~ /^mdc(Course|Community)/) {
                   if ($crstype eq $1) {
                       $priv = 'mdc';
                   } else {
                       next;
                   }
               }
       if (&Apache::lonnet::allowed($priv,$prt)) {
                $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
             }              }
         } elsif ($pro eq 'course') {          } elsif ($pro eq 'course')  {
             if ($env{'request.course.fn'}) {              if (($env{'request.course.fn'}) && ($crstype ne 'Community')) {
                $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
     }      }
           } elsif ($pro eq 'community')  {
               if (($env{'request.course.fn'}) && ($crstype eq 'Community')) {
                  $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
               }
         } elsif ($pro =~ /^courseenv_(.*)$/) {          } elsif ($pro =~ /^courseenv_(.*)$/) {
             my $key = $1;              my $key = $1;
             if ($env{'course.'.$env{'request.course.id'}.'.'.$key}) {              if ($crstype ne 'Community') {
                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                  my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
                   if ($key eq 'canuse_pdfforms') {
                       if ($env{'request.course.id'} && $coursepref eq '') {
                           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                           $coursepref = $domdefs{'canuse_pdfforms'};
                       }
                   }
                   if ($coursepref) { 
                       $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
                   }
               }
           } elsif ($pro =~ /^communityenv_(.*)$/) {
               my $key = $1;
               if ($crstype eq 'Community') {
                   my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
                   if ($key eq 'canuse_pdfforms') {
                       if ($env{'request.course.id'} && $coursepref eq '') {
                           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                           $coursepref = $domdefs{'canuse_pdfforms'};
                       }
                   }
                   if ($coursepref) { 
                       $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
                   }
             }              }
         } elsif ($pro =~ /^course_(.*)$/) {          } elsif ($pro =~ /^course_(.*)$/) {
             # Check for permissions inside of a course              # Check for permissions inside of a course
             if (($env{'request.course.id'}) &&              if (($env{'request.course.id'}) && ($crstype ne 'Community') && 
                 (&Apache::lonnet::allowed($1,$env{'request.course.id'}.                  (&Apache::lonnet::allowed($1,$env{'request.course.id'}.
             ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))              ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))
                  )) {                   )) {
                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                  $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
     }      }
           } elsif ($pro =~ /^community_(.*)$/) {
               # Check for permissions inside of a community
               if (($env{'request.course.id'}) && ($crstype eq 'Community') &&   
                   (&Apache::lonnet::allowed($1,$env{'request.course.id'}.
               ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))
                    )) {
                   $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
               }
         } elsif ($pro eq 'author') {          } elsif ($pro eq 'author') {
             if ($author) {              if ($author) {
                 if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) ||                  if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) ||
Line 1211  sub rawconfig { Line 1489  sub rawconfig {
                     $output.=&clear($row,$col);                      $output.=&clear($row,$col);
                     next;                      next;
                 }                  }
             } elsif ($prt eq 'reqcrs') {              } elsif (($prt eq 'reqcrsnsc') || ($prt eq 'reqcrsshc')) {
                 my $showreqcrs = 0;                  if (($prt eq 'reqcrsnsc') && ($show_course))   {
                 foreach my $type ('official','unofficial') {                      next;
                     if (&Apache::lonnet::usertools_access($env{'user.name'},                  }
                                                     $env{'user.domain'},                  if (($prt eq 'reqcrsshc') && (!$show_course)) {
                                                     $type,undef,'requestcourses')) {                      next;
                         $showreqcrs = 1;  
                         last;  
                     }  
                 }                  }
                   my $showreqcrs = &check_for_rcrs();
                 if (!$showreqcrs) {                  if (!$showreqcrs) {
                     $output.=&clear($row,$col);                      $output.=&clear($row,$col);
                     next;                      next;
Line 1241  sub rawconfig { Line 1517  sub rawconfig {
     return $output;      return $output;
 }  }
   
   sub check_for_rcrs {
       my $showreqcrs = 0;
       my @reqtypes = ('official','unofficial','community');
       foreach my $type (@reqtypes) {
           if (&Apache::lonnet::usertools_access($env{'user.name'},
                                                 $env{'user.domain'},
                                                 $type,undef,'requestcourses')) {
               $showreqcrs = 1;
               last;
           }
       }
       if (!$showreqcrs) {
           foreach my $type (@reqtypes) {
               if ($env{'environment.reqcrsotherdom.'.$type} ne '') {
                   $showreqcrs = 1;
                   last;
               }
           }
       }
       return $showreqcrs;
   }
   
 # ======================================================================= Close  # ======================================================================= Close
   
 sub close {  sub close {
Line 1248  sub close { Line 1546  sub close {
     my $menuname = &get_menu_name();      my $menuname = &get_menu_name();
     return(<<ENDCLOSE);      return(<<ENDCLOSE);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 window.status='Accessing Remote Control';  window.status='Accessing Remote Control';
 menu=window.open("/adm/rat/empty.html","$menuname",  menu=window.open("/adm/rat/empty.html","$menuname",
                  "height=350,width=150,scrollbars=no,menubar=no");                   "height=350,width=150,scrollbars=no,menubar=no");
Line 1257  menu.autologout=0; Line 1556  menu.autologout=0;
 window.status='Closing Remote Control';  window.status='Closing Remote Control';
 menu.close();  menu.close();
 window.status='Done.';  window.status='Done.';
   // ]]>
 </script>  </script>
 ENDCLOSE  ENDCLOSE
 }  }
Line 1284  function gonav(url) { Line 1584  function gonav(url) {
 NAVCONTROL  NAVCONTROL
 }  }
   
   sub dc_popup_js {
       my %lt = &Apache::lonlocal::texthash(
                                             more => '(More ...)',
                                             less => '(Less ...)',
                                           );
       return <<"END";
   
   function showCourseID() {
       document.getElementById('dccid').style.display='block';
       document.getElementById('dccid').style.textAlign='left';
       document.getElementById('dccid').style.textFace='normal';
       document.getElementById('dccidtext').innerHTML ='<a href="javascript:hideCourseID();">$lt{'less'}</a>';
       return;
   }
   
   function hideCourseID() {
       document.getElementById('dccid').style.display='none';
       document.getElementById('dccidtext').innerHTML ='<a href="javascript:showCourseID()">$lt{'more'}</a>';
       return;
   }
   
   END
   
   }
   
 sub utilityfunctions {  sub utilityfunctions {
     my $caller = shift;      my $caller = shift;
     unless ($env{'environment.remote'} eq 'off' ||       unless ($env{'environment.remote'} eq 'off' || 
Line 1291  sub utilityfunctions { Line 1616  sub utilityfunctions {
             return ''; }              return ''; }
                           
     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 ($env{'request.external.querystring'}) {
               $currenturl .= ($currenturl=~/\?/)?'&':'?'.$env{'request.external.querystring'};
           }
       }
     $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));      $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));
           
     my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});      my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
     my $nav_control=&nav_control_js();      my $nav_control=&nav_control_js();
   
       my $dc_popup_cid;
       if ($env{'user.adv'} && exists($env{'user.role.dc./'.
                           $env{'course.'.$env{'request.course.id'}.
                                    '.domain'}.'/'})) {
           $dc_popup_cid = &dc_popup_js();
       }
   
     my $start_page_annotate =       my $start_page_annotate = 
         &Apache::loncommon::start_page('Annotator',undef,          &Apache::loncommon::start_page('Annotator',undef,
        {'only_body' => 1,         {'only_body' => 1,
Line 1316  sub utilityfunctions { Line 1653  sub utilityfunctions {
     my $end_page_bookmark =       my $end_page_bookmark = 
         &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'.
                            &mt('Switch server?');
   
 return (<<ENDUTILITY)  return (<<ENDUTILITY)
   
     var currentURL="$currenturl";      var currentURL="$currenturl";
Line 1323  return (<<ENDUTILITY) Line 1663  return (<<ENDUTILITY)
     var currentSymb="$currentsymb";      var currentSymb="$currentsymb";
   
 $nav_control  $nav_control
   $dc_popup_cid
   
 function go(url) {  function go(url) {
    if (url!='' && url!= null) {     if (url!='' && url!= null) {
Line 1332  function go(url) { Line 1673  function go(url) {
    }     }
 }  }
   
   function need_switchserver(url) {
       if (url!='' && url!= null) {
           if (confirm("$confirm_switch")) {
               go(url);
           }
       }
       return;
   }
   
 function gopost(url,postdata) {  function gopost(url,postdata) {
    if (url!='') {     if (url!='') {
       this.document.server.action=url;        this.document.server.action=url;
Line 1408  function catalog_info() { Line 1758  function catalog_info() {
 }  }
   
 function chat_win() {  function chat_win() {
    lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');     lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=480,resizable=yes,location=no,menubar=no,toolbar=no');
 }  }
   
 function group_chat(group) {  function group_chat(group) {
Line 1421  function edit_bookmarks() { Line 1771  function edit_bookmarks() {
    go('');     go('');
    w_BookmarkPal_flag=1;     w_BookmarkPal_flag=1;
    bookmarkpal=window.open("/adm/bookmarks",     bookmarkpal=window.open("/adm/bookmarks",
                "BookmarkPal", "width=400,height=505,scrollbars=0");                 "BookmarkPal", "width=500,height=505,scrollbars=0");
 }  }
   
 function annotate() {  function annotate() {
Line 1502  sub get_nav_status { Line 1852  sub get_nav_status {
     return $navstatus;      return $navstatus;
 }  }
   
 #FIXME this needs to move into mydesktab and the other locations   
 # the text is generated  
 sub convert_menu_function {  
     my ($rolename,$type) = @_;  
     if ($type eq 'Group') {  
         $rolename =~ s/student/member/g;  
         $rolename =~ s/group/team/g;  
         $rolename =~ s/course/group/g;  
         $rolename =~ s/Course/Group/g;  
     }  
     return $rolename;  
 }  
   
 sub hidden_button_check {  sub hidden_button_check {
     my $hidden;      my $hidden;
     if ($env{'request.course.id'} eq '') {      if ($env{'request.course.id'} eq '') {
Line 1529  sub hidden_button_check { Line 1866  sub hidden_button_check {
   
 sub roles_selector {  sub roles_selector {
     my ($cdom,$cnum) = @_;      my ($cdom,$cnum) = @_;
       my $crstype = &Apache::loncommon::course_type();
     my $now = time;      my $now = time;
     my (%courseroles,%seccount);      my (%courseroles,%seccount);
     my $is_cc;      my $is_cc;
     my $role_selector;      my $role_selector;
     if ($env{'user.role.cc./'.$cdom.'/'.$cnum}) {      my $ccrole;
         my ($start,$end) = split(/\./,$env{'user.role.cc./'.$cdom.'/'.$cnum});      if ($crstype eq 'Community') {
           $ccrole = 'co';
       } else {
           $ccrole = 'cc';
       } 
       if ($env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}) {
           my ($start,$end) = split(/\./,$env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum});
                   
         if ((($start) && ($start<0)) ||           if ((($start) && ($start<0)) || 
             (($end) && ($end<$now))  ||              (($end) && ($end<$now))  ||
Line 1578  sub roles_selector { Line 1922  sub roles_selector {
             }              }
         }          }
     }      }
     my @roles_order = ('cc','in','ta','ep','ad','st');      my $switchtext;
       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');
     if (keys(%courseroles) > 1) {      if (keys(%courseroles) > 1) {
         $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles);          $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles);
         $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">          $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">
                           <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';                            <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';
         $role_selector .= '<option value="">'.&mt('Switch course role to...').'</option>';          $role_selector .= '<option value="">'.$switchtext.'</option>';
         foreach my $role (@roles_order) {          foreach my $role (@roles_order) {
             if (defined($courseroles{$role})) {              if (defined($courseroles{$role})) {
                 $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>';                   $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role,$crstype).'</option>'; 
             }              }
         }          }
         foreach my $role (sort(keys(%courseroles))) {          foreach my $role (sort(keys(%courseroles))) {
Line 1596  sub roles_selector { Line 1946  sub roles_selector {
         }          }
         $role_selector .= '</select>'."\n".          $role_selector .= '</select>'."\n".
                '<input type="hidden" name="destinationurl" value="'.                 '<input type="hidden" name="destinationurl" value="'.
                $ENV{'REQUEST_URI'}.'" />'."\n".                 &HTML::Entities::encode($ENV{'REQUEST_URI'}).'" />'."\n".
                '<input type="hidden" name="gotorole" value="1" />'."\n".                 '<input type="hidden" name="gotorole" value="1" />'."\n".
                '<input type="hidden" name="selectrole" value="" />'."\n".                 '<input type="hidden" name="selectrole" value="" />'."\n".
                '<input type="hidden" name="switch" value="1" />'."\n".                 '<input type="hidden" name="switch" value="1" />'."\n".
Line 1691  sub jump_to_role { Line 2041  sub jump_to_role {
                    '    numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n";                     '    numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n";
         }          }
     }      }
     my $output = <<"END";      return <<"END";
 <script type="text/javascript">  <script type="text/javascript">
   //<![CDATA[
 function adhocRole(roleitem) {  function adhocRole(roleitem) {
     $js      $js
     var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;      var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;
Line 1713  function adhocRole(roleitem) { Line 2064  function adhocRole(roleitem) {
             secok = 0;              secok = 0;
             var numrolesec = rolesections[selidx].length;              var numrolesec = rolesections[selidx].length;
             var msgidx = numsec[selidx] - numrolesec;              var msgidx = numsec[selidx] - numrolesec;
             secchoice = prompt("$lt{'this'}\\n"+secpick[msgidx]+"\\n$lt{'avai'} "+roleseclist[selidx],"");              secchoice = prompt("$lt{'this'} "+secpick[msgidx]+"\\n$lt{'avai'} "+roleseclist[selidx],"");
             if (secchoice == '') {              if (secchoice == '') {
                 if (msgidx > 0) {                  if (msgidx > 0) {
                     secok = 1;                      secok = 1;
Line 1763  function retrieveIndex(item) { Line 2114  function retrieveIndex(item) {
     }      }
     return -1;      return -1;
 }  }
   // ]]>
   
 </script>  </script>
 END  END
     return $output;  
 }  }
   
   
Line 1775  END Line 2124  END
   
 BEGIN {  BEGIN {
     if (! defined($readdesk)) {      if (! defined($readdesk)) {
  {          {
     my $tabfile = $Apache::lonnet::perlvar{'lonTabDir'}.'/mydesk.tab';              my $tabfile = $Apache::lonnet::perlvar{'lonTabDir'}.'/mydesk.tab';
     if ( CORE::open( my $config,"<$tabfile") ) {              if ( CORE::open( my $config,"<$tabfile") ) {
  while (my $configline=<$config>) {                  while (my $configline=<$config>) {
     $configline=(split(/\#/,$configline))[0];                      $configline=(split(/\#/,$configline))[0];
     $configline=~s/^\s+//;                      $configline=~s/^\s+//;
     chomp($configline);                      chomp($configline);
                     if ($configline=~/^cat\:/) {                      if ($configline=~/^cat\:/) {
                        my @entries=split(/\:/,$configline);                          my @entries=split(/\:/,$configline);
                        $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) {                      } elsif ($configline=~/^prim\:/) {
  push(@desklines,$configline);                          my @entries = (split(/\:/, $configline))[1..5];
     }                          push @primary_menu, \@entries;
  }                      } elsif ($configline=~/^scnd\:/) {
  CORE::close($config);                          my @entries = (split(/\:/, $configline))[1..5];
     }                          push @secondary_menu, \@entries; 
  }                      } elsif ($configline) {
  $readdesk='done';                          push(@desklines,$configline);
                       }
                   }
                   CORE::close($config);
               }
           }
           $readdesk='done';
     }      }
 }  }
   
 1;  1;
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.269  
changed lines
  Added in v.1.315.2.9


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