Diff for /loncom/interface/lonmenu.pm between versions 1.113 and 1.244.2.12

version 1.113, 2004/08/13 20:12:11 version 1.244.2.12, 2010/01/18 21:35:55
Line 36 Line 36
 # browser.interface is 'textual'  # browser.interface is 'textual'
 #  #
   
   =head1 NAME
   
   Apache::lonmenu
   
   =head1 SYNOPSIS
   
   Coordinates the response to clicking an image.
   
   This is part of the LearningOnline Network with CAPA project
   described at http://www.lon-capa.org.
   
   =head1 SUBROUTINES
   
   =over
   
   =item show_course()
   
   Little texts
   
   =item initlittle()
   
   =item menubuttons()
   
   This gets called at the top of the body section
   
   =item show_return_link()
   
   =item registerurl()
   
   This gets called in the header section
   
   =item innerregister()
   
   This gets called in order to register a URL, both with the Remote
   and 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 switch()
   
   Switch a button or create a link
   Switch acts on the javascript that is executed when a button is clicked.  
   The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".
   
   =item secondlevel()
   
   =item openmenu()
   
   =item inlinemenu()
   
   =item rawconfig()
   
   =item close()
   
   =item footer()
   
   =item utilityfunctions()
   
   =item serverform()
   
   =item constspaceform()
   
   =item get_nav_status()
   
   =item hidden_button_check()
   
   =item roles_selector()
   
   =item jump_to_role()
   
   =back
   
   =cut
   
 package Apache::lonmenu;  package Apache::lonmenu;
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::Constants qw(:common);  
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::loncommon;  use Apache::loncommon();
   use Apache::lonenc();
 use Apache::lonlocal;  use Apache::lonlocal;
   use LONCAPA qw(:DEFAULT :match);
   use HTML::Entities();
   
 use vars qw(@desklines $readdesk);  use vars qw(@desklines %category_names %category_members %category_positions $readdesk);
   
   
 my @inlineremote;  my @inlineremote;
 my $font;  
 my $tabbg;  
 my $pgbg;  
   
 # ================================================================ Little texts  
   
   sub show_course {
       my $course = !$env{'user.adv'};
       if (!$env{'user.adv'}) {
    foreach my $env (keys(%env)) {
       next if ($env !~ m/^user\.priv\./);
       if ($env !~ m/^user\.priv\.(?:st|cm)/) {
    $course = 0;
    last;
       }
    }
       }
       return $course;
   }
   
 sub initlittle {  sub initlittle {
     return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',      return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',
        'nav' => 'Navigate Contents',         'nav' => 'Navigate Contents',
        'main' => 'Main Menu',         'main' => 'Main Menu',
        'launch' => 'Launch Remote Control');                                         'roles' => (&Apache::loncommon::show_course()?
                                                       'Courses':'Roles'),
                                          'other' => 'Other Roles',
                                          'docs' => 'Edit Course',
                                          'exit' => 'Logout',
                                          'login' => 'Log In',
          'launch' => 'Launch Remote Control',
                                          'groups' => 'Groups',
                                          'gdoc' => 'Community Documents',
                                          );
 }  }
   
 # ============================= This gets called at the top of the body section  
   
 sub menubuttons {  sub menubuttons {
     my $forcereg=shift;      my $forcereg=shift;
     my $target  =shift;  
     my $registration=shift;      my $registration=shift;
           my $titletable=shift;
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
     ['inhibitmenu']);      ['inhibitmenu']);
     if ($ENV{'form.inhibitmenu'} eq 'yes') { return ''; }      if (($env{'form.inhibitmenu'} eq 'yes') ||
           ($ENV{'REQUEST_URI'} eq '/adm/logout')) { return ''; }
   
       if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
   
       my %lt=&initlittle();
     my $navmaps='';      my $navmaps='';
     my $reloadlink='';      my $reloadlink='';
     my $escurl=&Apache::lonnet::escape($ENV{'request.noversionuri'});      my $docs='';
     my $escsymb=&Apache::lonnet::escape($ENV{'request.symb'});      my $groups='';
     if ($ENV{'browser.interface'} eq 'textual') {      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 = '<td class="LC_top_nav_logo"><a href="/adm/about.html"><img src="'.
    $logo.'" alt="LON-CAPA Logo" /></a></td>';
   
       if ($env{'request.state'} eq 'construct') {
           if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) {
               my $returnurl = $env{'request.filename'};
               $returnurl =~ s:^/home/([^/]+)/public_html/(.*)$:/priv/$1/$2:;
               $escurl = &escape($returnurl);
           }
       }
       if ($env{'request.course.id'}) {
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my %coursegroups;
           my $viewgrps_permission =
       &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
           if (!$viewgrps_permission) {
               %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum);
    }
           if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) {
               $showgroups = 1;
           }
           $role_selector = &roles_selector($cdom,$cnum);
           if ($role_selector) {
               $roles = '<span class="LC_nobreak">'.$role_selector.'&nbsp;&nbsp;<a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></span>';
           }
       }
   
       if ($env{'browser.interface'} eq 'textual') {
 # Textual display only  # Textual display only
  my %lt=&initlittle();          if ($env{'request.course.id'}) {
         $pgbg='#FFFFFF';  
         $tabbg='#FFFFFF';  
  $font='#000000';  
         if ($ENV{'request.course.id'}) {  
     $navmaps=(<<ENDNAV);      $navmaps=(<<ENDNAV);
 <a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top">$lt{'nav'}</a>  <a href="/adm/navmaps?postdata=$escurl&amp;postsymb=$escsymb" target="_top">$lt{'nav'}</a>
 ENDNAV  ENDNAV
             if (($ENV{'request.noversionuri'}=~/^\/adm\//) &&              if (&show_return_link()) {
          ($ENV{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&                  my $escreload=&escape('return:');
          ($ENV{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) {  
                 my $escreload=&Apache::lonnet::escape('return:');  
                 $reloadlink=(<<ENDRELOAD);                  $reloadlink=(<<ENDRELOAD);
 <a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">$lt{'ret'}</font></a>  <a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a>
 ENDRELOAD  ENDRELOAD
             }              }
         }              my $is_community =
                   (&Apache::loncommon::course_type() eq 'Community');
               if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                   my $text = ($is_community) ? $lt{'gdoc'} : $lt{'docs'};
                   $docs=(<<ENDDOCS);
   <a href="/adm/coursedocs" target="_top">$text</a>
   ENDDOCS
               }
               if ($showgroups) {
                   $groups =(<<ENDGROUPS);
   <a href="/adm/coursegroups" target="_top">$lt{'groups'}</a>
   ENDGROUPS
               }
    }
           my $form=&serverform();
           my $utility=&utilityfunctions();
  my $output=(<<ENDMAINMENU);   my $output=(<<ENDMAINMENU);
 <script>  <script type="text/javascript">
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
   $utility
 </script>  </script>
   <div id="LC_top_nav">
 <a href="/adm/menu" target="_top">$lt{'main'}</a>  <a href="/adm/menu" target="_top">$lt{'main'}</a>
 $reloadlink $navmaps<br />  $reloadlink $navmaps $docs $groups $roles
 <script>  <a href="/adm/logout" target="_top">$lt{'exit'}</a>
   </div>
   <br />
   <script type="text/javascript">
 // END LON-CAPA Internal  // END LON-CAPA Internal
 </script>  </script>
   $form
 ENDMAINMENU  ENDMAINMENU
         if ($registration) { $output.=&innerregister($forcereg,$target); }          if ($registration) { $output.=&innerregister($forcereg); }
  return $output."<hr />";   return $output."<hr />";
     } elsif ($ENV{'environment.remote'} eq 'off') {      } elsif ($env{'environment.remote'} eq 'off') {
 # Remote Control is switched off  # Remote Control is switched off
 # figure out colors  # figure out colors
  my %lt=&initlittle();   my %lt=&initlittle();
  my $function='student';  
         if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) {  
     $function='coordinator';  
         }  
  if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) {  
             $function='admin';  
         }  
         if (($ENV{'request.role'}=~/^(au|ca)/) ||  
             ($ENV{'request.noversionuri'}=~/^(\/priv|\~)/)) {  
             $function='author';  
         }  
         my $domain=&Apache::loncommon::determinedomain();          my $domain=&Apache::loncommon::determinedomain();
         $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);   my $function =&Apache::loncommon::get_users_function();
         $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);  
         $font=&Apache::loncommon::designparm($function.'.font',$domain);  
         my $link=&Apache::loncommon::designparm($function.'.link',$domain);          my $link=&Apache::loncommon::designparm($function.'.link',$domain);
         my $alink=&Apache::loncommon::designparm($function.'.alink',$domain);          my $alink=&Apache::loncommon::designparm($function.'.alink',$domain);
         my $vlink=&Apache::loncommon::designparm($function.'.vlink',$domain);          my $vlink=&Apache::loncommon::designparm($function.'.vlink',$domain);
         my $sidebg=&Apache::loncommon::designparm($function.'.sidebg',$domain);          my $sidebg=&Apache::loncommon::designparm($function.'.sidebg',$domain);
    if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
       return (<<ENDINLINEMENU);
      <table id="LC_top_nav">
       <tr>
         $logo
         <td></td>
         <td class="LC_top_nav_login">
           <a href="/adm/roles" target="_top">$lt{'login'}</a>
        </td>
       </tr>
     </table>
   </font>
   ENDINLINEMENU
           }
           $roles = '<td><a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a></td>';
 # Do we have a NAV link?  # Do we have a NAV link?
         if ($ENV{'request.course.id'}) {          if ($env{'request.course.id'}) {
     $navmaps=(<<ENDNAVREM);      my $link='/adm/navmaps?postdata='.$escurl.'&amp;postsymb='.
 <td bgcolor="$tabbg">   $escsymb;
 <a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top"><font color="$font">$lt{'nav'}</font></a></td>      if ($env{'environment.remotenavmap'} eq 'on') {
 ENDNAVREM   $link="javascript:gonav('".$link."')";
             if (($ENV{'request.noversionuri'}=~/^\/adm\//) &&      }
                 ($ENV{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&      $navmaps=(<<ENDNAV);
          ($ENV{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) {  <td><a href="$link" target="_top">$lt{'nav'}</a></td>
                 my $escreload=&Apache::lonnet::escape('return:');  ENDNAV
               my $is_community =
                   (&Apache::loncommon::course_type() eq 'Community');
       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                   my $text = ($is_community) ? $lt{'gdoc'} : $lt{'docs'};
    $docs=(<<ENDDOCS);
   <td><a href="/adm/coursedocs" target="_top">$text</a></td>
   ENDDOCS
               }
               if ($showgroups) {
                   $groups =(<<ENDGROUPS);
   <td><a href="/adm/coursegroups" target="_top">$lt{'groups'}</a></td>
   ENDGROUPS
               }
       if (&show_return_link()) {
                   my $escreload=&escape('return:');
                 $reloadlink=(<<ENDRELOAD);                  $reloadlink=(<<ENDRELOAD);
 <td bgcolor="$tabbg">  <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>
 <a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">$lt{'ret'}</font></a></td>  
 ENDRELOAD  ENDRELOAD
             }              }
               if ($role_selector) {
                   $roles = '<td>'.$role_selector.'</td><td><a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></td>';
               }
           }
    if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) {
       my $escreload=&escape('return:');
       $reloadlink=(<<ENDCRELOAD);
   <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>
   ENDCRELOAD
         }          }
         my $reg='';          my $reg='';
         if ($registration) {          if ($registration) {
            $reg=&innerregister($forcereg,$target);             $reg=&innerregister($forcereg,$titletable);
         }          }
           my $form=&serverform();
    my $utility=&utilityfunctions();
   
           my $helplink=&Apache::loncommon::top_nav_help('Help');
  return (<<ENDINLINEMENU);   return (<<ENDINLINEMENU);
 <script>  <script type="text/javascript">
   // <![CDATA[
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
   $utility
   // ]]>
 </script>  </script>
 <font face="Arial,Helvetica,sans-serif"><table bgcolor="$pgbg" width="100%" border="0" cellpadding="1" cellspacing="1">  <table id="LC_top_nav">
 <tr>  <tr>
 <td bgcolor="$tabbg">  $logo
 <a href="/adm/menu" target="_top"><font color="$font">$lt{'main'}</font></a>  <td><a href="/adm/menu" target="_top">$lt{'main'}</a></td>
 </td>  
 $reloadlink  $reloadlink
 $navmaps  $navmaps
 <td bgcolor="$tabbg">  $docs
 <a href="/adm/remote?action=launch&url=$escurl" target="_top">  $groups
 <font color="$font">$lt{'launch'}</font></a></td>  $roles
 <td bgcolor="$tabbg">  <td class="LC_top_nav_help">$helplink</td>
 <img align="right" src="/adm/lonIcons/minilogo.gif" />  <td class="LC_top_nav_exit"><a href="/adm/logout" target="_top">$lt{'exit'}</a></td>
 <b>LON-CAPA</b></td>  
 </tr>  </tr>
 </table>  </table>
 </font>  $form
 <script>  <script type="text/javascript">
 // END LON-CAPA Internal  // END LON-CAPA Internal
 </script>  </script>
 $reg  $reg
Line 181  ENDINLINEMENU Line 380  ENDINLINEMENU
     }      }
 }  }
   
 # ====================================== This gets called in the header section  sub show_return_link {
       return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
        $env{'request.symb'} eq '')
       ||
       ($env{'request.noversionuri'}=~ m{^/cgi-bin/printout.pl})
       ||
       (($env{'request.noversionuri'}=~/^\/adm\//) &&
        ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
        ($env{'request.noversionuri'}!~
         m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)])
        ));
   }
   
   
 sub registerurl {  sub registerurl {
     my $forcereg=shift;      my ($forcereg) = @_;
     my $target = shift;  
     my $result = '';      my $result = '';
     if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }      if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
     my $force_title='';      my $force_title='';
     if ($ENV{'request.state'} eq 'construct') {      if ($env{'request.state'} eq 'construct') {
  $force_title=&Apache::lonxml::display_title();   $force_title=&Apache::lonxml::display_title();
     }      }
     if ($target eq 'edit') {      if (($env{'browser.interface'} eq 'textual') ||
         $result .="<script type=\"text/javascript\">\n".          ($env{'environment.remote'} eq 'off') ||
             "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".          ((($env{'request.publicaccess'}) || 
             &Apache::loncommon::browser_and_searcher_javascript().  
                 "\n</script>\n";  
     }  
     if (($ENV{'browser.interface'} eq 'textual') ||  
         ($ENV{'environment.remote'} eq 'off') ||  
         ((($ENV{'request.publicaccess'}) ||   
          (!&Apache::lonnet::is_on_map(           (!&Apache::lonnet::is_on_map(
    &Apache::lonnet::unescape($ENV{'request.noversionuri'})))) &&     &unescape($env{'request.noversionuri'})))) &&
         (!$forcereg))) {          (!$forcereg))) {
   return $result.    return $result.
           '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>'.$force_title;                 '<script type="text/javascript">'."\n".
                  'function LONCAPAreg(){;} function LONCAPAstale(){}'."\n".
                  '</script>'.$force_title;
     }      }
 # Graphical display after login only  # Graphical display after login only
     if ($Apache::lonxml::registered && !$forcereg) { return ''; }      if ($env{'request.registered'} && !$forcereg) { return ''; }
     if ($target ne 'edit') {      $result.=&innerregister($forcereg);
  $result.=&innerregister($forcereg,$target);  
     }  
     return $result.$force_title;      return $result.$force_title;
 }  }
   
 # =========== This gets called in order to register a URL, both with the Remote  
 # =========== and in the body of the document  
   
 sub innerregister {  sub innerregister {
     my $forcereg=shift;      my ($forcereg, $titletable) = @_;
     my $target = shift;  
     my $result = '';      my $result = '';
     if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }      my ($uname,$thisdisfn);
       my $const_space = ($env{'request.state'} eq 'construct');
       my $is_const_dir = 0;
   
     $Apache::lonxml::registered=1;      if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
   
     my $textinter=($ENV{'browser.interface'} eq 'textual');      $env{'request.registered'} = 1;
     my $noremote=($ENV{'environment.remote'} eq 'off');  
       my $textinter=($env{'browser.interface'} eq 'textual');
       my $noremote=($env{'environment.remote'} eq 'off');
           
     my $textual=($textinter || $noremote);      my $textual=($textinter || $noremote);
   
     @inlineremote=();      undef(@inlineremote);
     undef @inlineremote;  
   
     my $reopen=&Apache::lonmenu::reopenmenu();      my $reopen=&Apache::lonmenu::reopenmenu();
   
     my $newmail='';      my $newmail='';
     if ($noremote) {      if ($noremote) {
  $newmail='<font face="Arial,Helvetica,sans-serif"><table bgcolor="'.$pgbg.'" border="0" cellspacing="1" cellpadding="1" width="100%"><tr><td bgcolor="'.$tabbg.'">';   $newmail='<table id="LC_nav_location"><tr>';
     }      }
     if (($textual) && ($ENV{'request.symb'}) && ($ENV{'request.course.id'})) {      if (&Apache::lonmsg::newmail()) { 
  my ($mapurl,$rid,$resurl)=&Apache::lonnet::decode_symb($ENV{'request.symb'});   if ($textual) {
         $newmail.=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};      $newmail.= '<td class="LC_new_mail">
                      <a href="/adm/communicate" target="_top">'.
      &mt('You have new messages').'</a></td>';
    } else {
       $newmail= 'swmenu.setstatus("you have","messages");';
    }
       } 
       if (($textual) 
        && ($env{'request.symb'}) 
        && ($env{'request.course.id'})) {
    $newmail.= '<td class="LC_current_location">';
    my ($mapurl,$rid,$resurl)=
       &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
           my $coursetitle=$env{'course.'.$env{'request.course.id'}.'.description'};
           $newmail.=$coursetitle;
         my $maptitle=&Apache::lonnet::gettitle($mapurl);          my $maptitle=&Apache::lonnet::gettitle($mapurl);
  my $restitle=&Apache::lonnet::gettitle($resurl);   my $restitle=&Apache::lonnet::gettitle(&Apache::lonnet::symbread());
         if ($maptitle) {          if ($maptitle && ($maptitle ne 'default.sequence') && ($maptitle ne $coursetitle)) {
     $newmail.=', '.$maptitle;      $newmail.=', '.$maptitle;
         }          }
         if ($restitle) {          if ($restitle) {
     $newmail.=': '.$restitle;      $newmail.=': '.$restitle;
         }          }
         $newmail.='&nbsp;&nbsp;&nbsp;';          $newmail.='&nbsp;&nbsp;&nbsp;</td>';
     }  
     if (&Apache::lonmsg::newmail()) {   
        $newmail=($textual?  
  '<b><a href="/adm/communicate" target="_top">You have new messages</a></b><br />':  
                           'swmenu.setstatus("you have","messages");');  
     }      }
     if ($noremote) {      if ($env{'request.state'} eq 'construct') {
  $newmail.='</td></tr></table></font>';          $newmail = $titletable;
       } else {
    if ($noremote) {
       $newmail.='</tr></table>';
    }
     }      }
     my $timesync=($textual?'':'swmenu.syncclock(1000*'.time.');');      my $timesync=($textual?'':'swmenu.syncclock(1000*'.time.');');
     my $tablestart=($noremote?'<font face="Arial,Helvetica,sans-serif"><table bgcolor="'.$pgbg.'" border="0" cellspacing="1" cellpadding="1" width="100%">':'').($textinter?'<br /><a href="#content">'.&mt('Skip to Content').'</a><br />':'');      my $tablestart=($noremote?'<table id="LC_menubuttons">':'').
     my $tableend=($noremote?'</table></font>':'').($textinter?'<a name="content" />':'');   ($textinter?'<br /><a href="#content">'.&mt('Skip to Content').'</a><br />':'');
       my $tableend=($noremote?'</table>':'').($textinter?'<a name="content" />':'');
 # =============================================================================  # =============================================================================
 # ============================ This is for URLs that actually can be registered  # ============================ This is for URLs that actually can be registered
     if (($ENV{'request.noversionuri'}!~/^\/(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'}) {
     $crs.='_'.$ENV{'request.course.sec'};      $crs.='_'.$env{'request.course.sec'};
  }   }
  $crs=~s/\_/\//g;   $crs=~s/\_/\//g;
   
         my $hwkadd='';          my $hwkadd='';
         if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {          if ($env{'request.symb'} ne '' &&
     if (&Apache::lonnet::allowed('vgr',$crs)) {      $env{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form|task)$/) {
  $hwkadd.=&switch('','',7,1,'subm.gif','view sub-[_1]','missions[_1]',  
                        "gocmd('/adm/grades','submission')",  
        'View user submissions for this assessment resource');  
             }  
     if (&Apache::lonnet::allowed('mgr',$crs)) {      if (&Apache::lonnet::allowed('mgr',$crs)) {
  $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_3]',   $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_4]',
                        "gocmd('/adm/grades','gradingmenu')",                         "gocmd('/adm/grades','gradingmenu')",
                        'Modify user grades for this assessment resource');                         'Modify user grades for this assessment resource');
               } elsif (&Apache::lonnet::allowed('vgr',$crs)) {
    $hwkadd.=&switch('','',7,2,'subm.gif','view sub-[_1]','missions[_1]',
                          "gocmd('/adm/grades','submission')",
          'View user submissions for this assessment resource');
             }              }
  }   }
  if (&Apache::lonnet::allowed('opa',$crs)) {   if ($env{'request.symb'} ne '' &&
       &Apache::lonnet::allowed('opa',$crs)) {
     $hwkadd.=&switch('','',7,3,'pparm.gif','problem[_2]','parms[_2]',      $hwkadd.=&switch('','',7,3,'pparm.gif','problem[_2]','parms[_2]',
      "gocmd('/adm/parmset','set')",       "gocmd('/adm/parmset','set')",
      'Modify deadlines, etc, for this resource');       'Modify parameter settings for this resource');
  }   }
 # -- End Homework  # -- End Homework
         ###          ###
