Diff for /loncom/interface/lonmenu.pm between versions 1.223 and 1.248

version 1.223, 2007/08/17 22:12:30 version 1.248, 2008/12/08 23:07:03
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 convert_menu_function()
   
   FIXME this needs to move into mydesktab and the other locations 
   the text is generated
   
   =item hidden_button_check()
   
   =item roles_selector()
   
   =item jump_to_role()
   
   =back
   
   =cut
   
 package Apache::lonmenu;  package Apache::lonmenu;
   
 use strict;  use strict;
Line 53  my @inlineremote; Line 152  my @inlineremote;
   
   
   
 # ================================================================ 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',
                                        'roles' => ($env{'user.adv'}?                                         'roles' => (&show_course()?
                                                     'Roles':'Courses'),                                                      'Courses':'Roles'),
                                          'other' => 'Other Roles',
                                        'docs' => 'Edit Course',                                         'docs' => 'Edit Course',
                                        'exit' => 'Exit',                                         'exit' => 'Exit',
                                        'login' => 'Log In',                                         'login' => 'Log In',
Line 70  sub initlittle { Line 182  sub initlittle {
                                        );                                         );
 }  }
   
 # ============================= This gets called at the top of the body section  
   
 sub menubuttons {  sub menubuttons {
     my $forcereg=shift;      my $forcereg=shift;
     my $registration=shift;      my $registration=shift;
Line 88  sub menubuttons { Line 198  sub menubuttons {
     my $reloadlink='';      my $reloadlink='';
     my $docs='';      my $docs='';
     my $groups='';      my $groups='';
       my $roles='<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>';
       my $role_selector;
     my $showgroups=0;      my $showgroups=0;
       my ($cnum,$cdom);
     my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));      my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));
     my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));      my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));
   
     my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif");      my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif");
     $logo = '<td class="LC_top_nav_logo"><a href="/adm/about.html"><img src="'.      $logo = '<td class="LC_top_nav_logo"><a href="/adm/about.html"><img src="'.
  $logo.'" alt="LON-CAPA Logo" /></a></td>';   $logo.'" alt="LON-CAPA Logo" class="noBorder" /></a></td>';
   
     if ($env{'request.state'} eq 'construct') {      if ($env{'request.state'} eq 'construct') {
         if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) {          if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) {
Line 104  sub menubuttons { Line 217  sub menubuttons {
         }          }
     }      }
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my %coursegroups;          my %coursegroups;
         my $viewgrps_permission =          my $viewgrps_permission =
     &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));      &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
         if (!$viewgrps_permission) {          if (!$viewgrps_permission) {
             %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'});              %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum);
  }   }
         if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) {          if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) {
             $showgroups = 1;              $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') {      if ($env{'browser.interface'} eq 'textual') {
Line 121  sub menubuttons { Line 240  sub menubuttons {
     $navmaps=(<<ENDNAV);      $navmaps=(<<ENDNAV);
 <a href="/adm/navmaps?postdata=$escurl&amp;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\//) &&  
          ($env{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) {  
                 my $escreload=&escape('return:');                  my $escreload=&escape('return:');
                 $reloadlink=(<<ENDRELOAD);                  $reloadlink=(<<ENDRELOAD);
 <a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a>  <a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a>
Line 149  $utility Line 266  $utility
 </script>  </script>
 <div id="LC_top_nav">  <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 $docs $groups  $reloadlink $navmaps $docs $groups $roles
 <a href="/adm/roles" target="_top">$lt{'roles'}</a>  
 <a href="/adm/logout" target="_top">$lt{'exit'}</a>  <a href="/adm/logout" target="_top">$lt{'exit'}</a>
 </div>  </div>
 <br />  <br />
Line 183  ENDMAINMENU Line 299  ENDMAINMENU
      </td>       </td>
     </tr>      </tr>
   </table>    </table>
 </font>  
 ENDINLINEMENU  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'}) {
     my $link='/adm/navmaps?postdata='.$escurl.'&amp;postsymb='.      my $link='/adm/navmaps?postdata='.$escurl.'&amp;postsymb='.
Line 196  ENDINLINEMENU Line 312  ENDINLINEMENU
     $navmaps=(<<ENDNAV);      $navmaps=(<<ENDNAV);
 <td><a href="$link" target="_top">$lt{'nav'}</a></td>  <td><a href="$link" target="_top">$lt{'nav'}</a></td>
 ENDNAV  ENDNAV
 my $is_group = (&Apache::loncommon::course_type() eq 'Group');              my $is_group = (&Apache::loncommon::course_type() eq 'Group');
     if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {      if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                 my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'};                  my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'};
  $docs=(<<ENDDOCS);   $docs=(<<ENDDOCS);
Line 208  ENDDOCS Line 324  ENDDOCS
 <td><a href="/adm/coursegroups" target="_top">$lt{'groups'}</a></td>  <td><a href="/adm/coursegroups" target="_top">$lt{'groups'}</a></td>
 ENDGROUPS  ENDGROUPS
             }              }
     if (      if (&show_return_link()) {
  ($env{'request.noversionuri'}=~m[^/(res|public)/] &&  
  $env{'request.symb'} eq '')  
  ||  
  (($env{'request.noversionuri'}=~/^\/adm\//) &&  
  ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&  
  ($env{'request.noversionuri'}!~  
         m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)])  
   )  
  ) {  
                 my $escreload=&escape('return:');                  my $escreload=&escape('return:');
                 $reloadlink=(<<ENDRELOAD);                  $reloadlink=(<<ENDRELOAD);
 <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>  <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</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'})) {   if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) {
     my $escreload=&escape('return:');      my $escreload=&escape('return:');
Line 236  ENDCRELOAD Line 346  ENDCRELOAD
         }          }
         my $form=&serverform();          my $form=&serverform();
  my $utility=&utilityfunctions();   my $utility=&utilityfunctions();
  my $remote;  
  if ($env{'user.adv'}) {  
     $remote = '<td><a href="/adm/remote?action=launch&amp;url='.$escurl.'" target="_top">'.$lt{'launch'}.'</a></td>'  
  }  
   
         my $helplink=&Apache::loncommon::top_nav_help('Help');          my $helplink=&Apache::loncommon::top_nav_help('Help');
  return (<<ENDINLINEMENU);   return (<<ENDINLINEMENU);
Line 257  $reloadlink Line 363  $reloadlink
 $navmaps  $navmaps
 $docs  $docs
 $groups  $groups
 $remote  $roles
 <td><a href="/adm/roles" target="_top">$lt{'roles'}</a></td>  <td style="width: 2.0em;">$helplink</td>
 <td class="LC_top_nav_help">$helplink</td>  <td style="width: 2.0em;"><a href="/adm/logout" target="_top">$lt{'exit'}</a></td>
 <td class="LC_top_nav_exit"><a href="/adm/logout" target="_top">$lt{'exit'}</a></td>  
 </tr>  </tr>
 </table>  </table>
 $form  $form
Line 274  ENDINLINEMENU Line 379  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) = @_;      my ($forcereg) = @_;
Line 299  sub registerurl { Line 416  sub registerurl {
     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, $titletable) = @_;      my ($forcereg, $titletable) = @_;
     my $result = '';      my $result = '';
Line 334  sub innerregister { Line 448  sub innerregister {
  } else {   } else {
     $newmail= 'swmenu.setstatus("you have","messages");';      $newmail= 'swmenu.setstatus("you have","messages");';
  }   }
     } elsif (($textual)       } 
       if (($textual) 
      && ($env{'request.symb'})        && ($env{'request.symb'}) 
      && ($env{'request.course.id'})) {       && ($env{'request.course.id'})) {
  $newmail.= '<td class="LC_current_location">';   $newmail.= '<td class="LC_current_location">';
  my ($mapurl,$rid,$resurl)=   my ($mapurl,$rid,$resurl)=
     &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());      &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
         $newmail.=$env{'course.'.$env{'request.course.id'}.'.description'};          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(&Apache::lonnet::symbread());   my $restitle=&Apache::lonnet::gettitle(&Apache::lonnet::symbread());
         if ($maptitle && $maptitle ne 'default.sequence') {          if ($maptitle && ($maptitle ne 'default.sequence') && ($maptitle ne $coursetitle)) {
     $newmail.=', '.$maptitle;      $newmail.=', '.$maptitle;
         }          }
         if ($restitle) {          if ($restitle) {
Line 398  sub innerregister { Line 514  sub innerregister {
         ###          ###
         my $editbutton = '';          my $editbutton = '';
         if ($env{'user.author'}) {          if ($env{'user.author'}) {
             if ($env{'request.role'}=~/^(ca|au)/) {              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'}=~/($match_domain)\/($match_username)$/);                      ($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 484  c&8&1 Line 605  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&&1  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&&1  
 ENDMENUITEMS  ENDMENUITEMS
   
   my $currentURL = &Apache::loncommon::get_symb();
   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 ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) {              unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) {
  if (!$env{'request.enc'}) {   if (!$env{'request.enc'}) {
     $menuitems.=(<<ENDREALRES);      $menuitems.=(<<ENDREALRES);
Line 571  ENDLINE Line 703  ENDLINE
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
 </script>  </script>
 $timesync  $timesync
 $newmail  
 $tablestart  $tablestart
 $inlinebuttons  $inlinebuttons
 $tableend  $tableend
   $newmail
 <script type="text/javascript">  <script type="text/javascript">
 // END LON-CAPA Internal  // END LON-CAPA Internal
 </script>  </script>
Line 686  sub unloadevents() { Line 818  sub unloadevents() {
     return 'LONCAPAstale();';      return 'LONCAPAstale();';
 }  }
   
 # ============================================================= Start up remote  
   
 sub startupremote {  sub startupremote {
     my ($lowerurl)=@_;      my ($lowerurl)=@_;
Line 793  sub load_remote_msg { Line 924  sub load_remote_msg {
 <p>$link</p>  <p>$link</p>
 ENDREMOTEFORM  ENDREMOTEFORM
 }  }
 # ================================================================= Reopen menu  
   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='';
Line 811  sub open { Line 947  sub open {
         ($env{'environment.remote'} eq 'off')) {           ($env{'environment.remote'} eq 'off')) { 
  return '<script type="text/javascript">self.name="loncapaclient";</script>';   return '<script type="text/javascript">self.name="loncapaclient";</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
Line 856  sub switch { Line 992  sub switch {
     $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')) {
          $img=&mt($img);
       }
     my $idx=10*$row+$col;      my $idx=10*$row+$col;
     $category_members{$cat}.=':'.$idx;      $category_members{$cat}.=':'.$idx;
   
Line 887  sub switch { Line 1024  sub switch {
        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 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').'" class="noBorder" />';
        if ($env{'browser.interface'} eq 'faketextual') {         if ($env{'browser.interface'} eq 'faketextual') {
 # Accessibility  # Accessibility
    if ($nobreak==3) {     if ($nobreak==3) {
        $inlineremote[$idx]="\n".         $inlineremote[$idx]="\n".
    '<td class="LC_menubuttons_text" align="right">'.$text.     '<td class="LC_menubuttons_text" align="right">'.$text.
    '</td><td class="LC_menubuttons_img" align="left">'.     '</td><td align="left">'.
    '<a href="javascript:'.$act.';">'.$pic.'</a></td></tr>';     '<a href="javascript:'.$act.';">'.$pic.'</a></td></tr>';
    } elsif ($nobreak) {     } elsif ($nobreak) {
        $inlineremote[$idx]="\n<tr>".         $inlineremote[$idx]="\n<tr>".
    '<td class="LC_menubuttons_img" align="left">'.     '<td align="left">'.
    '<a href="javascript:'.$act.';">'.$pic.'</a></td>     '<a href="javascript:'.$act.';">'.$pic.'</a></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>';                      <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[$idx]="\n<tr>".         $inlineremote[$idx]="\n<tr>".
    '<td class="LC_menubuttons_img" align="left">'.     '<td align="left">'.
    '<a href="javascript:'.$act.';">'.$pic.     '<a href="javascript:'.$act.';">'.$pic.
    '</a></td><td class="LC_menubuttons_text" colspan="3">'.     '</a></td><td class="LC_menubuttons_text" colspan="3">'.
    '<a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$desc.'</span></a></td></tr>';     '<a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$desc.'</span></a></td></tr>';
Line 941  sub secondlevel { Line 1076  sub secondlevel {
 }  }
   
 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();
Line 954  sub inlinemenu { Line 1089  sub inlinemenu {
     &rawconfig(1);      &rawconfig(1);
     my $output='<table id="LC_mainmenu"><tr>';      my $output='<table id="LC_mainmenu"><tr>';
     for (my $col=1; $col<=2; $col++) {      for (my $col=1; $col<=2; $col++) {
         $output.='<td class="LC_mainmenu_column">';          $output.='<td class="LC_mainmenu_col_fieldset">';
         for (my $row=1; $row<=8; $row++) {          for (my $row=1; $row<=8; $row++) {
             foreach my $cat (keys(%category_members)) {              foreach my $cat (keys(%category_members)) {
                if ($category_positions{$cat} ne "$col,$row") { next; }                 if ($category_positions{$cat} ne "$col,$row") { next; }
                $output.='<table id="LC_menubuttons_mainmenu"><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';                 #$output.='<table><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';
                  $output.='<div class="ContentBoxSpecial">';
          $output.='<h4 class="hcell">'.&mt($category_names{$cat}).'</h4>';
                  $output.='<table>';
                my %active=();                 my %active=();
                foreach my $menu_item (split(/\:/,$category_members{$cat})) {                 foreach my $menu_item (split(/\:/,$category_members{$cat})) {
                   if ($inlineremote[$menu_item]) {                    if ($inlineremote[$menu_item]) {
Line 969  sub inlinemenu { Line 1107  sub inlinemenu {
                   $output.=$inlineremote[$item];                    $output.=$inlineremote[$item];
                }                 }
                $output.='</table>';                 $output.='</table>';
                  $output.='</div>';
             }              }
          }           }
          $output.="</td>";           $output.="</td>";
Line 991  sub rawconfig { Line 1130  sub rawconfig {
     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 $show_course=&show_course();
     my $author=$env{'user.author'};      my $author=$env{'user.author'};
     my $crs='';      my $crs='';
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
Line 1030  sub rawconfig { Line 1170  sub rawconfig {
                $output.=&secondlevel(                 $output.=&secondlevel(
   $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);    $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
             }              }
    } elsif ($pro 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)) {      if (&Apache::lonnet::allowed($1,$prt)) {
                $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
Line 1054  sub rawconfig { Line 1204  sub rawconfig {
         } 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 'raa') && ($env{'request.role'}=~/^aa/)) || 
                     (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) {                      (($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'}=~/($match_domain)\/($match_username)$/);                                 ($env{'request.role'}=~/($match_domain)\/($match_username)$/);
                     }                                             }                       
Line 1073  sub rawconfig { Line 1224  sub rawconfig {
                     }                      }
                 }                  }
             }              }
           } elsif ($pro eq 'tools') {
               my @tools = ('aboutme','blog','portfolio');
               if (grep(/^\Q$prt\E$/,@tools)) {
                   if (defined($env{'environment.tools.'.$prt}) &&
                      ($env{'environment.tools.'.$prt} == 0)) {
                       $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') ||
Line 1091  sub rawconfig { Line 1254  sub rawconfig {
 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 type="text/javascript">  <script type="text/javascript">
 window.status='Accessing Remote Control';  window.status='Accessing Remote Control';
Line 1367  sub hidden_button_check { Line 1530  sub hidden_button_check {
     if ($env{'request.role.adv'}) {      if ($env{'request.role.adv'}) {
         return;          return;
     }      }
     return &Apache::lonnet::EXT('resource.0.buttonshide');       my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide');
       return $buttonshide; 
 }  }
   
   sub roles_selector {
       my ($cdom,$cnum) = @_;
       my $now = time;
       my (%courseroles,%seccount,%gotnosection);
       my $is_cc;
       my $role_selector;
       if ($env{'user.role.cc./'.$cdom.'/'.$cnum}) {
           my ($start,$end) = split(/\./,$env{'user.role.cc./'.$cdom.'/'.$cnum});
           
           if ((($start) && ($start<0)) || 
               (($end) && ($end<$now))  ||
               (($start) && ($now<$start))) {
               $is_cc = 0;
           } else {
               $is_cc = 1;
           }
       }
       if ($is_cc) {
           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);
           @{$courseroles{'st'}} = ();
           if (keys(%sections_count) > 0) {
               push(@{$courseroles{'st'}},keys(%sections_count));
           }
       } else {
           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 @roles_order = ('cc','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="">'.&mt('Switch course role to...').'</option>';
           foreach my $role (@roles_order) {
               if (defined($courseroles{$role})) {
                   $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</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="'.
                  $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 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";
           }
       }
       my $output = <<"END";
   <script type="text/javascript">
   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;
   }
   
   function retrieveIndex(item) {
       for (var i=0;i<document.rolechooser.elements.length;i++) {
           if (document.rolechooser.elements[i].name == item) {
               return i;
           }
       }
       return -1;
   }
   
   
   </script>
   END
       return $output;
   }
   
   
 # ================================================================ Main Program  # ================================================================ Main Program
   
 BEGIN {  BEGIN {

Removed from v.1.223  
changed lines
  Added in v.1.248


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