Diff for /loncom/interface/lonmenu.pm between versions 1.135 and 1.326

version 1.135, 2004/12/03 22:10:39 version 1.326, 2010/04/19 09:22:14
Line 26 Line 26
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 #  #
 # There are two parameters controlling the action of this module:  # There is one parameter controlling the action of this module:
 #  
 # browser.interface - if this is 'textual', it overrides the second parameter  
 # and goes to screen reader PDA mode  
 #  
 # environment.remote - if this is 'on', the routines controll the remote  
 # control, otherwise they render the main window controls; ignored it  
 # 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 GLOBAL VARIABLES
   
   =over
   
   =item @desklines
   
   Each element of this array contains a line of mydesk.tab that doesn't start with
   cat, prim or scnd. 
   It gets filled in the BEGIN block of this module.
   
   =item %category_names
   
   The keys of this hash are the abbreviations used in mydesk.tab in those lines that 
   start with cat, the values are strings representing titles. 
   It gets filled in the BEGIN block of this module.
   
   =item %category_members
   
   TODO 
   
   =item %category_positions
   
   The keys of this hash are the abbreviations used in mydesk.tab in those lines that
   start with cat, its values are position vectors (column, row). 
   It gets filled in the BEGIN block of this module.
   
   =item $readdesk
   
   Indicates that mydesk.tab has been read. 
   It is set to 'done' in the BEGIN block of this module.
   
   =item @primary_menu
   
   The elements of this array reference arrays that are made up of the components
   of those lines of mydesk.tab that start with prim.
   It is used by primary_menu() to generate the corresponding menu.
   It gets filled in the BEGIN block of this module.
   
   =item @secondary_menu
   
   The elements of this array reference arrays that are made up of the components
   of those lines of mydesk.tab that start with scnd.
   It is used by secondary_menu() to generate the corresponding menu.
   It gets filled in the BEGIN block of this module.
   
   =back
   
   =head1 SUBROUTINES
   
   =over
   
   =item prep_menuitems(\@menuitem)
   
   This routine wraps a menuitem in proper HTML. It is used by primary_menu() and 
   secondary_menu().
   
   =item primary_menu()
   
   This routine evaluates @primary_menu and returns XHTML for the menu
   that contains following links: About, Message, Roles, Help, Logout
   @primary_menu is filled within the BEGIN block of this module with 
   entries from mydesk.tab 
   
   =item secondary_menu()
   
   Same as primary_menu() but operates on @secondary_menu.
   
   =item show_return_link()
   
   =item innerregister()
   
   This gets called in order to register a URL in the body of the document
   
   =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 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::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 @primary_menu @secondary_menu);
   
 my @inlineremote;  my @inlineremote;
 my $font;  
 my $tabbg;  sub prep_menuitem {
 my $pgbg;      my ($menuitem) = @_;
       return '' unless(ref($menuitem) eq 'ARRAY');
 # ================================================================ Little texts      my $link;
       if ($$menuitem[1]) { # graphical Link
 sub initlittle {          $link = "<img class=\"LC_noBorder\""
     return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',                . " src=\"" . &Apache::loncommon::lonhttpdurl($$menuitem[1]) . "\"" 
        'nav' => 'Navigate Contents',                . " alt=\"" . &mt($$menuitem[2]) . "\" />";
        'main' => 'Main Menu',      } else {             # textual Link
        'launch' => 'Launch Remote Control');          $link = &mt($$menuitem[3]);
 }      }
       return '<li><a' 
 # ============================= This gets called at the top of the body section             # highlighting for new messages
              . ( $$menuitem[4] eq 'newmsg' ? ' class="LC_new_message"' : '') 
 sub menubuttons {             . qq| href="$$menuitem[0]" target="_top">$link</a></li>|;
     my $forcereg=shift;  }
     my $target  =shift;  
     my $registration=shift;  # primary_menu() evaluates @primary_menu and returns XHTML for the menu
     my $titletable=shift;  # that contains following links:
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},  # About, Message, Roles, Help, Logout
     ['inhibitmenu']);  # @primary_menu is filled within the BEGIN block of this module with 
     if ($ENV{'form.inhibitmenu'} eq 'yes') { return ''; }  # entries from mydesk.tab
   sub primary_menu {
     my $navmaps='';      my $menu;
     my $reloadlink='';      # each element of @primary contains following array:
     my $escurl=&Apache::lonnet::escape(&Apache::lonenc::check_encrypt($ENV{'request.noversionuri'}));      # (link url, icon path, alt text, link text, condition)
     my $escsymb=&Apache::lonnet::escape(&Apache::lonenc::check_encrypt($ENV{'request.symb'}));      my $public;
     if ($ENV{'request.state'} eq 'construct') {      if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
         if (($ENV{'request.noversionuri'} eq '') || (!defined($ENV{'request.noversionuri'}))) {          || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
             my $returnurl = $ENV{'request.filename'};          $public = 1;
             $returnurl =~ s:^/home/([^/]+)/public_html/(.*)$:/priv/$1/$2:;      }
             $escurl = &Apache::lonnet::escape($returnurl);      foreach my $menuitem (@primary_menu) {
         }          # evaluate conditions 
     }          next if    ref($menuitem)       ne 'ARRAY';    #
     if ($ENV{'browser.interface'} eq 'textual') {          next if    $$menuitem[4]        eq 'nonewmsg'  # show links depending on
 # Textual display only                  && &Apache::lonmsg::mynewmail();       # whether a new msg 
  my %lt=&initlittle();          next if    $$menuitem[4]        eq 'newmsg'    # arrived or not
         $pgbg='#FFFFFF';                  && !&Apache::lonmsg::mynewmail();      # 
         $tabbg='#FFFFFF';          next if    $$menuitem[4]        !~ /public/    ##we've a public user,
  $font='#000000';                  && $public;                            ##who should not see all
         if ($ENV{'request.course.id'}) {                                                         ##links
     $navmaps=(<<ENDNAV);          next if    $$menuitem[4]        eq 'onlypublic'# hide links which are 
 <a href="/adm/navmaps?postdata=$escurl&postsymb=$escsymb" target="_top">$lt{'nav'}</a>                  && !$public;                           # only visible to public
 ENDNAV                                                         # users
             if (($ENV{'request.noversionuri'}=~/^\/adm\//) &&          next if    $$menuitem[4]        eq 'roles'     ##show links depending on
          ($ENV{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&                  && &Apache::loncommon::show_course();  ##term 'Courses' or 
          ($ENV{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) {          next if    $$menuitem[4]        eq 'courses'   ##'Roles' wanted
                 my $escreload=&Apache::lonnet::escape('return:');                  && !&Apache::loncommon::show_course(); ##
                 $reloadlink=(<<ENDRELOAD);          
 <a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">$lt{'ret'}</font></a>              
 ENDRELOAD          if ($$menuitem[3] eq 'Help') { # special treatment for helplink
             }              $menu .= '<li>'.&Apache::loncommon::top_nav_help('Help').'</li>';
         }          } else {
         my $form=&serverform();              $menu .= prep_menuitem($menuitem);
         my $utility=&utilityfunctions();          }
  my $output=(<<ENDMAINMENU);  
 <script type="text/javascript">  
 // BEGIN LON-CAPA Internal  
 $utility  
 </script>  
 <a href="/adm/menu" target="_top">$lt{'main'}</a>  
 $reloadlink $navmaps<br />  
 <script type="text/javascript">  
 // END LON-CAPA Internal  
 </script>  
 $form  
 ENDMAINMENU  
         if ($registration) { $output.=&innerregister($forcereg,$target); }  
  return $output."<hr />";  
     } elsif ($ENV{'environment.remote'} eq 'off') {  
 # Remote Control is switched off  
 # figure out colors  
  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();  
         $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);  
         $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);  
         $font=&Apache::loncommon::designparm($function.'.font',$domain);  
         my $link=&Apache::loncommon::designparm($function.'.link',$domain);  
         my $alink=&Apache::loncommon::designparm($function.'.alink',$domain);  
         my $vlink=&Apache::loncommon::designparm($function.'.vlink',$domain);  
         my $sidebg=&Apache::loncommon::designparm($function.'.sidebg',$domain);  
 # Do we have a NAV link?  
         if ($ENV{'request.course.id'}) {  
            $navmaps=(<<ENDNAV);  
 <td bgcolor="$tabbg">  
 <a href="javascript:gonav('/adm/navmaps?postdata=$escurl&amp;postsymb=$escsymb')"><font color="$font">$lt{'nav'}</font></a></td>  
 ENDNAV  
     if (($ENV{'request.noversionuri'}=~/^\/adm\//) &&  
                 ($ENV{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&  
          ($ENV{'request.noversionuri'}!~/^\/adm\/.*\/(smppg|bulletinboard|aboutme)(\?|$)/)) {  
                 my $escreload=&Apache::lonnet::escape('return:');  
                 $reloadlink=(<<ENDRELOAD);  
 <td bgcolor="$tabbg">  
 <a href="/adm/flip?postdata=$escreload" target="_top"><font color="$font">$lt{'ret'}</font></a></td>  
 ENDRELOAD  
             }  
         }  
         my $reg='';  
         if ($registration) {  
            $reg=&innerregister($forcereg,$target,$titletable);  
         }  
         my $form=&serverform();  
  my $utility=&utilityfunctions();  
  return (<<ENDINLINEMENU);  
 <script type="text/javascript">  
 // BEGIN LON-CAPA Internal  
 $utility  
 </script>  
 <font face="Arial,Helvetica,sans-serif"><table bgcolor="$pgbg" width="100%" border="0" cellpadding="1" cellspacing="1">  
 <tr>  
 <td bgcolor="$tabbg">  
 <a href="/adm/menu" target="_top"><font color="$font">$lt{'main'}</font></a>  
 </td>  
 $reloadlink  
 $navmaps  
 <td bgcolor="$tabbg">  
 <a href="/adm/remote?action=launch&amp;url=$escurl" target="_top">  
 <font color="$font">$lt{'launch'}</font></a></td>  
 <td bgcolor="$tabbg">  
 <img align="right" src="/adm/lonIcons/minilogo.gif" />  
 <b>LON-CAPA</b></td>  
 $form  
 </tr>  
 </table>  
 </font>  
 <script type="text/javascript">  
 // END LON-CAPA Internal  
 </script>  
 $reg  
 ENDINLINEMENU  
     } else {  
  return '';  
     }      }
       $menu =~ s/\[domain\]/$env{'user.domain'}/g;
       $menu =~ s/\[user\]/$env{'user.name'}/g;
   
       return "<ol class=\"LC_primary_menu LC_right\">$menu</ol>";
 }  }
   
 # ====================================== This gets called in the header section  
   
 sub registerurl {  sub secondary_menu {
     my $forcereg=shift;      my $menu;
     my $target = shift;  
     my $result = '';      my $crstype = &Apache::loncommon::course_type();
     if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }      my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
     my $force_title='';      my $canviewgrps = &Apache::lonnet::allowed('vcg', $env{'request.course.id'}
     if ($ENV{'request.state'} eq 'construct') {                     . ($env{'request.course.sec'} ? "/$env{'request.course.sec'}"
  $force_title=&Apache::lonxml::display_title();                                                   : '')); 
     }      my $showlink = &show_return_link();
     if ($target eq 'edit') {      my %groups = &Apache::lonnet::get_active_groups(
         $result .="<script type=\"text/javascript\">\n".                       $env{'user.domain'}, $env{'user.name'},
             "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".                       $env{'course.' . $env{'request.course.id'} . '.domain'},
             &Apache::loncommon::browser_and_searcher_javascript().                       $env{'course.' . $env{'request.course.id'} . '.num'});
                 "\n</script>\n";      foreach my $menuitem (@secondary_menu) {
     }          # evaluate conditions 
     if (($ENV{'browser.interface'} eq 'textual') ||          next if    ref($menuitem)  ne 'ARRAY';
         ($ENV{'environment.remote'} eq 'off') ||          next if    $$menuitem[4]   ne 'always'
         ((($ENV{'request.publicaccess'}) ||                   && !$env{'request.course.id'};
          (!&Apache::lonnet::is_on_map(          next if    $$menuitem[4]   eq 'showreturn'
    &Apache::lonnet::unescape($ENV{'request.noversionuri'})))) &&                  && !$showlink
         (!$forcereg))) {                  && !($env{'request.state'} eq 'construct');
   return $result.          next if    $$menuitem[4]   =~ /^mdc/
           '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>'.$force_title;                  && !$canedit;
     }          next if    $$menuitem[4]  eq 'mdcCourse'
 # Graphical display after login only                  && $crstype eq 'Community';
     if ($Apache::lonxml::registered && !$forcereg) { return ''; }          next if    $$menuitem[4]  eq 'mdcCommunity'
     if ($target ne 'edit') {                  && $crstype ne 'Community';
  $result.=&innerregister($forcereg,$target);          next if    $$menuitem[4] =~ /^Course$/
                   && $crstype eq 'Community';
           next if    $$menuitem[4] =~ /^Community$/
                   && $crstype ne 'Community';
           next if    $$menuitem[4]   =~ /showgroups$/
                   && !$canviewgrps
                   && !%groups;
   
           if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
               # special treatment for role selector
               my $roles_selector = &roles_selector(
                           $env{'course.' . $env{'request.course.id'} . '.domain'},
                           $env{'course.' . $env{'request.course.id'} . '.num'}  );
   
               $menu .= $roles_selector ? "<li>$roles_selector</li>"
                                        : '';
           } else {
               $menu .= &prep_menuitem(\@$menuitem);
           }
     }      }
     return $result.$force_title;      if ($menu =~ /\[url\].*\[symb\]/) {
           my $escurl  = &escape( &Apache::lonenc::check_encrypt(
                                $env{'request.noversionuri'}));
   
           my $escsymb = &escape( &Apache::lonenc::check_encrypt(
                                $env{'request.symb'})); 
   
           if (    $env{'request.state'} eq 'construct'
               and (   $env{'request.noversionuri'} eq '' 
                    || !defined($env{'request.noversionuri'}))) 
           {
               ($escurl = $env{'request.filename'}) =~ 
                   s{^/home/([^/]+)/public_html/(.*)$}{/priv/$1/$2};
   
               $escurl  = &escape($escurl);
           }    
           $menu =~ s/\[url\]/$escurl/g;
           $menu =~ s/\[symb\]/$escsymb/g;
       }
   
       return "<ul id=\"LC_secondary_menu\">$menu</ul>";
   }
   
   sub show_return_link {
       if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
           || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
   
           return if ($env{'form.register'});
       }
       return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
        $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)($|\?)})
              ));
 }  }
   
 # =========== 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,$bread_crumbs) = @_;
     my $target = shift;      my $const_space = ($env{'request.state'} eq 'construct');
     my $titletable = shift;  
     my $result = '';  
     my ($uname,$thisdisfn);  
     my $const_space = ($ENV{'request.state'} eq 'construct');  
     my $is_const_dir = 0;      my $is_const_dir = 0;
   
     if ($ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }      if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
   
     $Apache::lonxml::registered=1;      $env{'request.registered'} = 1;
   
     my $textinter=($ENV{'browser.interface'} eq 'textual');      undef(@inlineremote);
     my $noremote=($ENV{'environment.remote'} eq 'off');  
       
     my $textual=($textinter || $noremote);  
   
     @inlineremote=();      if ( $env{'request.symb'} && $env{'request.course.id'} ) {
     undef @inlineremote;  
   
     my $reopen=&Apache::lonmenu::reopenmenu();          my ($mapurl,$rid,$resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
           my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
   
     my $newmail='';          my $maptitle = &Apache::lonnet::gettitle($mapurl);
     if ($noremote) {          my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());
  $newmail='<font face="Arial,Helvetica,sans-serif"><table bgcolor="'.$pgbg.'" border="0" cellspacing="1" cellpadding="1" width="100%"><tr><td bgcolor="'.$tabbg.'">';  
     }  #SD
     if (($textual) && ($ENV{'request.symb'}) && ($ENV{'request.course.id'})) {  #course_type only Course and Community?
  my ($mapurl,$rid,$resurl)=&Apache::lonnet::decode_symb($ENV{'request.symb'});  #
         $newmail.=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};          my @crumbs;
         my $maptitle=&Apache::lonnet::gettitle($mapurl);          unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps')
  my $restitle=&Apache::lonnet::gettitle($resurl);                  && ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
         if ($maptitle && $maptitle ne 'default.sequence') {              @crumbs = ({text  => Apache::loncommon::course_type() 
     $newmail.=', '.$maptitle;                                  . ' Contents', 
                           href  => "Javascript:gopost('/adm/navmaps','')"});
         }          }
         if ($restitle) {          if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { 
     $newmail.=': '.$restitle;              push(@crumbs, {text  => '...',
                              no_mt => 1});
         }          }
         $newmail.='&nbsp;&nbsp;&nbsp;';  
     }          push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle 
     if (&Apache::lonmsg::newmail()) {                                                      && $maptitle ne 'default.sequence' 
        $newmail=($textual?                                                     && $maptitle ne $coursetitle);
  '<b><a href="/adm/communicate" target="_top">You have new messages</a></b><br />':  
                           'swmenu.setstatus("you have","messages");');          push @crumbs, {text => $restitle, no_mt => 1} if $restitle; 
     }  
     if ($ENV{'request.state'} eq 'construct') {          &Apache::lonhtmlcommon::clear_breadcrumbs();
         $newmail = $titletable;          &Apache::lonhtmlcommon::add_breadcrumb(@crumbs);
     }  
     if ($noremote) {  
  $newmail.='</td></tr></table></font>';  
     }      }
     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 $tableend=($noremote?'</table></font>':'').($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)) {      return '' unless ( ($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.png','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.png','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 '' &&
     $hwkadd.=&switch('','',7,3,'pparm.gif','problem[_2]','parms[_2]',      &Apache::lonnet::allowed('opa',$crs)) {
       $hwkadd.=&switch('','',7,3,'pparm.png','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 322  sub innerregister { Line 394  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)/) {
   #
   # We have the role of an author
   #
                 # Set defaults for authors                  # Set defaults for authors
                 my ($top,$bottom) = ('con-','struct');                  my ($top,$bottom) = ('con-','struct');
                 my $action = "go('/priv/".$ENV{'user.name'}."');";                  my $action = "go('/priv/".$env{'user.name'}."');";
                 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 344  sub innerregister { Line 430  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;
                 }                  }
             }              }
   #
   # We are an author for some stuff, but currently do not have the role of author.
   # Figure out if we have authoring privileges for the resource we are looking at.
   # This should maybe become a privilege check in lonnet
   #
             ##              ##
             ## Determine if user can edit url.              ## Determine if user can edit url.
             ##              ##
             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'});
                 # Check that the user has permission to edit this resource                  if (defined($cnum) && defined($cdom)) {
                 ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);                      $uploaded = &is_course_upload($file,$cnum,$cdom);
                 if (defined($cfudom)) {                  }
     my $home=&Apache::lonnet::homeserver($cfuname,$cfudom);                  if (!$uploaded) {
     my $allowed=0;                      $file=~s/^($match_domain)\/($match_username)/\/priv\/$2/;
     my @ids=&Apache::lonnet::current_machine_ids();                      # Check that the user has permission to edit this resource
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }                      ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);
     if ($allowed) {                      if (defined($cfudom)) {
                         $cfile=$file;          my $home=&Apache::lonnet::homeserver($cfuname,$cfudom);
           my $allowed=0;
           my @ids=&Apache::lonnet::current_machine_ids();
           foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
           if ($allowed) {
                               $cfile=$file;
                           }
                     }                      }
                 }                  }
             }                      }
             # Finally, turn the button on or off              # Finally, turn the button on or off
             if ($cfile && !$const_space) {              if ($cfile && !$const_space) {
                 $editbutton=&switch                  my $nocrsedit;
                     ('','',6,1,'cstr.gif','edit[_1]','resource[_2]',                  # Suppress display where CC has switched to student role.
                   if ($env{'request.course.id'}) {
                       unless(&Apache::lonnet::allowed('mdc',
                                                       $env{'request.course.id'})) {
                           $nocrsedit = 1;
                       }
                   }
                   if ($nocrsedit) {
                       $editbutton=&clear(6,1);
                   } else {
                       $editbutton=&switch
                          ('','',6,1,'pcstr.png','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.png','edit[_1]',
                                            'resource[_2]',"go('".$cfile."');",
                                            'Edit this resource');
                           }
                       }
                   }
               }
           }
         ###          ###
         ###          ###
 # Prepare the rest of the buttons  # Prepare the rest of the buttons
         my $menuitems;          my $menuitems;
         if ($const_space) {          if ($const_space) {
   #
   # We are in construction space
   #
     my ($uname,$thisdisfn) =      my ($uname,$thisdisfn) =
  ($ENV{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|);   ($env{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|);
             my $currdir = '/priv/'.$uname.'/'.$thisdisfn;              my $currdir = '/priv/'.$uname.'/'.$thisdisfn;
             if ($currdir =~ m-/$-) {              if ($currdir =~ m-/$-) {
                 $is_const_dir = 1;                  $is_const_dir = 1;
             } else {              } else {
                 $currdir =~ s#[^/]+$##;                  $currdir =~ s|[^/]+$||;
    my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn);
    my $esc_currdir = &Apache::loncommon::escape_single($currdir);
   #
   # Probably should be in mydesk.tab
   #
                 $menuitems=(<<ENDMENUITEMS);                  $menuitems=(<<ENDMENUITEMS);
 s&6&1&list.gif&list[_1]&dir[_1]&golist('$currdir')&List current directory  s&6&1&list.png&list[_1]&dir[_1]&golist('$esc_currdir')&List current directory
 s&6&2&rtrv.gif&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$thisdisfn')&Retrieve old version  s&6&2&rtrv.png&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$cleandisfn')&Retrieve old version
 s&6&3&pub.gif&publish[_1]&resource[_1]&gocstr('/adm/publish','/~$uname/$thisdisfn')&Publish this resource  s&6&3&pub.png&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/$thisdisfn')&Delete this resource  s&7&1&del.png&delete[_1]&resource[_2]&gocstr('/adm/cfile?action=delete','/~$uname/$cleandisfn')&Delete this resource
 s&7&2&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout','/~$uname/$thisdisfn')&Prepare a printable document  s&7&2&prt.png&prepare[_1]&printout[_1]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
             }              }
         } else {                  if (ref($bread_crumbs) eq 'ARRAY') {
                       &Apache::lonhtmlcommon::clear_breadcrumbs();
                       foreach my $crumb (@{$bread_crumbs}){
                           &Apache::lonhtmlcommon::add_breadcrumb($crumb);
                       }
                   }
           } elsif ( defined($env{'request.course.id'}) && 
    $env{'request.symb'} ne '' ) {
   #
   # We are in a course and looking at a registred URL
   # Should probably be in mydesk.tab
   #
     $menuitems=(<<ENDMENUITEMS);      $menuitems=(<<ENDMENUITEMS);
 c&3&1  c&3&1
 s&2&1&back.gif&backward[_1]&&gopost('/adm/flip','back:'+currentURL)&Go to the previous resource in the course sequence&1  s&2&1&back.png&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.png&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.png&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.png&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)(\?|$)/) {  
   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.png";
   }else{
    $menuitems.="anot.png";
   }
   $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|viewclasslist|portfolio)(\?|$)/) {
    if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) {
       $menuitems.=(<<ENDREALRES);
   s&6&3&catalog.png&catalog[_2]&info[_1]&catalog_info()&Show Metadata
   ENDREALRES
                   }
         $menuitems.=(<<ENDREALRES);          $menuitems.=(<<ENDREALRES);
 s&6&3&catalog.gif&catalog[_1]&info[_1]&catalog_info()&Show catalog information  s&8&1&eval.png&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.png&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.png&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) {  
 # Registered, textual output  
     my $inlinebuttons='';  
   
     if ($ENV{'browser.interface'} eq 'textual') {  
  $inlinebuttons=  
                         join('',map { (defined($_)?$_:'') } @inlineremote);  
     } else {  
  $inlinebuttons=(<<ENDINLINE);  
 <tr><td>$inlineremote[21]</td><td>&nbsp;</td><td>$inlineremote[23]</td></tr>  
 <tr><td>$inlineremote[61]</td><td>$inlineremote[62]</td><td>$inlineremote[63]</td></tr>  
 <tr><td>$inlineremote[71]</td><td>$inlineremote[72]</td><td>$inlineremote[73]</td></tr>  
 <tr><td>$inlineremote[81]</td><td>$inlineremote[82]</td><td>$inlineremote[83]</td></tr>  
 <tr><td>$inlineremote[91]</td><td>$inlineremote[92]</td><td>$inlineremote[93]</td></tr>  
 ENDINLINE  
     }  
             if ($const_space && $is_const_dir) {  
                 $inlinebuttons = '';  
             }  
     $result =(<<ENDREGTEXT);  
 <script type="text/javascript">  
 // BEGIN LON-CAPA Internal  
 </script>  
 $timesync  
 $newmail  
 $tablestart  
 $inlinebuttons  
 $tableend  
 <script type="text/javascript">  
 // END LON-CAPA Internal  
 </script>  
   
 ENDREGTEXT      my $addremote=0;
 # Registered, graphical output      foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }
         } else {      if ($addremote) {
     my $requri=(split(/\?/,$ENV{'request.noversionuri'}))[0];  
     $requri=&Apache::lonenc::check_encrypt(&Apache::lonnet::unescape($requri));          Apache::lonhtmlcommon::clear_breadcrumb_tools();
     my $cursymb=&Apache::lonenc::check_encrypt($ENV{'request.symb'});  
     my $navstatus=&get_nav_status();              Apache::lonhtmlcommon::add_breadcrumb_tool(
     $result = (<<ENDREGTHIS);                  'navigation', @inlineremote[21,23]);
        
 <script type="text/javascript">          if(hidden_button_check() ne 'yes') {
 // BEGIN LON-CAPA Internal              Apache::lonhtmlcommon::add_breadcrumb_tool(
 var swmenu=null;                  'tools', @inlineremote[93,91,81,82,83]);
   
     function LONCAPAreg() {              #publish button in construction space
   swmenu=$reopen;              if ($env{'request.state'} eq 'construct'){
           swmenu.clearTimeout(swmenu.menucltim);                  Apache::lonhtmlcommon::add_breadcrumb_tool(
           $timesync                       'advtools', @inlineremote[63]);
           $newmail              }else{
           $buttons                  Apache::lonhtmlcommon::add_breadcrumb_tool(
   swmenu.currentURL="$requri";                       'tools', @inlineremote[63]);
           swmenu.reloadURL=swmenu.currentURL+window.location.search;              }
           swmenu.currentSymb="$cursymb";              
           swmenu.reloadSymb="$cursymb";              unless ($env{'request.noversionuri'}=~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {
           swmenu.currentStale=0;                  Apache::lonhtmlcommon::add_breadcrumb_tool(
   $navstatus                      'advtools', @inlineremote[61,71,72,73,92]);
           $hwkadd              }
           $editbutton  
     }  
   
     function LONCAPAstale() {  
   swmenu=$reopen  
           swmenu.currentStale=1;  
           if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) {   
              swmenu.switchbutton  
              (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');  
   }  
           swmenu.clearbut(7,1);  
           swmenu.clearbut(7,2);  
           swmenu.clearbut(7,3);  
           swmenu.menucltim=swmenu.setTimeout(  
  'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+  
  'clearbut(9,1);clearbut(9,3);clearbut(6,3);clearbut(6,1)',  
   2000);  
       }  
   
 // END LON-CAPA Internal  
 </script>  
 ENDREGTHIS  
         }          }
 # =============================================================================  
     } else {  
 # ========================================== This can or will not be registered  
         if ($textual) {  
 # Not registered, textual  
     $result= (<<ENDDONOTREGTEXT);  
 ENDDONOTREGTEXT  
         } else {  
 # Not registered, graphical  
            $result = (<<ENDDONOTREGTHIS);  
   
 <script type="text/javascript">  
 // BEGIN LON-CAPA Internal  
 var swmenu=null;  
   
     function LONCAPAreg() {  
   swmenu=$reopen  
           $timesync  
           swmenu.currentStale=1;  
           swmenu.clearbut(2,1);  
           swmenu.clearbut(2,3);  
           swmenu.clearbut(8,1);  
           swmenu.clearbut(8,2);  
           swmenu.clearbut(8,3);  
           if (swmenu.currentURL) {  
              swmenu.switchbutton  
               (3,1,'reload.gif','return','location','go(currentURL)');  
    } else {  
       swmenu.clearbut(3,1);  
           }  
     }      }
   
     function LONCAPAstale() {      return   Apache::lonhtmlcommon::scripttag('', 'start')
     }             . Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
              . Apache::lonhtmlcommon::scripttag('', 'end');
 // END LON-CAPA Internal  }
 </script>  
 ENDDONOTREGTHIS  sub is_course_upload {
        }      my ($file,$cnum,$cdom) = @_;
 # =============================================================================      my $uploadpath = &LONCAPA::propath($cdom,$cnum);
     }      $uploadpath =~ s{^\/}{};
     return $result;      if (($file =~ m{^\Q$uploadpath\E/userfiles/docs/}) ||
 }          ($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/docs/})) {
           return 1;
 sub loadevents() {      }
     if ($ENV{'request.state'} eq 'construct' ||      return;
  $ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }  }
     return 'LONCAPAreg();';  
 }  sub edit_course_upload {
       my ($file,$cnum,$cdom) = @_;
 sub unloadevents() {      my $cfile;
     if ($ENV{'request.state'} eq 'construct' ||      if ($file =~/\.(htm|html|css|js|txt)$/) {
  $ENV{'request.noversionuri'} eq '/res/adm/pages/menu.html') { return ''; }          my $ext = $1;
     return 'LONCAPAstale();';          my $url = &Apache::lonnet::hreflocation('',$file);
 }          my $home = &Apache::lonnet::homeserver($cnum,$cdom);
           my @ids=&Apache::lonnet::current_machine_ids();
 # ============================================================= Start up remote          my $dest;
           if ($home && grep(/^\Q$home\E$/,@ids)) {
 sub startupremote {              $dest = $url.'?forceedit=1';
     my ($lowerurl)=@_;          } else {
     if (($ENV{'browser.interface'} eq 'textual') ||              unless (&Apache::lonnet::get_locks()) {
         ($ENV{'environment.remote'} eq 'off')) {                  $dest = '/adm/switchserver?otherserver='.
      return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');                          $home.'&role='.$env{'request.role'}.
     }                          '&url='.$url.'&forceedit=1';
 #              }
 # The Remote actually gets launched!          }
 #          if ($dest) {
     my $configmenu=&rawconfig();              $cfile = &HTML::Entities::encode($dest,'"<>&');
     my $esclowerurl=&Apache::lonnet::escape($lowerurl);          }
     my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited');  
     return(<<ENDREMOTESTARTUP);  
 <script type="text/javascript">  
 var timestart;  
 function wheelswitch() {  
     if (typeof(document.wheel) != 'undefined') {  
  if (typeof(document.wheel.spin) != 'undefined') {  
     var date=new Date();  
     var waited=Math.round(30-((date.getTime()-timestart)/1000));  
     document.wheel.spin.value=$message;  
  }  
     }      }
    if (window.status=='|') {       return $cfile;
       window.status='/';   
    } else {  
       if (window.status=='/') {  
          window.status='-';  
       } else {  
          if (window.status=='-') {   
             window.status='\\\\';   
          } else {  
             if (window.status=='\\\\') { window.status='|'; }  
          }  
       }  
    }   
 }  }
   
 // ---------------------------------------------------------- The wait function  
 var canceltim;  
 function wait() {  
    if ((menuloaded==1) || (tim==1)) {  
       window.status='Done.';  
       if (tim==0) {  
          clearTimeout(canceltim);  
          $configmenu  
          window.location='$lowerurl';    
       } else {  
   window.location='/adm/remote?action=collapse&url=$esclowerurl';  
       }  
    } else {  
       wheelswitch();  
       setTimeout('wait();',200);  
    }  
 }  
   
 function main() {  
    canceltim=setTimeout('tim=1;',30000);  
    window.status='-';  
    var date=new Date();  
    timestart=date.getTime();  
    wait();  
 }  
   
 </script>  
 ENDREMOTESTARTUP  
 }  
   
 sub setflags() {  
     return(<<ENDSETFLAGS);  
 <script type="text/javascript">  
     menuloaded=0;  
     tim=0;  
 </script>  
 ENDSETFLAGS  
 }  
   
 sub maincall() {  
     if (($ENV{'browser.interface'} eq 'textual') ||  
         ($ENV{'environment.remote'} eq 'off')) { return ''; }  
     return(<<ENDMAINCALL);  
 <script type="text/javascript">  
     main();  
 </script>  
 ENDMAINCALL  
 }  
   
 sub load_remote_msg {  
     my ($lowerurl)=@_;  
   
     if (($ENV{'browser.interface'} eq 'textual') ||  
         ($ENV{'environment.remote'} eq 'off')) { return ''; }  
   
     my $esclowerurl=&Apache::lonnet::escape($lowerurl);  
     my $link=&mt('<a href="[_1]">Continue</a> on in Inline Menu mode',  
     "/adm/remote?action=collapse?url=$esclowerurl");  
     return(<<ENDREMOTEFORM);  
 <p>  
 <form name="wheel">  
 <input name="spin" type="text" size="60" />  
 </form>  
 </p>  
 <p>$link</p>  
 ENDREMOTEFORM  
 }  
 # ================================================================= Reopen menu  
   
 sub reopenmenu {  
    if (($ENV{'browser.interface'} eq 'textual') ||  
        ($ENV{'environment.remote'} eq 'off')) { return ''; }  
    my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};  
    my $nothing = &Apache::lonhtmlcommon::javascript_nothing();  
    return('window.open('.$nothing.',"'.$menuname.'","",false);');  
 }   
   
 # =============================================================== Open the menu  
   
 sub open {  
     my $returnval='';  
     if (($ENV{'browser.interface'} eq 'textual') ||  
         ($ENV{'environment.remote'} eq 'off')) {   
  return '<script type="text/javascript">self.name="loncapaclient";</script>';  
     }  
     my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};  
     unless (shift eq 'unix') {  
 # resizing does not work on linux because of virtual desktop sizes  
        $returnval.=(<<ENDRESIZE);  
 if (window.screen) {  
     self.resizeTo(screen.availWidth-215,screen.availHeight-55);  
     self.moveTo(190,15);  
 }  
 ENDRESIZE  
     }  
     $returnval.=(<<ENDOPEN);  
 window.status='Opening LON-CAPA Remote Control';  
 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");  
 self.name='loncapaclient';  
 ENDOPEN  
     return '<script type="text/javascript">'.$returnval.'</script>';  
 }  
   
   
 # ================================================================== Raw Config  # ================================================================== Raw Config
   
 sub clear {  sub clear {
     my ($row,$col)=@_;      my ($row,$col)=@_;
     unless (($ENV{'browser.interface'} eq 'textual') ||      $inlineremote[10*$row+$col]='';
             ($ENV{'environment.remote'} eq 'off')) {      return ''; 
        return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););  
    } else {   
        $inlineremote[10*$row+$col]='';  
        return '';   
    }  
 }  }
   
 # ============================================ Switch a button or create a link  # ============================================ Switch a button or create a link