Line 298  sub innerregister { Line 516  sub innerregister {
         ### resource          ### resource
         ###          ###
         my $editbutton = '';          my $editbutton = '';
         if ($ENV{'user.author'}) {          my $noeditbutton = 1;
             if ($ENV{'request.role'}=~/^(ca|au)/) {          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 ($env{'request.role'}=~/^(aa|ca|au)/) {
                 # 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'}."');";
                 my $cadom  = $ENV{'request.role.domain'};                  my $cadom  = $env{'request.role.domain'};
                 my $caname = $ENV{'user.name'};                  my $caname = $env{'user.name'};
                 my $desc = "Enter my resource construction space";                  my $desc = "Enter my construction space";
                 # Set defaults for co-authors                  # Set defaults for co-authors
                 if ($ENV{'request.role'} =~ /^ca/) {                   if ($env{'request.role'} =~ /^ca/) { 
                     ($cadom,$caname)=($ENV{'request.role'}=~/(\w+)\/(\w+)$/);                      ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);
                     ($top,$bottom) = ('co con-','struct');                      ($top,$bottom) = ('co con-','struct');
                     $action = "go('/priv/".$caname."');";                      $action = "go('/priv/".$caname."');";
                     $desc = "Enter construction space as co-author";                      $desc = "Enter construction space as co-author";
                   } elsif ($env{'request.role'} =~ /^aa/) {
                       ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);
                       ($top,$bottom) = ('co con-','struct');
                       $action = "go('/priv/".$caname."');";
                       $desc = "Enter construction space as assistant co-author";
                 }                  }
                 # Check that we are on the correct machine                  # Check that we are on the correct machine
                 my $home = &Apache::lonnet::homeserver($caname,$cadom);                  my $home = &Apache::lonnet::homeserver($caname,$cadom);
Line 320  sub innerregister { Line 549  sub innerregister {
  foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }   foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
  if (!$allowed) {   if (!$allowed) {
     $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc);      $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc);
                       $noeditbutton = 0;
                 }                  }
             }              }
             ##              ##
Line 328  sub innerregister { Line 558  sub innerregister {
             my $cfile='';              my $cfile='';
             my $cfuname='';              my $cfuname='';
             my $cfudom='';              my $cfudom='';
             if ($ENV{'request.filename'}) {              my $uploaded;
                 my $file=&Apache::lonnet::declutter($ENV{'request.filename'});              if ($env{'request.filename'}) {
                 $file=~s/^(\w+)\/(\w+)/\/priv\/$2/;                  my $file=&Apache::lonnet::declutter($env{'request.filename'});
                   $file=~s/^($match_domain)\/($match_username)/\/priv\/$2/;
                 # 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)) {
Line 344  sub innerregister { Line 575  sub innerregister {
                 }                  }
             }                      }        
             # Finally, turn the button on or off              # Finally, turn the button on or off
             if ($cfile) {              if ($cfile && !$const_space) {
                 $editbutton=&switch                  $editbutton=&switch
                     ('','',6,1,'cstr.gif','edit[_1]','resource[_2]',                      ('','',6,1,'pcstr.gif','edit[_1]','resource[_2]',
                      "go('".$cfile."');","Edit this resource");                       "go('".$cfile."');","Edit this resource");
                   $noeditbutton = 0;
             } elsif ($editbutton eq '') {              } elsif ($editbutton eq '') {
                 $editbutton=&clear(6,1);                  $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.gif','edit[_1]',
                                            'resource[_2]',"go('".$cfile."');",
                                            'Edit this resource');
                           }
                       }
                   }
               }
           }
         ###          ###
         ###          ###
 # Prepare the rest of the buttons  # Prepare the rest of the buttons
  my $menuitems=(<<ENDMENUITEMS);          my $menuitems;
           if ($const_space) {
       my ($uname,$thisdisfn) =
    ($env{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|);
               my $currdir = '/priv/'.$uname.'/'.$thisdisfn;
               if ($currdir =~ m-/$-) {
                   $is_const_dir = 1;
               } else {
                   $currdir =~ s#[^/]+$##;
    my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn);
    my $esc_currdir = &Apache::loncommon::escape_single($currdir);
                   $menuitems=(<<ENDMENUITEMS);
   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&3&pub.gif&publish[_1]&resource[_3]&gocstr('/adm/publish','/~$uname/$cleandisfn')&Publish this resource
   s&7&1&del.gif&delete[_1]&resource[_2]&gocstr('/adm/cfile?action=delete','/~$uname/$cleandisfn')&Delete this resource
   s&7&2&prt.gif&prepare[_1]&printout[_1]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document
   ENDMENUITEMS
               }
           } elsif ( defined($env{'request.course.id'}) && 
    $env{'request.symb'} ne '' ) {
       $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
 s&2&3&forw.gif&forward[_1]&&gopost('/adm/flip','forward:'+currentURL)&Go to the next resource in the course sequence&3  s&2&3&forw.gif&forward[_1]&&gopost('/adm/flip','forward:'+currentURL)&Go to the next resource in the course sequence&&3
 c&6&3  c&6&3
 c&8&1  c&8&1
 c&8&2  c&8&2
 s&8&3&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document  s&8&3&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
 s&9&1&sbkm.gif&set[_1]&bookmark[_2]&set_bookmark()&Set a bookmark for this resource&2  s&9&1&sbkm.gif&set[_1]&bookmark[_2]&set_bookmark()&Set a bookmark for this resource&&1
 s&9&3&anot.gif&anno-[_1]&tations[_1]&annotate()&Make notes and annotations about this resource&2  
 ENDMENUITEMS  ENDMENUITEMS
         unless ($ENV{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) {  
     $menuitems.=(<<ENDREALRES);  my $currentURL = &Apache::loncommon::get_symb();
 s&6&3&catalog.gif&catalog[_1]&info[_1]&catalog_info()&Show catalog information  my ($symb_old,$symb_old_enc) = &Apache::loncommon::clean_symb($currentURL);
   my $annotation = &Apache::loncommon::get_annotation($symb_old,$symb_old_enc);
   $menuitems.="s&9&3&";
   if(length($annotation) > 0){
    $menuitems.="anot2.gif";
   }else{
    $menuitems.="anot.gif";
   }
   $menuitems.="&anno-[_1]&tations[_1]&annotate()&";
   $menuitems.="Make notes and annotations about this resource&&1\n";
   
               unless ($noremote) {
                   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)(\?|$)/) {
                   if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) {
       $menuitems.=(<<ENDREALRES);
   s&6&3&catalog.gif&catalog[_2]&info[_1]&catalog_info()&Show Metadata
   ENDREALRES
                   }
           $menuitems.=(<<ENDREALRES);
 s&8&1&eval.gif&evaluate[_1]&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource  s&8&1&eval.gif&evaluate[_1]&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
 s&8&2&fdbk.gif&feedback[_1]&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource  s&8&2&fdbk.gif&feedback[_1]&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/) {
       $menuitems .= (<<ENDMENUITEMS);
   s&8&3&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
   ENDMENUITEMS
  }   }
         my $buttons='';          my $buttons='';
         foreach (split(/\n/,$menuitems)) {          foreach (split(/\n/,$menuitems)) {
     my ($command,@rest)=split(/\&/,$_);      my ($command,@rest)=split(/\&/,$_);
             if ($command eq 's') {              my $idx=10*$rest[0]+$rest[1];
  $buttons.=&switch('','',@rest);              if (&hidden_button_check() eq 'yes') {
             } else {                  if ($idx == 21 ||$idx == 23) {
                 $buttons.=&clear(@rest);                      $buttons.=&switch('','',@rest);
                   } else {
                       $buttons.=&clear(@rest);
                   }
               } else {  
                   if ($command eq 's') {
               $buttons.=&switch('','',@rest);
                   } else {
                       $buttons.=&clear(@rest);
                   }
             }              }
         }          }
   
         if ($textual) {          if ($textual) {
 # Registered, textual output      my $addremote=0;
             my $utility=&utilityfunctions();      foreach (@inlineremote) { if ($_ ne '') { $addremote=1; } }
             my $form=&serverform();  
     my $inlinebuttons='';      my $inlinebuttons='';
       if ($addremote) {
     if ($ENV{'browser.interface'} eq 'textual') {  # Registered, textual output
  $inlinebuttons=   if ($env{'browser.interface'} eq 'textual') {
       $inlinebuttons=
                         join('',map { (defined($_)?$_:'') } @inlineremote);                          join('',map { (defined($_)?$_:'') } @inlineremote);
     } else {   } else {
  $inlinebuttons=(<<ENDINLINE);                      if ($env{'environment.icons'} eq 'iconsonly') {
 <tr><td>$inlineremote[21]</td><td>&nbsp</td><td>$inlineremote[23]</td></tr>                          $inlinebuttons=(<<ENDARROWSINLINE);
 <tr><td>$inlineremote[61]</td><td>$inlineremote[62]</td><td>$inlineremote[63]</td></tr>  <tr><td>
 <tr><td>$inlineremote[71]</td><td>$inlineremote[72]</td><td>$inlineremote[73]</td></tr>  $inlineremote[21] $inlineremote[23]
 <tr><td>$inlineremote[81]</td><td>$inlineremote[82]</td><td>$inlineremote[83]</td></tr>  ENDARROWSINLINE
 <tr><td>$inlineremote[91]</td><td>$inlineremote[92]</td><td>$inlineremote[93]</td></tr>                          if (&hidden_button_check() ne 'yes') {
 ENDINLINE                              $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 {
    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
    }
       }
    }
       }
    }
     }      }
     $result =(<<ENDREGTEXT);      $result =(<<ENDREGTEXT);
 <script>  <script type="text/javascript">
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
 $utility  
 </script>  </script>
 $timesync  $timesync
 $newmail  
 $tablestart  $tablestart
 $inlinebuttons  $inlinebuttons
 $tableend  $tableend
 $form  $newmail
 <script>  <script type="text/javascript">
 // END LON-CAPA Internal  // END LON-CAPA Internal
 </script>  </script>
   
 ENDREGTEXT  ENDREGTEXT
 # Registered, graphical output  # Registered, graphical output
         } else {          } else {
     my $requri=(split(/\?/,$ENV{'request.noversionuri'}))[0];      my $requri=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
     $requri=&Apache::lonnet::unescape($requri);      $requri=&Apache::lonenc::check_encrypt(&unescape($requri));
       my $cursymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
     my $navstatus=&get_nav_status();      my $navstatus=&get_nav_status();
       my $clearcstr;
   
       if ($env{'user.adv'}) { $clearcstr='clearbut(6,1)'; }
     $result = (<<ENDREGTHIS);      $result = (<<ENDREGTHIS);
             
 <script language="JavaScript">  <script type="text/javascript">
   // <![CDATA[
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
 var swmenu=null;  var swmenu=null;
   
Line 435  var swmenu=null; Line 771  var swmenu=null;
           $buttons            $buttons
   swmenu.currentURL="$requri";    swmenu.currentURL="$requri";
           swmenu.reloadURL=swmenu.currentURL+window.location.search;            swmenu.reloadURL=swmenu.currentURL+window.location.search;
           swmenu.currentSymb="$ENV{'request.symb'}";            swmenu.currentSymb="$cursymb";
           swmenu.reloadSymb="$ENV{'request.symb'}";            swmenu.reloadSymb="$cursymb";
           swmenu.currentStale=0;            swmenu.currentStale=0;
   $navstatus    $navstatus
           $hwkadd            $hwkadd
Line 450  var swmenu=null; Line 786  var swmenu=null;
              swmenu.switchbutton               swmenu.switchbutton
              (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');               (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');
   }    }
           swmenu.clearbut(7,1);  
           swmenu.clearbut(7,2);            swmenu.clearbut(7,2);
           swmenu.clearbut(7,3);            swmenu.clearbut(7,3);
           swmenu.menucltim=swmenu.setTimeout(            swmenu.menucltim=swmenu.setTimeout(
  'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+   'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
  'clearbut(9,1);clearbut(9,3);clearbut(6,3);clearbut(6,1)',   'clearbut(9,1);clearbut(9,3);clearbut(6,3);$clearcstr',
   2000);    2000);
       }        }
   
 // END LON-CAPA Internal  // END LON-CAPA Internal 
   // ]]>
 </script>  </script>
 ENDREGTHIS  ENDREGTHIS
         }          }