Line 725  sub clear { Line 685  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);      my $idx=10*$row+$col;
     unless (($ENV{'browser.interface'} eq 'textual')  ||      $category_members{$cat}.=':'.$idx;
             ($ENV{'environment.remote'} eq 'off')) {  
 # Remote  # Inline Menu
        return "\n".      if ($nobreak==2) { return ''; }
  qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););      my $text=$top.' '.$bot;
    } elsif ($ENV{'browser.interface'} eq 'textual') {      $text=~s/\s*\-\s*//gs;
 # Accessibility  
        if ($nobreak==2) { return ''; }      my $pic=
        my $text=$top.' '.$bot;     '<img alt="'.$text.'" src="'.
        $text=~s/\s*\-\s*//gs;     &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).
        if ($nobreak) {     '" align="'.($nobreak==3?'right':'left').'" class="LC_icon" />';
    $inlineremote[10*$row+$col]=      if ($env{'browser.interface'} eq 'faketextual') {
        '<a href="javascript:'.$act.';">'.$text.'</a>';  # Main Menu
        } else {  
    $inlineremote[10*$row+$col]="\n<br />".  
        $desc.' <a href="javascript:'.$act.';">'.$text.'</a>';  
        }  
    } else {  
 # Inline Remote  
        if ($nobreak==2) { return ''; }  
        my $text=$top.' '.$bot;  
        $text=~s/\s*\-\s*//gs;  
   
        my $lonhttpdPort=$Apache::lonnet::perlvar{'lonhttpdPort'};  
        if (!defined($lonhttpdPort)) { $lonhttpdPort='8080'; }  
        my $pic=  
    '<img border="0" alt="'.$text.'" src="http://'.$ENV{'HTTP_HOST'}.  
    ':'.$lonhttpdPort.'/res/adm/pages/'.$img.'" align="'.  
    ($nobreak==3?'right':'left').'" />';  
        if (($ENV{'browser.interface'} eq 'textual') || ($ENV{'browser.interface'} eq 'faketextual')) {  
 # 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 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 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 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]=        $inlineremote[$idx]=
    '<a href="javascript:'.$act.';">'.$pic.         '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.
    '</a><font color="'.$font.'" size="2">'.$desc.         '<span class="LC_menubuttons_inline_text">'.$desc.'</span></a>';
    '</font>';      }
        }  
    }  
     return '';      return '';
 }  }
   
 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 {  
     my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};  
     if (($ENV{'browser.interface'} eq 'textual') ||  
         ($ENV{'environment.remote'} eq 'off')) { return ''; }  
     my $nothing = &Apache::lonhtmlcommon::javascript_nothing();  
     return "window.open(".$nothing.",'".$menuname."');";  
 }  
   
 sub inlinemenu {  sub inlinemenu {
     @inlineremote=();      undef(@inlineremote);
     undef @inlineremote;      undef(%category_members);
   # calling rawconfig with "1" will evaluate mydesk.tab, even if there is no active remote control
     &rawconfig(1);      &rawconfig(1);
     return join('',map { (defined($_)?$_:'') } @inlineremote);      my $output='<table><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><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';
                  $output.='<div class="LC_Box LC_400Box">';
          $output.='<h3 class="LC_hcell">'.&mt($category_names{$cat}).'</h3>';
                  $output.='<table>';
                  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.='</div>';
               }
            }
            $output.="</td>";
       }
       $output.="</tr></table>";
       return $output;
 }  }
   
 sub rawconfig {  sub rawconfig {
   #
   # This evaluates mydesk.tab
   # Need to add more positions and more privileges to deal with all
   # menu items.
   #
     my $textualoverride=shift;      my $textualoverride=shift;
     my $output='';      my $output='';
     unless (($ENV{'browser.interface'} eq 'textual') ||      return '' unless $textualoverride;
             ($ENV{'environment.remote'} eq 'off')) {      my $uname=$env{'user.name'};
        $output.=      my $udom=$env{'user.domain'};
  "window.status='Opening Remote Control';var swmenu=".&openmenu().      my $adv=$env{'user.adv'};
 "\nwindow.status='Configuring Remote Control ';";      my $show_course=&Apache::loncommon::show_course();
     } else {      my $author=$env{'user.author'};
        unless ($textualoverride) { return ''; }  
     }  
     my $uname=$ENV{'user.name'};  
     my $udom=$ENV{'user.domain'};  
     my $adv=$ENV{'user.adv'};  
     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;           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') {          } elsif ($pro eq 'course')  {
             if ($ENV{'request.course.fn'}) {              if (($env{'request.course.fn'}) && ($crstype ne 'Community')) {
                $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
     }      }
           } elsif ($pro eq 'community')  {
               if (($env{'request.course.fn'}) && ($crstype eq 'Community')) {
                  $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
               }
         } elsif ($pro =~ /^courseenv_(.*)$/) {          } elsif ($pro =~ /^courseenv_(.*)$/) {
             my $key = $1;              my $key = $1;
             if ($ENV{'course.'.$ENV{'request.course.id'}.'.'.$key}) {              if ($crstype ne 'Community') {
                 $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);                  my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
                   if ($key eq 'canuse_pdfforms') {
                       if ($env{'request.course.id'} && $coursepref eq '') {
                           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                           $coursepref = $domdefs{'canuse_pdfforms'};
                       }
                   }
                   if ($coursepref) { 
                       $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
                   }
               }
           } elsif ($pro =~ /^communityenv_(.*)$/) {
               my $key = $1;
               if ($crstype eq 'Community') {
                   my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
                   if ($key eq 'canuse_pdfforms') {
                       if ($env{'request.course.id'} && $coursepref eq '') {
                           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                           $coursepref = $domdefs{'canuse_pdfforms'};
                       }
                   }
                   if ($coursepref) { 
                       $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
                   }
             }              }
         } elsif ($pro =~ /^course_(.*)$/) {          } elsif ($pro =~ /^course_(.*)$/) {
             # Check for permissions inside of a course              # Check for permissions inside of a course
             if (($ENV{'request.course.id'}) &&              if (($env{'request.course.id'}) && ($crstype ne 'Community') && 
                 (&Apache::lonnet::allowed($1,$ENV{'request.course.id'}.                  (&Apache::lonnet::allowed($1,$env{'request.course.id'}.
             ($ENV{'request.course.sec'}?'/'.$ENV{'request.course.sec'}:''))              ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))
                  )) {                   )) {
                 $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);                  $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 906  sub rawconfig { Line 929  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') ||  
             ($ENV{'environment.remote'} eq 'off')) {  
        $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;
 }  }
   
 # ======================================================================= Close  sub check_for_rcrs {
       my $showreqcrs = 0;
 sub close {      my @reqtypes = ('official','unofficial','community');
     if (($ENV{'browser.interface'} eq 'textual') ||      foreach my $type (@reqtypes) {
         ($ENV{'environment.remote'} eq 'off')) { return ''; }          if (&Apache::lonnet::usertools_access($env{'user.name'},
     my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};                                                $env{'user.domain'},
     return(<<ENDCLOSE);                                                $type,undef,'requestcourses')) {
 <script type="text/javascript">              $showreqcrs = 1;
 window.status='Accessing Remote Control';              last;
 menu=window.open("/adm/rat/empty.html","$menuname",          }
                  "height=350,width=150,scrollbars=no,menubar=no");      }
 window.status='Disabling Remote Control';      if (!$showreqcrs) {
 menu.active=0;          foreach my $type (@reqtypes) {
 menu.autologout=0;              if ($env{'environment.reqcrsotherdom.'.$type} ne '') {
 window.status='Closing Remote Control';                  $showreqcrs = 1;
 menu.close();                  last;
 window.status='Done.';              }
 </script>          }
 ENDCLOSE      }
       return $showreqcrs;
 }  }
   
 # ====================================================================== Footer  sub dc_popup_js {
       my %lt = &Apache::lonlocal::texthash(
 sub footer {                                            more => '(More ...)',
                                             less => '(Less ...)',
                                           );
       return <<"END";
   
   function showCourseID() {
       document.getElementById('dccid').style.display='block';
       document.getElementById('dccid').style.textAlign='left';
       document.getElementById('dccid').style.textFace='normal';
       document.getElementById('dccidtext').innerHTML ='<a href="javascript:hideCourseID();">$lt{'less'}</a>';
       return;
 }  }
   
 sub nav_control_js {  function hideCourseID() {
     my $nav=($ENV{'environment.remotenavmap'} eq 'on');      document.getElementById('dccid').style.display='none';
     return (<<NAVCONTROL);      document.getElementById('dccidtext').innerHTML ='<a href="javascript:showCourseID()">$lt{'more'}</a>';
     var w_loncapanav_flag="$nav";      return;
   }
   
   END
   
 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 {
     my $caller = shift;      my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
     unless (($ENV{'browser.interface'} eq 'textual')  ||      if ($currenturl =~ m{^/adm/wrapper/ext/}
         ($ENV{'environment.remote'} eq 'off') || ($caller eq '/adm/menu')) { return ''; }          && $env{'request.external.querystring'} ) {
     my $currenturl=&Apache::lonenc::check_encrypt($ENV{'request.noversionuri'});              $currenturl .= ($currenturl=~/\?/)?'&':'?'.$env{'request.external.querystring'};
       }
       $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));
           
     my $currentsymb=&Apache::lonenc::check_encrypt($ENV{'request.symb'});      my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
     my $nav_control=&nav_control_js();  
       my $dc_popup_cid;
       if ($env{'user.adv'} && exists($env{'user.role.dc./'.
                           $env{'course.'.$env{'request.course.id'}.
                                    '.domain'}.'/'})) {
           $dc_popup_cid = &dc_popup_js();
       }
   
       my $start_page_annotate = 
           &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  $dc_popup_cid
   
 function go(url) {  function go(url) {
    if (url!='' && url!= null) {     if (url!='' && url!= null) {
Line 1020  function gocstr(url,filename) { Line 1092  function gocstr(url,filename) {
         this.document.cstrdelete.submit();          this.document.cstrdelete.submit();
         return;          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 !='') {      if (url !='') {
         this.document.constspace.filename.value = filename;          this.document.constspace.filename.value = filename;
         this.document.constspace.action = url;          this.document.constspace.action = url;
Line 1042  function catalog_info() { Line 1140  function catalog_info() {
 }  }
   
 function chat_win() {  function chat_win() {
    lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');     lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=480,resizable=yes,location=no,menubar=no,toolbar=no');
   }
   
   function group_chat(group) {
      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=500,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 1068  sub constspaceform { Line 1214  sub constspaceform {
 <input type="hidden" name="action" value="delete" />   <input type="hidden" name="action" value="delete" /> 
 <input type="hidden" name="filename" value="" />  <input type="hidden" name="filename" value="" />
 </form>  </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  ENDCONSTSPACEFORM
 }  }
   
   sub hidden_button_check {
       if ( $env{'request.course.id'} eq ''
            || $env{'request.role.adv'} ) {
   
 sub get_nav_status {          return;
     my $navstatus="swmenu.w_loncapanav_flag=";  
     if ($ENV{'environment.remotenavmap'} eq 'on') {  
  $navstatus.="1";  
     } else {  
  $navstatus.="-1";  
     }      }
     return $navstatus;      my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide');
       return $buttonshide; 
 }  }
   
 # ================================================ Handler when called directly  sub roles_selector {
       my ($cdom,$cnum) = @_;
       my $crstype = &Apache::loncommon::course_type();
 sub handler {      my $now = time;
     my $r = shift;      my (%courseroles,%seccount);
     &Apache::loncommon::content_type($r,'text/html');      my $is_cc;
     $r->send_http_header;      my $role_selector;
     return OK if $r->header_only;      my $ccrole;
       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;
   }
   
     my $form;  sub get_all_courseroles {
     if ($ENV{'environment.remote'} ne 'off' &&      my ($cdom,$cnum,$courseroles,$seccount) = @_;
  $ENV{'browser.interface'} ne 'textual') {      unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH')) {
  $form=&serverform();          return;
     }      }
     my $bodytag=&Apache::loncommon::bodytag('Main Menu');      my ($result,$cached) = 
     my $function='student';          &Apache::lonnet::is_cached_new('getcourseroles',$cdom.'_'.$cnum);
     if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) {      if (defined($cached)) {
  $function='coordinator';          if (ref($result) eq 'HASH') {
               if ((ref($result->{'roles'}) eq 'HASH') && 
                   (ref($result->{'seccount'}) eq 'HASH')) {
                   %{$courseroles} = %{$result->{'roles'}};
                   %{$seccount} = %{$result->{'seccount'}};
                   return;
               }
           }
     }      }
     if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) {      my %gotnosection;
  $function='admin';      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);
               }
           }
     }      }
     if (($ENV{'request.role'}=~/^(au|ca)/) ||      my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum,['st']);
  ($ENV{'request.noversionuri'}=~/^(\/priv|\~)/)) {      @{$courseroles->{'st'}} = ();
  $function='author';      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";
           }
     }      }
     my $domain=&Apache::loncommon::determinedomain();      return <<"END";
     $pgbg=&Apache::loncommon::designparm($function.'.pgbg',$domain);  
     $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);  
     $font=&Apache::loncommon::designparm($function.'.font',$domain);  
     my $script_tag;  
     if ($ENV{'environment.remote'} eq 'on') {  
         my $utility=&utilityfunctions('/adm/menu');  
         $script_tag=(<<ENDSCRIPT);  
 <script type="text/javascript">  <script type="text/javascript">
 $utility  //<![CDATA[
 </script>  function adhocRole(roleitem) {
 ENDSCRIPT      $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;
           }
     }      }
 # ---- Print the screen, pretend to be in text mode to generate text-based menu      var secok = 1;
     unless ($ENV{'browser.interface'} eq 'textual') {      var secchoice = '';
  $ENV{'browser.interface'}='faketextual';      if (selidx >= 0) {
  $ENV{'environment.remote'}='off';          if (numsec[selidx] > 1) {
     }              secok = 0;
     $r->print(<<ENDHEADER);              var numrolesec = rolesections[selidx].length;
 <html><head>              var msgidx = numsec[selidx] - numrolesec;
 <title>LON-CAPA Main Menu</title>              secchoice = prompt("$lt{'this'}\\n"+secpick[msgidx]+"\\n$lt{'avai'} "+roleseclist[selidx],"");
 $script_tag              if (secchoice == '') {
 </head>                  if (msgidx > 0) {
 $bodytag                      secok = 1;
 ENDHEADER                  }
     $r->print('<table>'.&inlinemenu().'</table>'.$form);              } else {
     $r->print('</body></html>');                  for (var j=0; j<rolesections[selidx].length; j++) {
     return OK;                      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
 }  }
   
   
 # ================================================================ 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];
                       } elsif ($configline=~/^prim\:/) {
                           my @entries = (split(/\:/, $configline))[1..5];
                           push @primary_menu, \@entries;
                       } elsif ($configline=~/^scnd\:/) {
                           my @entries = (split(/\:/, $configline))[1..5];
                           push @secondary_menu, \@entries; 
                       } elsif ($configline) {
                           push(@desklines,$configline);
                       }
                   }
                   CORE::close($config);
             }              }
         }          }
         CORE::close($config);          $readdesk='done';
     }      }
    }  
    $readdesk='done';  
   }  
 }  }
   
 1;  1;
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.135  
changed lines
  Added in v.1.326


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