Line 474  ENDDONOTREGTEXT Line 810  ENDDONOTREGTEXT
 # Not registered, graphical  # Not registered, graphical
            $result = (<<ENDDONOTREGTHIS);             $result = (<<ENDDONOTREGTHIS);
   
 <script language="JavaScript">  <script type="text/javascript">
   // <![CDATA[
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
 var swmenu=null;  var swmenu=null;
   
Line 499  var swmenu=null; Line 836  var swmenu=null;
     }      }
   
 // END LON-CAPA Internal  // END LON-CAPA Internal
   // ]]>
 </script>  </script>
 ENDDONOTREGTHIS  ENDDONOTREGTHIS
        }         }
Line 507  ENDDONOTREGTHIS Line 845  ENDDONOTREGTHIS
     return $result;      return $result;
 }  }
   
   sub is_course_upload {
       my ($file,$cnum,$cdom) = @_;
       my $uploadpath = &LONCAPA::propath($cdom,$cnum);
       $uploadpath =~ s{^\/}{};
       if (($file =~ m{^\Q$uploadpath\E/userfiles/docs/}) ||
           ($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/docs/})) {
           return 1;
       }
       return;
   }
   
   sub edit_course_upload {
       my ($file,$cnum,$cdom) = @_;
       my $cfile;
       if ($file =~/\.(htm|html|css|js|txt)$/) {
           my $ext = $1;
           my $url = &Apache::lonnet::hreflocation('',$file);
           my $home = &Apache::lonnet::homeserver($cnum,$cdom);
           my @ids=&Apache::lonnet::current_machine_ids();
           my $dest;
           if ($home && grep(/^\Q$home\E$/,@ids)) {
               $dest = $url.'?forceedit=1';
           } else {
               unless (&Apache::lonnet::get_locks()) {
                   $dest = '/adm/switchserver?otherserver='.
                           $home.'&role='.$env{'request.role'}.
                           '&url='.$url.'&forceedit=1';
               }
           }
           if ($dest) {
               $cfile = &HTML::Entities::encode($dest,'"<>&');
           }
       }
       return $cfile;
   }
   
 sub loadevents() {  sub loadevents() {
     if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }      if ($env{'request.state'} eq 'construct' ||
    $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
     return 'LONCAPAreg();';      return 'LONCAPAreg();';
 }  }
   
 sub unloadevents() {  sub unloadevents() {
     if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }      if ($env{'request.state'} eq 'construct' ||
    $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
     return 'LONCAPAstale();';      return 'LONCAPAstale();';
 }  }
   
 # ============================================================= Start up remote  
   
 sub startupremote {  sub startupremote {
     my ($lowerurl)=@_;      my ($lowerurl)=@_;
     if (($ENV{'browser.interface'} eq 'textual') ||      if (($env{'browser.interface'} eq 'textual') ||
         ($ENV{'environment.remote'} eq 'off')) {          ($env{'environment.remote'} eq 'off')) {
      return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');       return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');
     }      }
 #  #
 # The Remote actually gets launched!  # The Remote actually gets launched!
 #  #
     my $configmenu=&rawconfig();      my $configmenu=&rawconfig();
     my $esclowerurl=&Apache::lonnet::escape($lowerurl);      my $esclowerurl=&escape($lowerurl);
       my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited');
     return(<<ENDREMOTESTARTUP);      return(<<ENDREMOTESTARTUP);
 <script>  <script type="text/javascript">
   // <![CDATA[
   var timestart;
 function wheelswitch() {  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=='|') {      if (window.status=='|') { 
       window.status='/';         window.status='/'; 
    } else {     } else {
Line 571  function wait() { Line 954  function wait() {
 function main() {  function main() {
    canceltim=setTimeout('tim=1;',30000);     canceltim=setTimeout('tim=1;',30000);
    window.status='-';     window.status='-';
      var date=new Date();
      timestart=date.getTime();
    wait();     wait();
 }  }
   // ]]>
 </script>  </script>
 ENDREMOTESTARTUP  ENDREMOTESTARTUP
 }  }
   
 sub setflags() {  sub setflags() {
     return(<<ENDSETFLAGS);      return(<<ENDSETFLAGS);
 <script>  <script type="text/javascript">
   // <![CDATA[
     menuloaded=0;      menuloaded=0;
     tim=0;      tim=0;
   // ]]>
 </script>  </script>
 ENDSETFLAGS  ENDSETFLAGS
 }  }
   
 sub maincall() {  sub maincall() {
     if (($ENV{'browser.interface'} eq 'textual') ||      if (($env{'browser.interface'} eq 'textual') ||
         ($ENV{'environment.remote'} eq 'off')) { return ''; }          ($env{'environment.remote'} eq 'off')) { return ''; }
     return(<<ENDMAINCALL);      return(<<ENDMAINCALL);
 <script>  <script type="text/javascript">
   // <![CDATA[
     main();      main();
   // ]]>
 </script>  </script>
 ENDMAINCALL  ENDMAINCALL
 }  }
 # ================================================================= Reopen menu  
   sub load_remote_msg {
       my ($lowerurl)=@_;
   
       if (($env{'browser.interface'} eq 'textual') ||
           ($env{'environment.remote'} eq 'off')) { 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 {  sub reopenmenu {
    if (($ENV{'browser.interface'} eq 'textual') ||     if (($env{'browser.interface'} eq 'textual') ||
        ($ENV{'environment.remote'} eq 'off')) { return ''; }         ($env{'environment.remote'} eq 'off')) { return ''; }
    my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};     my $menuname = &get_menu_name();
    my $nothing = &Apache::lonhtmlcommon::javascript_nothing();     my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
    return('window.open('.$nothing.',"'.$menuname.'","",false);');     return('window.open('.$nothing.',"'.$menuname.'","",false);');
 }   } 
   
 # =============================================================== Open the menu  
   
 sub open {  sub open {
     my $returnval='';      my $returnval='';
     if (($ENV{'browser.interface'} eq 'textual') ||      if (($env{'browser.interface'} eq 'textual') ||
         ($ENV{'environment.remote'} eq 'off')) {           ($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='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};      my $menuname = &get_menu_name();
     unless (shift eq 'unix') {      
   #    unless (shift eq 'unix') {
 # resizing does not work on linux because of virtual desktop sizes  # resizing does not work on linux because of virtual desktop sizes
        $returnval.=(<<ENDRESIZE);  #       $returnval.=(<<ENDRESIZE);
 if (window.screen) {  #if (window.screen) {
     self.resizeTo(screen.availWidth-215,screen.availHeight-55);  #    self.resizeTo(screen.availWidth-215,screen.availHeight-55);
     self.moveTo(190,15);  #    self.moveTo(190,15);
 }  #}
 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","$menuname",
 "height=350,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>'.$returnval.'</script>';      return '<script type="text/javascript">'.$returnval.'</script>';
 }  }
   
   
Line 638  ENDOPEN Line 1060  ENDOPEN
   
 sub clear {  sub clear {
     my ($row,$col)=@_;      my ($row,$col)=@_;
     unless (($ENV{'browser.interface'} eq 'textual') ||      unless (($env{'browser.interface'} eq 'textual') ||
             ($ENV{'environment.remote'} eq 'off')) {              ($env{'environment.remote'} eq 'off')) {
        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 652  sub clear { Line 1074  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,$nobreak)=@_;      my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak)=@_;
     $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);
     $bot=&mt($bot);      $bot=&mt($bot);
     $desc=&mt($desc);      $desc=&mt($desc);
     $img=&mt($img);      if (($env{'environment.remote'} ne 'off') || ($env{'environment.icons'} eq 'classic')) {
     unless (($ENV{'browser.interface'} eq 'textual')  ||         $img=&mt($img);
             ($ENV{'environment.remote'} eq 'off')) {      }
       my $idx=10*$row+$col;
       $category_members{$cat}.=':'.$idx;
   
       unless (($env{'browser.interface'} eq 'textual')  ||
               ($env{'environment.remote'} eq 'off')) {
 # 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"););
    } elsif ($ENV{'browser.interface'} eq 'textual') {     } elsif ($env{'browser.interface'} eq 'textual') {
 # Accessibility  # Accessibility
        if ($nobreak==2) { return ''; }         if ($nobreak==2) { return ''; }
        my $text=$top.' '.$bot;         my $text=$top.' '.$bot;
        $text=~s/\s*\-\s*//gs;         $text=~s/\s*\-\s*//gs;
        if ($nobreak) {         if ($nobreak) {
    $inlineremote[10*$row+$col]=     $inlineremote[$idx]=
        '<a href="javascript:'.$act.';">'.$text.'</a>';         '<a href="javascript:'.$act.';">'.$text.'</a>';
        } else {         } else {
    $inlineremote[10*$row+$col]="\n<br />".     $inlineremote[$idx]="\n<br />".
        $desc.' <a href="javascript:'.$act.';">'.$text.'</a>';         $desc.' <a href="javascript:'.$act.';">'.$text.'</a>';
        }         }
    } else {     } else {
 # Inline Remote  # Inline Remote
          if ($env{'environment.icons'} ne 'classic') {
             $img=~s/\.gif$/\.png/;
          }
        if ($nobreak==2) { return ''; }         if ($nobreak==2) { return ''; }
        my $text=$top.' '.$bot;         my $text=$top.' '.$bot;
        $text=~s/\s*\-\s*//gs;         $text=~s/\s*\-\s*//gs;
   
        my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'};  
        if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; }  
        my $pic=         my $pic=
    '<img border="0" alt="'.$text.'" src="http://'.$ENV{'HTTP_HOST'}.     '<img alt="'.$text.'" src="'.
    ':'.$lonhttpdPort.'/res/adm/pages/'.$img.'" align="'.     &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).
    ($nobreak==3?'right':'left').'" />';     '" align="'.($nobreak==3?'right':'left').'" />';
        if (($ENV{'browser.interface'} eq 'textual') || ($ENV{'browser.interface'} eq 'faketextual')) {         if ($env{'browser.interface'} eq 'faketextual') {
 # Accessibility  # Accessibility
    if ($nobreak==3) {     if ($nobreak==3) {
        $inlineremote[10*$row+$col]="\n".         $inlineremote[$idx]="\n".
    '<td width="40%" align="right"><font color="'.$font.'" size="+1">'.$text.     '<td class="LC_menubuttons_text" align="right">'.$text.
    '</font></td><td width="10%" align="right" bgcolor="'.$tabbg.'">'.     '</td><td class="LC_menubuttons_img" align="left">'.
    '<a href="javascript:'.$act.';">'.$pic.'</a></td></tr>';     '<a href="javascript:'.$act.';">'.$pic.'</a></td></tr>';
    } elsif ($nobreak) {     } elsif ($nobreak) {
        $inlineremote[10*$row+$col]="\n<tr>".         $inlineremote[$idx]="\n<tr>".
    '<td width="10%" align="left" bgcolor="'.$tabbg.'">'.     '<td class="LC_menubuttons_img" align="left">'.
    '<a href="javascript:'.$act.';">'.$pic.     '<a href="javascript:'.$act.';">'.$pic.'</a></td>
    '</a></td><td width="40%" align="left"><font color="'.$font.'" size="+1">'.$text.'</font></td>';                      <td class="LC_menubuttons_text" align="left"><a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$text.'</span></a></td>';
    } else {     } else {
        $inlineremote[10*$row+$col]="\n<tr>".         $inlineremote[$idx]="\n<tr>".
    '<td width="10%" align="left" bgcolor="'.$tabbg.'">'.     '<td class="LC_menubuttons_img" align="left">'.
    '<a href="javascript:'.$act.';">'.$pic.     '<a href="javascript:'.$act.';">'.$pic.
    '</a></td><td colspan="3"><font color="'.$font.'">'.$desc.     '</a></td><td class="LC_menubuttons_text" colspan="3">'.
    '</font></td></tr>';            '<a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$desc.'</span></a></td></tr>';
    }     }
        } else {         } else {
 # Inline Menu  # Inline Menu
    $inlineremote[10*$row+$col]=             if ($env{'environment.icons'} eq 'iconsonly') {
    '<a href="javascript:'.$act.';">'.$pic.                $inlineremote[$idx]='<a title="'.$desc.'" href="javascript:'.$act.';">'.$pic.'</a>';
    '</a><font color="'.$font.'" size="2">'.$desc.             } else {
    '</font>';        $inlineremote[$idx]=
      '<a class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.
      '<span class="LC_menubuttons_inline_text">'.$desc.'</span></a>';
              }
        }         }
    }     }
     return '';      return '';
Line 721  sub switch { Line 1152  sub switch {
 sub secondlevel {  sub secondlevel {
     my $output='';      my $output='';
     my       my 
     ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc)=@_;      ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat)=@_;
     if ($prt eq 'any') {      if ($prt eq 'any') {
    $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);     $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
     } elsif ($prt=~/^r(\w+)/) {      } elsif ($prt=~/^r(\w+)/) {
         if ($rol eq $1) {          if ($rol eq $1) {
            $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);             $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
         }          }
     }      }
     return $output;      return $output;
 }  }
   
 sub openmenu {  sub openmenu {
     my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};      my $menuname = &get_menu_name();
     if (($ENV{'browser.interface'} eq 'textual') ||      if (($env{'browser.interface'} eq 'textual') ||
         ($ENV{'environment.remote'} eq 'off')) { return ''; }          ($env{'environment.remote'} eq 'off')) { return ''; }
     my $nothing = &Apache::lonhtmlcommon::javascript_nothing();      my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
     return "window.open(".$nothing.",'".$menuname."');";      return "window.open(".$nothing.",'".$menuname."');";
 }  }
   
 sub inlinemenu {  sub inlinemenu {
     @inlineremote=();      undef(@inlineremote);
     undef @inlineremote;      undef(%category_members);
     &rawconfig(1);      &rawconfig(1);
     return join('',map { (defined($_)?$_:'') } @inlineremote);      my $output='<table id="LC_mainmenu"><tr>';
       for (my $col=1; $col<=2; $col++) {
           $output.='<td class="LC_mainmenu_col_fieldset">';
           for (my $row=1; $row<=8; $row++) {
               foreach my $cat (keys(%category_members)) {
                  if ($category_positions{$cat} ne "$col,$row") { next; }
                  #$output.='<table id="LC_menubuttons_mainmenu"><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';
                  $output.='<fieldset id="LC_mainmenu_fieldset">';
          $output.='<legend class="LC_mainmenu_fieldset_category">'.&mt($category_names{$cat}).'</legend>';
                  $output.='<table id="LC_menubuttons_mainmenu">';
                  my %active=();
                  foreach my $menu_item (split(/\:/,$category_members{$cat})) {
                     if ($inlineremote[$menu_item]) {
                        $active{$menu_item}=1;
                     }
                  }  
                  foreach my $item (sort(keys(%active))) {
                     $output.=$inlineremote[$item];
                  }
                  $output.='</table>';
                  $output.='</fieldset>';
               }
            }
            $output.="</td>";
       }
       $output.="</tr></table>";
       return $output;
 }  }
   
 sub rawconfig {  sub rawconfig {
     my $textualoverride=shift;      my $textualoverride=shift;
     my $output='';      my $output='';
     unless (($ENV{'browser.interface'} eq 'textual') ||      unless (($env{'browser.interface'} eq 'textual') ||
             ($ENV{'environment.remote'} eq 'off')) {              ($env{'environment.remote'} eq 'off')) {
        $output.=         $output.=
  "window.status='Opening Remote Control';var swmenu=".&openmenu().   "window.status='Opening Remote Control';var swmenu=".&openmenu().
 "\nwindow.status='Configuring Remote Control ';";  "\nwindow.status='Configuring Remote Control ';";
     } else {      } else {
        unless ($textualoverride) { return ''; }         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'};
     my $author=$ENV{'user.author'};      my $show_course=&Apache::loncommon::show_course();
       my $author=$env{'user.author'};
     my $crs='';      my $crs='';
     if ($ENV{'request.course.id'}) {      my $crstype='';
        $crs='/'.$ENV{'request.course.id'};      if ($env{'request.course.id'}) {
        if ($ENV{'request.course.sec'}) {         $crs='/'.$env{'request.course.id'};
    $crs.='_'.$ENV{'request.course.sec'};         if ($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');
     my $rol=$ENV{'request.role'};      my $rol=$env{'request.role'};
     my $requested_domain = $ENV{'request.role.domain'};      my $requested_domain = $env{'request.role.domain'};
     foreach (@desklines) {      foreach my $line (@desklines) {
         my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc)=split(/\:/,$_);          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;           $prt=~s/\$crs/$crs/g;
           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 ($pro eq 'clear') {          if ($pro eq 'clear') {
     $output.=&clear($row,$col);      $output.=&clear($row,$col);
         } elsif ($pro eq 'any') {          } elsif ($pro eq 'any') {
                $output.=&secondlevel(                 $output.=&secondlevel(
   $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc);    $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
  } elsif ($pro eq 'smp') {   } elsif ($pro eq 'smp') {
             unless ($adv) {              unless ($adv) {
                $output.=&secondlevel(                 $output.=&secondlevel(
           $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc);            $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
             }              }
         } elsif ($pro eq 'adv') {          } elsif ($pro eq 'adv') {
             if ($adv) {              if ($adv) {
                $output.=&secondlevel(                 $output.=&secondlevel(
   $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc);    $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
               }
    } elsif ($pro eq 'shc') {
               if ($show_course) {
                  $output.=&secondlevel(
             $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
               }
           } elsif ($pro eq 'nsc') {
               if (!$show_course) {
                  $output.=&secondlevel(
     $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;
                $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);              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);
               }
           } elsif ($pro eq 'course')  {
               if (($env{'request.course.fn'}) && ($crstype ne 'Community')) {
                  $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_(.*)$/) {
               my $key = $1;
               if ($crstype ne '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 =~ /^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 eq 'course') {  
             if ($ENV{'request.course.fn'}) {  
                $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);  
     }  
         } 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);                  $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/)) ||
                     (($prt eq 'rau') && ($ENV{'request.role'}=~/^au/))) {                      (($prt eq 'raa') && ($env{'request.role'}=~/^aa/)) || 
                       (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) {
                     # Check that we are on the correct machine                      # Check that we are on the correct machine
                     my $cadom=$requested_domain;                      my $cadom=$requested_domain;
                     my $caname=$ENV{'user.name'};                      my $caname=$env{'user.name'};
                     if ($prt eq 'rca') {                      if (($prt eq 'rca') || ($prt eq 'raa')) {
        ($cadom,$caname)=         ($cadom,$caname)=
                                ($ENV{'request.role'}=~/(\w+)\/(\w+)$/);                                 ($env{'request.role'}=~/($match_domain)\/($match_username)$/);
                     }                                             }                       
                     $act =~ s/\$caname/$caname/g;                      $act =~ s/\$caname/$caname/g;
                     my $home = &Apache::lonnet::homeserver($caname,$cadom);                      my $home = &Apache::lonnet::homeserver($caname,$cadom);
Line 828  sub rawconfig { Line 1357  sub rawconfig {
     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) {
                         $output.=switch($caname,$cadom,                          $output.=&switch($caname,$cadom,
                                         $row,$col,$img,$top,$bot,$act,$desc);                                          $row,$col,$img,$top,$bot,$act,$desc,$cat);
                     }                      }
                 }                  }
             }              }
           } elsif ($pro eq 'tools') {
               my @tools = ('aboutme','blog','portfolio');
               if (grep(/^\Q$prt\E$/,@tools)) {
                   if (!&Apache::lonnet::usertools_access($env{'user.name'},
                                                          $env{'user.domain'},
                                                          $prt,undef,'tools')) {
                       $output.=&clear($row,$col);
                       next;
                   }
               } elsif (($prt eq 'reqcrsnsc') || ($prt eq 'reqcrsshc')) {
                   if (($prt eq 'reqcrsnsc') && ($show_course))   {
                       next;
                   }
                   if (($prt eq 'reqcrsshc') && (!$show_course)) {
                       next;
                   }
                   my $showreqcrs = &check_for_rcrs();
                   if (!$showreqcrs) {
                       $output.=&clear($row,$col);
                       next;
                   }
               }
               $prt='any';
               $output.=&secondlevel(
             $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
   
         }          }
     }      }
     unless (($ENV{'browser.interface'} eq 'textual') ||      unless (($env{'browser.interface'} eq 'textual') ||
             ($ENV{'environment.remote'} eq 'off')) {              ($env{'environment.remote'} eq 'off')) {
        $output.="\nwindow.status='Synchronizing Time';swmenu.syncclock(1000*".time.");\nwindow.status='Remote Control Configured.';";         $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;
 }  }
   
   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 {
     if (($ENV{'browser.interface'} eq 'textual') ||      if (($env{'browser.interface'} eq 'textual') ||
         ($ENV{'environment.remote'} eq 'off')) { return ''; }          ($env{'environment.remote'} eq 'off')) { return ''; }
     my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};      my $menuname = &get_menu_name();
     return(<<ENDCLOSE);      return(<<ENDCLOSE);
 <script>  <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 859  menu.autologout=0; Line 1441  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 869  sub footer { Line 1452  sub footer {
   
 }  }
   
   sub nav_control_js {
       my $nav=($env{'environment.remotenavmap'} eq 'on');
       return (<<NAVCONTROL);
       var w_loncapanav_flag="$nav";
   
   
   function gonav(url) {
      if (w_loncapanav_flag != 1) {
         gopost(url,'');
      }  else {
         navwindow=window.open(url,
                     "loncapanav","height=600,width=400,scrollbars=1"); 
      }
   }
   NAVCONTROL
   }
   
 sub utilityfunctions {  sub utilityfunctions {
     unless (($ENV{'browser.interface'} eq 'textual')  ||      my $caller = shift;
         ($ENV{'environment.remote'} eq 'off')) { return ''; }      unless (($env{'browser.interface'} eq 'textual')  ||
     my $currenturl=$ENV{'request.noversionuri'};          ($env{'environment.remote'} eq 'off') || ($caller eq '/adm/menu')) { return ''; }
     my $currentsymb=$ENV{'request.symb'};      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));
       
       my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
       my $nav_control=&nav_control_js();
   
       my $start_page_annotate = 
           &Apache::loncommon::start_page('Annotator',undef,
          {'only_body' => 1,
    'js_ready'  => 1,
    'bgcolor'   => '#BBBBBB',
    'add_entries' => {
       'onload' => 'javascript:document.goannotate.submit();'}});
   
       my $end_page_annotate = 
           &Apache::loncommon::end_page({'js_ready' => 1});
   
       my $start_page_bookmark = 
           &Apache::loncommon::start_page('Bookmarks',undef,
          {'only_body' => 1,
    'js_ready'  => 1,
    'bgcolor'   => '#BBBBBB',});
   
       my $end_page_bookmark = 
           &Apache::loncommon::end_page({'js_ready' => 1});
   
 return (<<ENDUTILITY)  return (<<ENDUTILITY)
   
     var currentURL="$currenturl";      var currentURL="$currenturl";
     var reloadURL="$currenturl";      var reloadURL="$currenturl";
     var currentSymb="$currentsymb";      var currentSymb="$currentsymb";
   
   $nav_control
   
 function go(url) {  function go(url) {
    if (url!='' && url!= null) {     if (url!='' && url!= null) {
        currentURL = null;         currentURL = null;
Line 910  function gocmd(url,cmd) { Line 1542  function gocmd(url,cmd) {
    }     }
 }  }
   
   function gocstr(url,filename) {
       if (url == '/adm/cfile?action=delete') {
           this.document.cstrdelete.filename.value = filename
           this.document.cstrdelete.submit();
           return;
       }
       if (url == '/adm/printout') {
           this.document.cstrprint.postdata.value = filename
           this.document.cstrprint.curseed.value = 0;
           this.document.cstrprint.problemtype.value = 0;
           if (this.document.lonhomework) {
               if ((this.document.lonhomework.rndseed) && (this.document.lonhomework.rndseed.value != null) && (this.document.lonhomework.rndseed.value != '')) {
                   this.document.cstrprint.curseed.value = this.document.lonhomework.rndseed.value
               }
               if (this.document.lonhomework.problemtype) {
    if (this.document.lonhomework.problemtype.value) {
       this.document.cstrprint.problemtype.value = 
    this.document.lonhomework.problemtype.value;
    } else if (this.document.lonhomework.problemtype.options) {
       for (var i=0; i<this.document.lonhomework.problemtype.options.length; i++) {
    if (this.document.lonhomework.problemtype.options[i].selected) {
       if (this.document.lonhomework.problemtype.options[i].value != null && this.document.lonhomework.problemtype.options[i].value != '') { 
    this.document.cstrprint.problemtype.value = this.document.lonhomework.problemtype.options[i].value
    }
    }
       }
    }
       }
    }
           this.document.cstrprint.submit();
           return;
       }
       if (url !='') {
           this.document.constspace.filename.value = filename;
           this.document.constspace.action = url;
           this.document.constspace.submit();
       }
   }
   
   function golist(url) {
      if (url!='' && url!= null) {
          currentURL = null;
          currentSymb= null;
          top.location.href=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');     loncatinfo=window.open(window.location.pathname+'.meta',"LONcatInfo",'height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
 }  }
Line 917  function catalog_info() { Line 1598  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=280,resizable=yes,location=no,menubar=no,toolbar=no');
 }  }
   
   function group_chat(group) {
      var url = '/adm/groupchat?group='+group;
      var winName = 'LONchat_'+group;
      grpchat=window.open(url,winName,'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');
   }
   
   function edit_bookmarks() {
      go('');
      w_BookmarkPal_flag=1;
      bookmarkpal=window.open("/adm/bookmarks",
                  "BookmarkPal", "width=400,height=505,scrollbars=0");
   }
   
   function annotate() {
      w_Annotator_flag=1;
      annotator=window.open('','Annotator','width=365,height=265,scrollbars=0');
      annotator.document.write(
      '$start_page_annotate'
     +"<form name='goannotate' target='Annotator' method='post' "
     +"action='/adm/annotations'>"
     +"<input type='hidden' name='symbnew' value='"+currentSymb+"' />"
     +"<\\/form>"
     +'$end_page_annotate');
      annotator.document.close();
   }
   
   function set_bookmark() {
      go('');
      clienttitle=document.title;
      clienthref=location.pathname;
      w_bmquery_flag=1;
      bmquery=window.open('','bmquery','width=365,height=165,scrollbars=0');
      bmquery.document.write(
      '$start_page_bookmark'
      +'<center><form method="post"'
      +' name="newlink" action="/adm/bookmarks" target="bmquery" '
      +'> <table width="340" height="150" '
      +'bgcolor="ffffff" align="center"><tr><td>Link Name:<br /><input '
      +'type="text" name="title" size="45" value="'+clienttitle+'" />'
      +'<br />Address:<br /><input type="text" name="address" size="45" '
      +'value="'+clienthref+'" /><br /><center><input type="submit" '
      +'value="Save" /> <input type="button" value="Close" '
      +'onclick="javascript:window.close();" /></center></td>'
      +'</tr></table></form></center>'
      +'$end_page_bookmark' );
      bmquery.document.close();
   }
   
 ENDUTILITY  ENDUTILITY
 }  }
   
 sub serverform {  sub serverform {
     return(<<ENDSERVERFORM);      return(<<ENDSERVERFORM);
   
 <form name="server" action="/adm/logout" method="post" target="_top">  <form name="server" action="/adm/logout" method="post" target="_top">
 <input type="hidden" name="postdata" value="none" />  <input type="hidden" name="postdata" value="none" />
 <input type="hidden" name="command" value="none" />  <input type="hidden" name="command" value="none" />
Line 932  sub serverform { Line 1661  sub serverform {
 ENDSERVERFORM  ENDSERVERFORM
 }  }
   
   sub constspaceform {
       return(<<ENDCONSTSPACEFORM);
   <form name="constspace" action="/adm/logout" method="post" target="_top">
   <input type="hidden" name="filename" value="" />
   </form>
   <form name="cstrdelete" action="/adm/cfile" method="post" target="_top">
   <input type="hidden" name="action" value="delete" /> 
   <input type="hidden" name="filename" value="" />
   </form>
   <form name="cstrprint" action="/adm/printout" target="_parent" method="post">
   <input type="hidden" name="postdata" value="" />
   <input type="hidden" name="curseed" value="" />
   <input type="hidden" name="problemtype" value="" />
   </form>
   
   ENDCONSTSPACEFORM
   }
   
   
 sub get_nav_status {  sub get_nav_status {
     my $navstatus="swmenu.w_loncapanav_flag=";      my $navstatus="swmenu.w_loncapanav_flag=";
     if ($ENV{'environment.remotenavmap'} eq 'on') {      if ($env{'environment.remotenavmap'} eq 'on') {
  $navstatus.="1";   $navstatus.="1";
     } else {      } else {
  $navstatus.="-1";   $navstatus.="-1";
Line 942  sub get_nav_status { Line 1690  sub get_nav_status {
     return $navstatus;      return $navstatus;
 }  }
   
 # ================================================ Handler when called directly  sub hidden_button_check {
       my $hidden;
       if ($env{'request.course.id'} eq '') {
           return;
       }
       if ($env{'request.role.adv'}) {
           return;
       }
       my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide');
       return $buttonshide; 
   }
   
   sub roles_selector {
       my ($cdom,$cnum) = @_;
       my $crstype = &Apache::loncommon::course_type();
       my $now = time;
       my (%courseroles,%seccount);
       my $is_cc;
       my $role_selector;
       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)) || 
               (($end) && ($end<$now))  ||
               (($start) && ($now<$start))) {
               $is_cc = 0;
           } else {
               $is_cc = 1;
           }
       }
       if ($is_cc) {
           &get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount);
       } else {
           my %gotnosection;
           foreach my $item (keys(%env)) {
               if ($item =~ m-^user\.role\.([^.]+)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) {
                   my $role = $1;
                   my $sec = $2;
                   next if ($role eq 'gr');
                   my ($start,$end) = split(/\./,$env{$item});
                   next if (($start && $start > $now) || ($end && $end < $now));
                   if ($sec eq '') {
                       if (!$gotnosection{$role}) {
                           $seccount{$role} ++;
                           $gotnosection{$role} = 1;
                       }
                   }
                   if (ref($courseroles{$role}) eq 'ARRAY') {
                       if ($sec ne '') {
                           if (!grep(/^Q$sec\E$/,@{$courseroles{$role}})) {
                               push(@{$courseroles{$role}},$sec);
                               $seccount{$role} ++;
                           }
                       }
                   } else {
                       @{$courseroles{$role}} = ();
                       if ($sec ne '') {
                           $seccount{$role} ++;
                           push(@{$courseroles{$role}},$sec);
                       }
                   }
               }
           }
       }
       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) {
           $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles);
           $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">
                             <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';
           $role_selector .= '<option value="">'.$switchtext.'</option>';
           foreach my $role (@roles_order) {
               if (defined($courseroles{$role})) {
                   $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role,$crstype).'</option>'; 
               }
           }
           foreach my $role (sort(keys(%courseroles))) {
               if ($role =~ /^cr/) {
                   $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; 
               }
           }
           $role_selector .= '</select>'."\n".
                  '<input type="hidden" name="destinationurl" value="'.
                  &HTML::Entities::encode($ENV{'REQUEST_URI'},'"<>&').'" />'."\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;
   }
   
   sub get_all_courseroles {
       my ($cdom,$cnum,$courseroles,$seccount) = @_;
       unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH')) {
           return;
       }
       my ($result,$cached) =
           &Apache::lonnet::is_cached_new('getcourseroles',$cdom.'_'.$cnum);
       if (defined($cached)) {
           if (ref($result) eq 'HASH') {
               if ((ref($result->{'roles'}) eq 'HASH') &&
                   (ref($result->{'seccount'}) eq 'HASH')) {
                   %{$courseroles} = %{$result->{'roles'}};
                   %{$seccount} = %{$result->{'seccount'}};
                   return;
               }
           }
       }
       my %gotnosection;
       my %adv_roles =
            &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1);
       foreach my $role (keys(%adv_roles)) {
           my ($urole,$usec) = split(/:/,$role);
           if (!$gotnosection{$urole}) {
               $seccount->{$urole} ++;
               $gotnosection{$urole} = 1;
           }
           if (ref($courseroles->{$urole}) eq 'ARRAY') {
               if ($usec ne '') {
                   if (!grep(/^\Q$usec\E$/,@{$courseroles->{$urole}})) {
                       push(@{$courseroles->{$urole}},$usec);
                       $seccount->{$urole} ++;
                   }
               }
           } else {
               @{$courseroles->{$urole}} = ();
               if ($usec ne '') {
                   $seccount->{$urole} ++;
                   push(@{$courseroles->{$urole}},$usec);
               }
           }
       }
       my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum,['st']);
       @{$courseroles->{'st'}} = ();
       if (keys(%sections_count) > 0) {
           push(@{$courseroles->{'st'}},keys(%sections_count));
           $seccount->{'st'} = scalar(keys(%sections_count));
       }
       my $rolehash = {
                        'roles'    => $courseroles,
                        'seccount' => $seccount,
                      };
       &Apache::lonnet::do_cache_new('getcourseroles',$cdom.'_'.$cnum,$rolehash);
       return;
   }
   
   sub jump_to_role {
       my ($cdom,$cnum,$seccount,$courseroles) = @_;
       my %lt = &Apache::lonlocal::texthash(
                   this => 'This role has section(s) associated with it.',
                   ente => 'Enter a specific section.',
                   orlb => 'Enter a specific section, or leave blank for no section.',
                   avai => 'Available sections are:',
                   youe => 'You entered an invalid section choice:',
                   plst => 'Please try again',
       );
       my $js;
       if (ref($courseroles) eq 'HASH') {
           $js = '    var secpick = new Array("'.$lt{'ente'}.'","'.$lt{'orlb'}.'");'."\n". 
                 '    var numsec = new Array();'."\n".
                 '    var rolesections = new Array();'."\n".
                 '    var rolenames = new Array();'."\n".
                 '    var roleseclist = new Array();'."\n";
           my @items = keys(%{$courseroles});
           for (my $i=0; $i<@items; $i++) {
               $js .= '    rolenames['.$i.'] = "'.$items[$i].'";'."\n";
               my ($secs,$secstr);
               if (ref($courseroles->{$items[$i]}) eq 'ARRAY') {
                   my @sections = sort { $a <=> $b } @{$courseroles->{$items[$i]}};
                   $secs = join('","',@sections);
                   $secstr = join(', ',@sections);
               }
               $js .= '    rolesections['.$i.'] = new Array("'.$secs.'");'."\n".
                      '    roleseclist['.$i.'] = "'.$secstr.'";'."\n".
                      '    numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n";
           }
       }
       return <<"END";
   <script type="text/javascript">
   //<![CDATA[
   function adhocRole(roleitem) {
       $js
       var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;
       if (newrole == '') {
           return; 
       } 
       var fullrole = newrole+'./$cdom/$cnum';
       var selidx = '';
       for (var i=0; i<rolenames.length; i++) {
           if (rolenames[i] == newrole) {
               selidx = i;
           }
       }
       var secok = 1;
       var secchoice = '';
       if (selidx >= 0) {
           if (numsec[selidx] > 1) {
               secok = 0;
               var numrolesec = rolesections[selidx].length;
               var msgidx = numsec[selidx] - numrolesec;
               secchoice = prompt("$lt{'this'}\\n"+secpick[msgidx]+"\\n$lt{'avai'} "+roleseclist[selidx],"");
               if (secchoice == '') {
                   if (msgidx > 0) {
                       secok = 1;
                   }
               } else {
                   for (var j=0; j<rolesections[selidx].length; j++) {
                       if (rolesections[selidx][j] == secchoice) {
                           secok = 1;
                       }
                   }
               }
           } else {
               if (rolesections[selidx].length == 1) {
                   secchoice = rolesections[selidx][0];
               }
           }
       }
       if (secok == 1) {
           if (secchoice != '') {
               fullrole += '/'+secchoice;
           }
       } else {
           document.rolechooser.elements[roleitem].selectedIndex = 0;
           if (secchoice != null) {
               alert("$lt{'youe'} \\""+secchoice+"\\".\\n $lt{'plst'}");
           }
           return;
       }
       if (fullrole == "$env{'request.role'}") {
           return;
       }
       itemid = retrieveIndex('gotorole');
       if (itemid != -1) {
           document.rolechooser.elements[itemid].name = fullrole;
       }
       document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value = fullrole;
       document.rolechooser.selectrole.value = '1';
       document.rolechooser.submit();
       return;
   }
   
 sub handler {  function retrieveIndex(item) {
     my $r = shift;      for (var i=0;i<document.rolechooser.elements.length;i++) {
     &Apache::loncommon::content_type($r,'text/html');          if (document.rolechooser.elements[i].name == item) {
     $r->send_http_header;              return i;
     return OK if $r->header_only;          }
       }
     my $form=&serverform();      return -1;
     my $bodytag=&Apache::loncommon::bodytag('Main Menu');  }
     my $function='student';  // ]]>
     if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) {  
  $function='coordinator';  
     }  
     if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) {  
  $function='admin';  
     }  
     if (($ENV{'request.role'}=~/^(au|ca)/) ||  
  ($ENV{'request.noversionuri'}=~/^(\/priv|\~)/)) {  
  $function='author';  
     }  
     my $domain=&Apache::loncommon::determinedomain();  
     $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);  
     $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);  
     $font=&Apache::loncommon::designparm($function.'.font',$domain);  
 # ---- Print the screen, pretent to be in text mode to generate text-based menu  
     unless ($ENV{'browser.interface'} eq 'textual') {  
  $ENV{'browser.interface'}='faketextual';  
  $ENV{'environment.remote'}='off';  
     }  
     my $utility=&utilityfunctions();  
     $r->print(<<ENDHEADER);  
 <html><head>  
 <title>LON-CAPA Main Menu</title>  
 <script>  
 $utility  
 </script>  </script>
 </head>  END
 $bodytag  
 ENDHEADER  
     $r->print('<table>'.&inlinemenu().'</table>'.$form);  
     $r->print('</body></html>');  
     return OK;  
 }  }
   
   
 # ================================================================ Main Program  # ================================================================ Main Program
   
 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) {                      if ($configline=~/^cat\:/) {
                 $desklines[$#desklines+1]=$configline;                         my @entries=split(/\:/,$configline);
             }                         $category_positions{$entries[2]}=$entries[1];
         }                         $category_names{$entries[2]}=$entries[3];
         CORE::close($config);      } elsif ($configline) {
    push(@desklines,$configline);
       }
    }
    CORE::close($config);
       }
    }
    $readdesk='done';
     }      }
    }  
    $readdesk='done';  
   }  
 }  }
   
 1;  1;

Removed from v.1.113  
changed lines
  Added in v.1.244.2.12


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