Diff for /loncom/interface/lonmenu.pm between versions 1.11 and 1.247

version 1.11, 2001/12/19 17:17:46 version 1.247, 2008/12/04 13:41:37
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (TeX Conversion Module  
 #  #
 # 05/29/00,05/30 Gerd Kortemeyer)  # There are two parameters controlling the action of this module:
 #  #
 # 10/05,05/28,05/30,06/01,06/08,06/09,07/04,08/07 Gerd Kortemeyer  # 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 SUBROUTINES
   
   =over
   
   =item show_course()
   
   Little texts
   
   =item initlittle()
   
   =item menubuttons()
   
   This gets called at the top of the body section
   
   =item show_return_link()
   
   =item registerurl()
   
   This gets called in the header section
   
   =item innerregister()
   
   This gets called in order to register a URL, both with the Remote
   and in the body of the document
   
   =item loadevents()
   
   =item unloadevents()
   
   =item startupremote()
   
   =item setflags()
   
   =item maincall()
   
   =item load_remote_msg()
   
   =item get_menu_name()
   
   =item reopenmenu()
   
   =item open()
   
   Open the menu
   
   =item clear()
   
   =item switch()
   
   Switch a button or create a link
   Switch acts on the javascript that is executed when a button is clicked.  
   The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".
   
   =item secondlevel()
   
   =item openmenu()
   
   =item inlinemenu()
   
   =item rawconfig()
   
   =item close()
   
   =item footer()
   
   =item utilityfunctions()
   
   =item serverform()
   
   =item constspaceform()
   
   =item get_nav_status()
   
   =item convert_menu_function()
   
   FIXME this needs to move into mydesktab and the other locations 
   the text is generated
   
   =item hidden_button_check()
   
   =item roles_selector()
   
   =item jump_to_role()
   
   =back
   
   =cut
   
 package Apache::lonmenu;  package Apache::lonmenu;
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::File;  use Apache::lonhtmlcommon();
 use vars qw(@desklines $readdesk);  use Apache::loncommon();
    use Apache::lonenc();
 # =============================================================== Open the menu  use Apache::lonlocal;
   use LONCAPA qw(:DEFAULT :match);
   
 sub open {  use vars qw(@desklines %category_names %category_members %category_positions $readdesk);
     return(<<ENDOPEN);  
 <script>  
 window.status='MenuControl:nologout';  my @inlineremote;
 menu=window.open("/res/adm/pages/menu.html","LONCAPAmenu",  
                  "height=350,width=150,scrollbars=no,menubar=no");  
   
   sub show_course {
       my $course = !$env{'user.adv'};
       if (!$env{'user.adv'}) {
    foreach my $env (keys(%env)) {
       next if ($env !~ m/^user\.priv\./);
       if ($env !~ m/^user\.priv\.(?:st|cm)/) {
    $course = 0;
    last;
       }
    }
       }
       return $course;
   }
   
   sub initlittle {
       return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',
          'nav' => 'Navigate Contents',
          'main' => 'Main Menu',
                                          'roles' => (&show_course()?
                                                       'Courses':'Roles'),
                                          'other' => 'Other Roles',
                                          'docs' => 'Edit Course',
                                          'exit' => 'Exit',
                                          'login' => 'Log In',
          'launch' => 'Launch Remote Control',
                                          'groups' => 'Groups',
                                          'gdoc' => 'Group Documents',
                                          );
   }
   
   sub menubuttons {
       my $forcereg=shift;
       my $registration=shift;
       my $titletable=shift;
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
       ['inhibitmenu']);
       if (($env{'form.inhibitmenu'} eq 'yes') ||
           ($ENV{'REQUEST_URI'} eq '/adm/logout')) { return ''; }
   
       if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
   
       my %lt=&initlittle();
       my $navmaps='';
       my $reloadlink='';
       my $docs='';
       my $groups='';
       my $roles='<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>';
       my $role_selector;
       my $showgroups=0;
       my ($cnum,$cdom);
       my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));
       my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));
   
       my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif");
       $logo = '<td class="LC_top_nav_logo"><a href="/adm/about.html"><img src="'.
    $logo.'" alt="LON-CAPA Logo" class="noBorder" /></a></td>';
   
       if ($env{'request.state'} eq 'construct') {
           if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) {
               my $returnurl = $env{'request.filename'};
               $returnurl =~ s:^/home/([^/]+)/public_html/(.*)$:/priv/$1/$2:;
               $escurl = &escape($returnurl);
           }
       }
       if ($env{'request.course.id'}) {
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           my %coursegroups;
           my $viewgrps_permission =
       &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
           if (!$viewgrps_permission) {
               %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum);
    }
           if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) {
               $showgroups = 1;
           }
           $role_selector = &roles_selector($cdom,$cnum);
           if ($role_selector) {
               $roles = '<span class="LC_nobreak">'.$role_selector.'&nbsp;&nbsp;<a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></span>';
           }
       }
   
       if ($env{'browser.interface'} eq 'textual') {
   # Textual display only
           if ($env{'request.course.id'}) {
       $navmaps=(<<ENDNAV);
   <a href="/adm/navmaps?postdata=$escurl&amp;postsymb=$escsymb" target="_top">$lt{'nav'}</a>
   ENDNAV
               if (&show_return_link()) {
                   my $escreload=&escape('return:');
                   $reloadlink=(<<ENDRELOAD);
   <a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a>
   ENDRELOAD
               }
       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                  $docs=(<<ENDDOCS);
   <a href="/adm/coursedocs" target="_top">$lt{'docs'}</a>
   ENDDOCS
               }
               if ($showgroups) {
                   $groups =(<<ENDGROUPS);
   <a href="/adm/coursegroups" target="_top">$lt{'groups'}</a>
   ENDGROUPS
               }
    }
           my $form=&serverform();
           my $utility=&utilityfunctions();
    my $output=(<<ENDMAINMENU);
   <script type="text/javascript">
   // BEGIN LON-CAPA Internal
   $utility
 </script>  </script>
 ENDOPEN  <div id="LC_top_nav">
   <a href="/adm/menu" target="_top">$lt{'main'}</a>
   $reloadlink $navmaps $docs $groups $roles
   <a href="/adm/logout" target="_top">$lt{'exit'}</a>
   </div>
   <br />
   <script type="text/javascript">
   // END LON-CAPA Internal
   </script>
   $form
   ENDMAINMENU
           if ($registration) { $output.=&innerregister($forcereg); }
    return $output."<hr />";
       } elsif ($env{'environment.remote'} eq 'off') {
   # Remote Control is switched off
   # figure out colors
    my %lt=&initlittle();
   
           my $domain=&Apache::loncommon::determinedomain();
    my $function =&Apache::loncommon::get_users_function();
           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);
    if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') {
       return (<<ENDINLINEMENU);
      <table id="LC_top_nav">
       <tr>
         $logo
         <td></td>
         <td class="LC_top_nav_login">
           <a href="/adm/roles" target="_top">$lt{'login'}</a>
        </td>
       </tr>
     </table>
   ENDINLINEMENU
           }
           $roles = '<td><a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a></td>';
   # Do we have a NAV link?
           if ($env{'request.course.id'}) {
       my $link='/adm/navmaps?postdata='.$escurl.'&amp;postsymb='.
    $escsymb;
       if ($env{'environment.remotenavmap'} eq 'on') {
    $link="javascript:gonav('".$link."')";
       }
       $navmaps=(<<ENDNAV);
   <td><a href="$link" target="_top">$lt{'nav'}</a></td>
   ENDNAV
               my $is_group = (&Apache::loncommon::course_type() eq 'Group');
       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                   my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'};
    $docs=(<<ENDDOCS);
   <td><a href="/adm/coursedocs" target="_top">$text</a></td>
   ENDDOCS
               }
               if ($showgroups) {
                   $groups =(<<ENDGROUPS);
   <td><a href="/adm/coursegroups" target="_top">$lt{'groups'}</a></td>
   ENDGROUPS
               }
       if (&show_return_link()) {
                   my $escreload=&escape('return:');
                   $reloadlink=(<<ENDRELOAD);
   <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>
   ENDRELOAD
               }
               if ($role_selector) {
                   $roles = '<td>'.$role_selector.'</td><td><a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></td>';
               }
           }
    if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) {
       my $escreload=&escape('return:');
       $reloadlink=(<<ENDCRELOAD);
   <td><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></td>
   ENDCRELOAD
           }
           my $reg='';
           if ($registration) {
              $reg=&innerregister($forcereg,$titletable);
           }
           my $form=&serverform();
    my $utility=&utilityfunctions();
   
           my $helplink=&Apache::loncommon::top_nav_help('Help');
    return (<<ENDINLINEMENU);
   <script type="text/javascript">
   // BEGIN LON-CAPA Internal
   // <![CDATA[
   $utility
   // ]]>
   </script>
   <table id="LC_top_nav">
   <tr>
   $logo
   <td><a href="/adm/menu" target="_top">$lt{'main'}</a></td>
   $reloadlink
   $navmaps
   $docs
   $groups
   $roles
   <td style="width: 2.0em;">$helplink</td>
   <td style="width: 2.0em;"><a href="/adm/logout" target="_top">$lt{'exit'}</a></td>
   </tr>
   </table>
   $form
   <script type="text/javascript">
   // END LON-CAPA Internal
   </script>
   $reg
   ENDINLINEMENU
       } else {
    return '';
       }
   }
   
   sub show_return_link {
       return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
        $env{'request.symb'} eq '')
       ||
       ($env{'request.noversionuri'}=~ m{^/cgi-bin/printout.pl})
       ||
       (($env{'request.noversionuri'}=~/^\/adm\//) &&
        ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
        ($env{'request.noversionuri'}!~
         m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)])
        ));
   }
   
   
   sub registerurl {
       my ($forcereg) = @_;
       my $result = '';
       if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
       my $force_title='';
       if ($env{'request.state'} eq 'construct') {
    $force_title=&Apache::lonxml::display_title();
       }
       if (($env{'browser.interface'} eq 'textual') ||
           ($env{'environment.remote'} eq 'off') ||
           ((($env{'request.publicaccess'}) || 
            (!&Apache::lonnet::is_on_map(
      &unescape($env{'request.noversionuri'})))) &&
           (!$forcereg))) {
     return $result.
             '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>'.$force_title;
       }
   # Graphical display after login only
       if ($env{'request.registered'} && !$forcereg) { return ''; }
       $result.=&innerregister($forcereg);
       return $result.$force_title;
 }  }
   
 # ============================================================ Switch Menu Item  sub innerregister {
       my ($forcereg, $titletable) = @_;
       my $result = '';
       my ($uname,$thisdisfn);
       my $const_space = ($env{'request.state'} eq 'construct');
       my $is_const_dir = 0;
   
       if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
   
       $env{'request.registered'} = 1;
   
       my $textinter=($env{'browser.interface'} eq 'textual');
       my $noremote=($env{'environment.remote'} eq 'off');
       
       my $textual=($textinter || $noremote);
   
       undef(@inlineremote);
   
 sub switchmenu {      my $reopen=&Apache::lonmenu::reopenmenu();
     my ($row,$col,$imgsrc,$texttop,$textbot,$action)=@_;  
     return(<<ENDSMENU);      my $newmail='';
 <script>      if ($noremote) {
    swmenu=window.open('','LONCAPAmenu');   $newmail='<table id="LC_nav_location"><tr>';
    swmenu.switchbutton($row,$col,"$imgsrc","$texttop","$textbot","$action");      }
       if (&Apache::lonmsg::newmail()) { 
    if ($textual) {
       $newmail.= '<td class="LC_new_mail">
                      <a href="/adm/communicate" target="_top">'.
      &mt('You have new messages').'</a></td>';
    } else {
       $newmail= 'swmenu.setstatus("you have","messages");';
    }
       } 
       if (($textual) 
        && ($env{'request.symb'}) 
        && ($env{'request.course.id'})) {
    $newmail.= '<td class="LC_current_location">';
    my ($mapurl,$rid,$resurl)=
       &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
           my $coursetitle=$env{'course.'.$env{'request.course.id'}.'.description'};
           $newmail.=$coursetitle;
           my $maptitle=&Apache::lonnet::gettitle($mapurl);
    my $restitle=&Apache::lonnet::gettitle(&Apache::lonnet::symbread());
           if ($maptitle && ($maptitle ne 'default.sequence') && ($maptitle ne $coursetitle)) {
       $newmail.=', '.$maptitle;
           }
           if ($restitle) {
       $newmail.=': '.$restitle;
           }
           $newmail.='&nbsp;&nbsp;&nbsp;</td>';
       }
       if ($env{'request.state'} eq 'construct') {
           $newmail = $titletable;
       } else {
    if ($noremote) {
       $newmail.='</tr></table>';
    }
       }
       my $timesync=($textual?'':'swmenu.syncclock(1000*'.time.');');
       my $tablestart=($noremote?'<table id="LC_menubuttons">':'').
    ($textinter?'<br /><a href="#content">'.&mt('Skip to Content').'</a><br />':'');
       my $tableend=($noremote?'</table>':'').($textinter?'<a name="content" />':'');
   # =============================================================================
   # ============================ This is for URLs that actually can be registered
       if (($env{'request.noversionuri'}!~m|^/(res/)*adm/|) || ($forcereg)) {
   # -- This applies to homework problems for users with grading privileges
    my $crs='/'.$env{'request.course.id'};
    if ($env{'request.course.sec'}) {
       $crs.='_'.$env{'request.course.sec'};
    }
    $crs=~s/\_/\//g;
   
           my $hwkadd='';
           if ($env{'request.symb'} ne '' &&
       $env{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form|task)$/) {
       if (&Apache::lonnet::allowed('mgr',$crs)) {
    $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_3]',
                          "gocmd('/adm/grades','gradingmenu')",
                          'Modify user grades for this assessment resource');
               } elsif (&Apache::lonnet::allowed('vgr',$crs)) {
    $hwkadd.=&switch('','',7,2,'subm.gif','view sub-[_1]','missions[_1]',
                          "gocmd('/adm/grades','submission')",
          'View user submissions for this assessment resource');
               }
    }
    if ($env{'request.symb'} ne '' &&
       &Apache::lonnet::allowed('opa',$crs)) {
       $hwkadd.=&switch('','',7,3,'pparm.gif','problem[_2]','parms[_2]',
        "gocmd('/adm/parmset','set')",
        'Modify parameter settings for this resource');
    }
   # -- End Homework
           ###
           ### Determine whether or not to display the 'cstr' button for this
           ### resource
           ###
           my $editbutton = '';
           if ($env{'user.author'}) {
               if ($env{'request.role'}=~/^(aa|ca|au)/) {
                   # Set defaults for authors
                   my ($top,$bottom) = ('con-','struct');
                   my $action = "go('/priv/".$env{'user.name'}."');";
                   my $cadom  = $env{'request.role.domain'};
                   my $caname = $env{'user.name'};
                   my $desc = "Enter my construction space";
                   # Set defaults for co-authors
                   if ($env{'request.role'} =~ /^ca/) { 
                       ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);
                       ($top,$bottom) = ('co con-','struct');
                       $action = "go('/priv/".$caname."');";
                       $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
                   my $home = &Apache::lonnet::homeserver($caname,$cadom);
    my $allowed=0;
    my @ids=&Apache::lonnet::current_machine_ids();
    foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
    if (!$allowed) {
       $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc);
                   }
               }
               ##
               ## Determine if user can edit url.
               ##
               my $cfile='';
               my $cfuname='';
               my $cfudom='';
               if ($env{'request.filename'}) {
                   my $file=&Apache::lonnet::declutter($env{'request.filename'});
                   $file=~s/^($match_domain)\/($match_username)/\/priv\/$2/;
                   # Check that the user has permission to edit this resource
                   ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);
                   if (defined($cfudom)) {
       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
               if ($cfile && !$const_space) {
                   $editbutton=&switch
                       ('','',6,1,'pcstr.gif','edit[_1]','resource[_2]',
                        "go('".$cfile."');","Edit this resource");
               } elsif ($editbutton eq '') {
                   $editbutton=&clear(6,1);
               }
           }
           ###
           ###
   # Prepare the rest of the buttons
           my $menuitems;
           if ($const_space) {
       my ($uname,$thisdisfn) =
    ($env{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|);
               my $currdir = '/priv/'.$uname.'/'.$thisdisfn;
               if ($currdir =~ m-/$-) {
                   $is_const_dir = 1;
               } else {
                   $currdir =~ s#[^/]+$##;
    my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn);
    my $esc_currdir = &Apache::loncommon::escape_single($currdir);
                   $menuitems=(<<ENDMENUITEMS);
   s&6&1&list.gif&list[_1]&dir[_1]&golist('$esc_currdir')&List current directory
   s&6&2&rtrv.gif&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$cleandisfn')&Retrieve old version
   s&6&3&pub.gif&publish[_1]&resource[_1]&gocstr('/adm/publish','/~$uname/$cleandisfn')&Publish this resource
   s&7&1&del.gif&delete[_1]&resource[_2]&gocstr('/adm/cfile?action=delete','/~$uname/$cleandisfn')&Delete this resource
   s&7&2&prt.gif&prepare[_1]&printout[_1]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document
   ENDMENUITEMS
               }
           } elsif ( defined($env{'request.course.id'}) && 
    $env{'request.symb'} ne '' ) {
       $menuitems=(<<ENDMENUITEMS);
   c&3&1
   s&2&1&back.gif&backward[_1]&&gopost('/adm/flip','back:'+currentURL)&Go to the previous resource in the course sequence&&1
   s&2&3&forw.gif&forward[_1]&&gopost('/adm/flip','forward:'+currentURL)&Go to the next resource in the course sequence&&3
   c&6&3
   c&8&1
   c&8&2
   s&8&3&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
   s&9&1&sbkm.gif&set[_1]&bookmark[_2]&set_bookmark()&Set a bookmark for this resource&&1
   ENDMENUITEMS
   
   my $currentURL = &Apache::loncommon::get_symb();
   my ($symb_old,$symb_old_enc) = &Apache::loncommon::clean_symb($currentURL);
   my $annotation = &Apache::loncommon::get_annotation($symb_old,$symb_old_enc);
   $menuitems.="s&9&3&";
   if(length($annotation) > 0){
    $menuitems.="anot2.gif";
   }else{
    $menuitems.="anot.gif";
   }
   $menuitems.="&anno-[_1]&tations[_1]&annotate()&";
   $menuitems.="Make notes and annotations about this resource&&1\n";
   
               unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) {
    if (!$env{'request.enc'}) {
       $menuitems.=(<<ENDREALRES);
   s&6&3&catalog.gif&catalog[_1]&info[_1]&catalog_info()&Show catalog information
   ENDREALRES
                   }
           $menuitems.=(<<ENDREALRES);
   s&8&1&eval.gif&evaluate[_1]&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
   s&8&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
       }
           }
    if ($env{'request.uri'} =~ /^\/res/) {
       $menuitems .= (<<ENDMENUITEMS);
   s&8&3&prt.gif&prepare[_1]&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
   ENDMENUITEMS
    }
           my $buttons='';
           foreach (split(/\n/,$menuitems)) {
       my ($command,@rest)=split(/\&/,$_);
               my $idx=10*$rest[0]+$rest[1];
               if (&hidden_button_check() eq 'yes') {
                   if ($idx == 21 ||$idx == 23) {
                       $buttons.=&switch('','',@rest);
                   } else {
                       $buttons.=&clear(@rest);
                   }
               } else {  
                   if ($command eq 's') {
               $buttons.=&switch('','',@rest);
                   } else {
                       $buttons.=&clear(@rest);
                   }
               }
           }
   
           if ($textual) {
       my $addremote=0;
       foreach (@inlineremote) { if ($_ ne '') { $addremote=1; } }
       my $inlinebuttons='';
       if ($addremote) {
   # Registered, textual output
    if ($env{'browser.interface'} eq 'textual') {
       $inlinebuttons=
                           join('',map { (defined($_)?$_:'') } @inlineremote);
    } else {
                       if ($env{'environment.icons'} eq 'iconsonly') {
                           $inlinebuttons=(<<ENDARROWSINLINE);
   <tr><td>
   $inlineremote[21] $inlineremote[23]
   ENDARROWSINLINE
                           if (&hidden_button_check() ne 'yes') {
                               $inlinebuttons .= (<<ENDINLINEICONS);
   $inlineremote[61] $inlineremote[63]
   $inlineremote[71] $inlineremote[72] $inlineremote[73]
   $inlineremote[81] $inlineremote[82] $inlineremote[83]
   $inlineremote[91] $inlineremote[92] $inlineremote[93]</td></tr>
   ENDINLINEICONS
                           }
                       } else {
    if ($inlineremote[21] ne '' || $inlineremote[23] ne '') {
       $inlinebuttons=(<<ENDFIRSTLINE);
   <tr><td>$inlineremote[21]</td><td>&nbsp;</td><td>$inlineremote[23]</td></tr>
   ENDFIRSTLINE
                           }
                           if (&hidden_button_check() ne 'yes') { 
       foreach my $row (6..9) {
    if ($inlineremote[${row}.'1'] ne ''
       || $inlineremote[$row.'2'] ne ''
       || $inlineremote[$row.'3'] ne '') {
       $inlinebuttons .= <<"ENDLINE";
   <tr><td>$inlineremote["${row}1"]</td><td>$inlineremote["${row}2"]</td><td>$inlineremote["${row}3"]</td></tr>
   ENDLINE
    }
       }
    }
       }
    }
       }
       $result =(<<ENDREGTEXT);
   <script type="text/javascript">
   // BEGIN LON-CAPA Internal
   </script>
   $timesync
   $tablestart
   $inlinebuttons
   $tableend
   $newmail
   <script type="text/javascript">
   // END LON-CAPA Internal
   </script>
   
   ENDREGTEXT
   # Registered, graphical output
           } else {
       my $requri=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
       $requri=&Apache::lonenc::check_encrypt(&unescape($requri));
       my $cursymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
       my $navstatus=&get_nav_status();
       my $clearcstr;
   
       if ($env{'user.adv'}) { $clearcstr='clearbut(6,1)'; }
       $result = (<<ENDREGTHIS);
        
   <script type="text/javascript">
   // BEGIN LON-CAPA Internal
   var swmenu=null;
   
       function LONCAPAreg() {
     swmenu=$reopen;
             swmenu.clearTimeout(swmenu.menucltim);
             $timesync
             $newmail
             $buttons
     swmenu.currentURL="$requri";
             swmenu.reloadURL=swmenu.currentURL+window.location.search;
             swmenu.currentSymb="$cursymb";
             swmenu.reloadSymb="$cursymb";
             swmenu.currentStale=0;
     $navstatus
             $hwkadd
             $editbutton
       }
   
       function LONCAPAstale() {
     swmenu=$reopen
             swmenu.currentStale=1;
             if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) { 
                swmenu.switchbutton
                (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');
     }
             swmenu.clearbut(7,2);
             swmenu.clearbut(7,3);
             swmenu.menucltim=swmenu.setTimeout(
    'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
    'clearbut(9,1);clearbut(9,3);clearbut(6,3);$clearcstr',
     2000);
         }
   
   // END LON-CAPA Internal 
 </script>  </script>
 ENDSMENU  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() {
       }
   
   // END LON-CAPA Internal
   </script>
   ENDDONOTREGTHIS
          }
   # =============================================================================
       }
       return $result;
   }
   
   sub loadevents() {
       if ($env{'request.state'} eq 'construct' ||
    $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
       return 'LONCAPAreg();';
 }  }
   
   sub unloadevents() {
       if ($env{'request.state'} eq 'construct' ||
    $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
       return 'LONCAPAstale();';
   }
   
   
   sub startupremote {
       my ($lowerurl)=@_;
       if (($env{'browser.interface'} eq 'textual') ||
           ($env{'environment.remote'} eq 'off')) {
        return ('<meta HTTP-EQUIV="Refresh" CONTENT="0.5; url='.$lowerurl.'" />');
       }
   #
   # The Remote actually gets launched!
   #
       my $configmenu=&rawconfig();
       my $esclowerurl=&escape($lowerurl);
       my $message=&mt('"Waiting for Remote Control window to load: "+[_1]','waited');
       return(<<ENDREMOTESTARTUP);
   <script type="text/javascript">
   var timestart;
   function wheelswitch() {
       if (typeof(document.wheel) != 'undefined') {
    if (typeof(document.wheel.spin) != 'undefined') {
       var date=new Date();
       var waited=Math.round(30-((date.getTime()-timestart)/1000));
       document.wheel.spin.value=$message;
    }
       }
      if (window.status=='|') { 
         window.status='/'; 
      } else {
         if (window.status=='/') {
            window.status='-';
         } else {
            if (window.status=='-') { 
               window.status='\\\\'; 
            } else {
               if (window.status=='\\\\') { window.status='|'; }
            }
         }
      } 
   }
   
   // ---------------------------------------------------------- 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=&escape($lowerurl);
       my $link=&mt('<a href="[_1]">Continue</a> on in Inline Menu mode',
    "/adm/remote?action=collapse&amp;url=$esclowerurl");
       return(<<ENDREMOTEFORM);
   <p>
   <form name="wheel">
   <input name="spin" type="text" size="60" />
   </form>
   </p>
   <p>$link</p>
   ENDREMOTEFORM
   }
   
   sub get_menu_name {
       my $hostid = $Apache::lonnet::perlvar{'lonHostID'};
       $hostid =~ s/\W//g;
       return 'LCmenu'.$hostid;
   }
   
   
   sub reopenmenu {
      if (($env{'browser.interface'} eq 'textual') ||
          ($env{'environment.remote'} eq 'off')) { return ''; }
      my $menuname = &get_menu_name();
      my $nothing = &Apache::lonhtmlcommon::javascript_nothing();
      return('window.open('.$nothing.',"'.$menuname.'","",false);');
   } 
   
   
   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 = &get_menu_name();
       
   #    unless (shift eq 'unix') {
   # resizing does not work on linux because of virtual desktop sizes
   #       $returnval.=(<<ENDRESIZE);
   #if (window.screen) {
   #    self.resizeTo(screen.availWidth-215,screen.availHeight-55);
   #    self.moveTo(190,15);
   #}
   #ENDRESIZE
   #    }
       $returnval.=(<<ENDOPEN);
   window.status='Opening LON-CAPA Remote Control';
   var menu=window.open("/res/adm/pages/menu.html","$menuname",
   "height=375,width=150,scrollbars=no,menubar=no,top=5,left=5,screenX=5,screenY=5");
   self.name='loncapaclient';
   ENDOPEN
       return '<script type="text/javascript">'.$returnval.'</script>';
   }
   
   
 # ================================================================== Raw Config  # ================================================================== Raw Config
   
 sub clear {  sub clear {
     my ($row,$col)=@_;      my ($row,$col)=@_;
     return qq(swmenu.clearbut($row,$col););      unless (($env{'browser.interface'} eq 'textual') ||
               ($env{'environment.remote'} eq 'off')) {
          return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););
      } else { 
          $inlineremote[10*$row+$col]='';
          return ''; 
      }
 }  }
   
   # ============================================ 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(..)".
   
 sub switch {  sub switch {
     my ($uname,$udom,$row,$col,$img,$top,$bot,$act)=@_;      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;
     return "\n".      $top=&mt($top);
  qq(swmenu.switchbutton($row,$col,"$img","$top","$bot","$act"););      $bot=&mt($bot);
       $desc=&mt($desc);
       if (($env{'environment.remote'} ne 'off') || ($env{'environment.icons'} eq 'classic')) {
          $img=&mt($img);
       }
       my $idx=10*$row+$col;
       $category_members{$cat}.=':'.$idx;
   
       unless (($env{'browser.interface'} eq 'textual')  ||
               ($env{'environment.remote'} eq 'off')) {
   # Remote
          return "\n".
    qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););
      } elsif ($env{'browser.interface'} eq 'textual') {
   # Accessibility
          if ($nobreak==2) { return ''; }
          my $text=$top.' '.$bot;
          $text=~s/\s*\-\s*//gs;
          if ($nobreak) {
      $inlineremote[$idx]=
          '<a href="javascript:'.$act.';">'.$text.'</a>';
          } else {
      $inlineremote[$idx]="\n<br />".
          $desc.' <a href="javascript:'.$act.';">'.$text.'</a>';
          }
      } else {
   # Inline Remote
          if ($env{'environment.icons'} ne 'classic') {
             $img=~s/\.gif$/\.png/;
          }
          if ($nobreak==2) { return ''; }
          my $text=$top.' '.$bot;
          $text=~s/\s*\-\s*//gs;
   
          my $pic=
      '<img alt="'.$text.'" src="'.
      &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).
      '" align="'.($nobreak==3?'right':'left').'" class="noBorder" />';
          if ($env{'browser.interface'} eq 'faketextual') {
   # Accessibility
      if ($nobreak==3) {
          $inlineremote[$idx]="\n".
      '<td class="LC_menubuttons_text" align="right">'.$text.
      '</td><td align="left">'.
      '<a href="javascript:'.$act.';">'.$pic.'</a></td></tr>';
      } elsif ($nobreak) {
          $inlineremote[$idx]="\n<tr>".
      '<td align="left">'.
      '<a href="javascript:'.$act.';">'.$pic.'</a></td>
                       <td class="LC_menubuttons_text" align="left"><a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$text.'</span></a></td>';
      } else {
          $inlineremote[$idx]="\n<tr>".
      '<td align="left">'.
      '<a href="javascript:'.$act.';">'.$pic.
      '</a></td><td class="LC_menubuttons_text" colspan="3">'.
      '<a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$desc.'</span></a></td></tr>';
      }
          } else {
   # Inline Menu
              if ($env{'environment.icons'} eq 'iconsonly') {
                 $inlineremote[$idx]='<a title="'.$desc.'" href="javascript:'.$act.';">'.$pic.'</a>';
              } else {
         $inlineremote[$idx]=
      '<a class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.
      '<span class="LC_menubuttons_inline_text">'.$desc.'</span></a>';
              }
          }
      }
       return '';
 }  }
   
 sub secondlevel {  sub secondlevel {
     my $output='';      my $output='';
     my       my 
     ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act)=@_;      ($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);     $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);             $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
         }          }
     }      }
     return $output;      return $output;
 }  }
   
   sub openmenu {
       my $menuname = &get_menu_name();
       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 {
       undef(@inlineremote);
       undef(%category_members);
       &rawconfig(1);
       my $output='<table id="LC_mainmenu"><tr>';
       for (my $col=1; $col<=2; $col++) {
           $output.='<td class="LC_mainmenu_col_fieldset">';
           for (my $row=1; $row<=8; $row++) {
               foreach my $cat (keys(%category_members)) {
                  if ($category_positions{$cat} ne "$col,$row") { next; }
                  #$output.='<table><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';
                  $output.='<div class="ContentBoxSpecial">';
          $output.='<h4 class="hcell">'.&mt($category_names{$cat}).'</h4>';
                  $output.='<table>';
                  my %active=();
                  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];
    &Apache::lonnet::logthis("item=$item output=$inlineremote[$item]");
                  }
                  $output.='</table>';
                  $output.='</div>';
               }
            }
            $output.="</td>";
       }
       $output.="</tr></table>";
       return $output;
   }
   
 sub rawconfig {  sub rawconfig {
     my $output="swmenu=window.open('','LONCAPAmenu');";      my $textualoverride=shift;
     my $uname=$ENV{'user.name'};      my $output='';
     my $udom=$ENV{'user.domain'};      unless (($env{'browser.interface'} eq 'textual') ||
     my $adv=$ENV{'user.adv'};              ($env{'environment.remote'} eq 'off')) {
     my $author=$ENV{'user.author'};         $output.=
    "window.status='Opening Remote Control';var swmenu=".&openmenu().
   "\nwindow.status='Configuring Remote Control ';";
       } else {
          unless ($textualoverride) { return ''; }
       }
       my $uname=$env{'user.name'};
       my $udom=$env{'user.domain'};
       my $adv=$env{'user.adv'};
       my $show_course=&show_course();
       my $author=$env{'user.author'};
     my $crs='';      my $crs='';
     if ($ENV{'request.course.id'}) {      if ($env{'request.course.id'}) {
        $crs='/'.$ENV{'request.course.id'};         $crs='/'.$env{'request.course.id'};
        if ($ENV{'request.course.sec'}) {         if ($env{'request.course.sec'}) {
    $crs.='_'.$ENV{'request.course.sec'};     $crs.='_'.$env{'request.course.sec'};
        }         }
        $crs=~s/\_/\//g;         $crs=~s/\_/\//g;
     }      }
     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'};
     map {      my $requested_domain = $env{'request.role.domain'};
         my ($row,$col,$pro,$prt,$img,$top,$bot,$act)=split(/\:/,$_);      foreach my $line (@desklines) {
           my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line);
         $prt=~s/\$uname/$uname/g;          $prt=~s/\$uname/$uname/g;
         $prt=~s/\$udom/$udom/g;          $prt=~s/\$udom/$udom/g;
         $prt=~s/\$crs/$crs/g;           $prt=~s/\$crs/$crs/g; 
           $prt=~s/\$requested_domain/$requested_domain/g;
           if ($category_names{$cat}!~/\w/) { $cat='oth'; }
           my $type = &Apache::loncommon::course_type();
           if ($type eq 'Group') {
               $desc = &convert_menu_function($desc,$type);
           }
         if ($pro eq 'clear') {          if ($pro eq 'clear') {
     $output.=&clear($row,$col);      $output.=&clear($row,$col);
         } elsif ($pro eq 'any') {          } elsif ($pro eq 'any') {
                $output.=&secondlevel(                 $output.=&secondlevel(
   $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act);    $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);            $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);    $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
             }              }
         } elsif (($pro=~/p(\w+)/) && ($prt)) {   } 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)) {
     if (&Apache::lonnet::allowed($1,$prt)) {      if (&Apache::lonnet::allowed($1,$prt)) {
                $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act);                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
               }
           } elsif ($pro eq 'course') {
               if ($env{'request.course.fn'}) {
                  $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
       }
           } elsif ($pro =~ /^courseenv_(.*)$/) {
               my $key = $1;
               if ($env{'course.'.$env{'request.course.id'}.'.'.$key}) {
                   $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
             }              }
           } elsif ($pro =~ /^course_(.*)$/) {
               # Check for permissions inside of a course
               if (($env{'request.course.id'}) &&
                   (&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/)) ||
     my ($cadom,$caname)=                      (($prt eq 'raa') && ($env{'request.role'}=~/^aa/)) || 
                                ($ENV{'request.role'}=~/(\w+)\/(\w+)$/);                      (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) {
                     $output.=switch($caname,$cadom,                      # Check that we are on the correct machine
                                     $row,$col,$img,$top,$bot,$act);                      my $cadom=$requested_domain;
                 } elsif ($prt eq 'any') {                      my $caname=$env{'user.name'};
                     $output.=switch($ENV{'user.name'},$ENV{'user.domain'},                      if (($prt eq 'rca') || ($prt eq 'raa')) {
     $row,$col,$img,$top,$bot,$act);         ($cadom,$caname)=
                                  ($env{'request.role'}=~/($match_domain)\/($match_username)$/);
                       }                       
                       $act =~ s/\$caname/$caname/g;
                       my $home = &Apache::lonnet::homeserver($caname,$cadom);
       my $allowed=0;
       my @ids=&Apache::lonnet::current_machine_ids();
       foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
       if ($allowed) {
                           $output.=&switch($caname,$cadom,
                                           $row,$col,$img,$top,$bot,$act,$desc,$cat);
                       }
                 }                  }
             }              }
         }          }
     } @desklines;      }
       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  # ======================================================================= Close
   
 sub close {  sub close {
       if (($env{'browser.interface'} eq 'textual') ||
           ($env{'environment.remote'} eq 'off')) { return ''; }
       my $menuname = &get_menu_name();
     return(<<ENDCLOSE);      return(<<ENDCLOSE);
 <script>  <script type="text/javascript">
 window.status='MenuControl:nologout';  window.status='Accessing Remote Control';
 menu=window.open("/adm/rat/empty.html","LONCAPAmenu",  menu=window.open("/adm/rat/empty.html","$menuname",
                  "height=350,width=150,scrollbars=no,menubar=no");                   "height=350,width=150,scrollbars=no,menubar=no");
   window.status='Disabling Remote Control';
   menu.active=0;
   menu.autologout=0;
   window.status='Closing Remote Control';
 menu.close();  menu.close();
   window.status='Done.';
 </script>  </script>
 ENDCLOSE  ENDCLOSE
 }  }
Line 168  sub footer { Line 1265  sub footer {
   
 }  }
   
 # ================================================================ Main Program  sub nav_control_js {
       my $nav=($env{'environment.remotenavmap'} eq 'on');
       return (<<NAVCONTROL);
       var w_loncapanav_flag="$nav";
   
   
   function gonav(url) {
      if (w_loncapanav_flag != 1) {
         gopost(url,'');
      }  else {
         navwindow=window.open(url,
                     "loncapanav","height=600,width=400,scrollbars=1"); 
      }
   }
   NAVCONTROL
   }
   
   sub utilityfunctions {
       my $caller = shift;
       unless (($env{'browser.interface'} eq 'textual')  ||
           ($env{'environment.remote'} eq 'off') || ($caller eq '/adm/menu')) { return ''; }
       my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
       $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));
       
       my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
       my $nav_control=&nav_control_js();
   
       my $start_page_annotate = 
           &Apache::loncommon::start_page('Annotator',undef,
          {'only_body' => 1,
    'js_ready'  => 1,
    'bgcolor'   => '#BBBBBB',
    'add_entries' => {
       'onload' => 'javascript:document.goannotate.submit();'}});
   
       my $end_page_annotate = 
           &Apache::loncommon::end_page({'js_ready' => 1});
   
       my $start_page_bookmark = 
           &Apache::loncommon::start_page('Bookmarks',undef,
          {'only_body' => 1,
    'js_ready'  => 1,
    'bgcolor'   => '#BBBBBB',});
   
       my $end_page_bookmark = 
           &Apache::loncommon::end_page({'js_ready' => 1});
   
   return (<<ENDUTILITY)
   
       var currentURL="$currenturl";
       var reloadURL="$currenturl";
       var currentSymb="$currentsymb";
   
   $nav_control
   
   function go(url) {
      if (url!='' && url!= null) {
          currentURL = null;
          currentSymb= null;
          window.location.href=url;
      }
   }
   
   function gopost(url,postdata) {
      if (url!='') {
         this.document.server.action=url;
         this.document.server.postdata.value=postdata;
         this.document.server.command.value='';
         this.document.server.url.value='';
         this.document.server.symb.value='';
         this.document.server.submit();
      }
   }
   
   function gocmd(url,cmd) {
      if (url!='') {
         this.document.server.action=url;
         this.document.server.postdata.value='';
         this.document.server.command.value=cmd;
         this.document.server.url.value=currentURL;
         this.document.server.symb.value=currentSymb;
         this.document.server.submit();
      }
   }
   
   function gocstr(url,filename) {
       if (url == '/adm/cfile?action=delete') {
           this.document.cstrdelete.filename.value = filename
           this.document.cstrdelete.submit();
           return;
       }
       if (url == '/adm/printout') {
           this.document.cstrprint.postdata.value = filename
           this.document.cstrprint.curseed.value = 0;
           this.document.cstrprint.problemtype.value = 0;
           if (this.document.lonhomework) {
               if ((this.document.lonhomework.rndseed) && (this.document.lonhomework.rndseed.value != null) && (this.document.lonhomework.rndseed.value != '')) {
                   this.document.cstrprint.curseed.value = this.document.lonhomework.rndseed.value
               }
               if (this.document.lonhomework.problemtype) {
    if (this.document.lonhomework.problemtype.value) {
       this.document.cstrprint.problemtype.value = 
    this.document.lonhomework.problemtype.value;
    } else if (this.document.lonhomework.problemtype.options) {
       for (var i=0; i<this.document.lonhomework.problemtype.options.length; i++) {
    if (this.document.lonhomework.problemtype.options[i].selected) {
       if (this.document.lonhomework.problemtype.options[i].value != null && this.document.lonhomework.problemtype.options[i].value != '') { 
    this.document.cstrprint.problemtype.value = this.document.lonhomework.problemtype.options[i].value
    }
    }
       }
    }
       }
    }
           this.document.cstrprint.submit();
           return;
       }
       if (url !='') {
           this.document.constspace.filename.value = filename;
           this.document.constspace.action = url;
           this.document.constspace.submit();
       }
   }
   
   function golist(url) {
      if (url!='' && url!= null) {
          currentURL = null;
          currentSymb= null;
          top.location.href=url;
      }
   }
   
   
   
   function catalog_info() {
      loncatinfo=window.open(window.location.pathname+'.meta',"LONcatInfo",'height=320,width=280,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no');
   }
   
   function chat_win() {
      lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');
   }
   
   function group_chat(group) {
      var url = '/adm/groupchat?group='+group;
      var winName = 'LONchat_'+group;
      grpchat=window.open(url,winName,'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');
   }
   
   function edit_bookmarks() {
      go('');
      w_BookmarkPal_flag=1;
      bookmarkpal=window.open("/adm/bookmarks",
                  "BookmarkPal", "width=400,height=505,scrollbars=0");
   }
   
   function annotate() {
      w_Annotator_flag=1;
      annotator=window.open('','Annotator','width=365,height=265,scrollbars=0');
      annotator.document.write(
      '$start_page_annotate'
     +"<form name='goannotate' target='Annotator' method='post' "
     +"action='/adm/annotations'>"
     +"<input type='hidden' name='symbnew' value='"+currentSymb+"' />"
     +"<\\/form>"
     +'$end_page_annotate');
      annotator.document.close();
   }
   
   function set_bookmark() {
      go('');
      clienttitle=document.title;
      clienthref=location.pathname;
      w_bmquery_flag=1;
      bmquery=window.open('','bmquery','width=365,height=165,scrollbars=0');
      bmquery.document.write(
      '$start_page_bookmark'
      +"<center><form method='post'"
      +" name='newlink' action='/adm/bookmarks' target='bmquery' "
      +">\\n <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 (no save)' "
      +"onclick='javascript:window.close();' /><\\/center><\\/td>"
      +"<\\/tr><\\/table><\\/form><\\/center>"
      +'$end_page_bookmark' );
      bmquery.document.close();
   }
   
   ENDUTILITY
   }
   
   sub serverform {
       return(<<ENDSERVERFORM);
   <form name="server" action="/adm/logout" method="post" target="_top">
   <input type="hidden" name="postdata" value="none" />
   <input type="hidden" name="command" value="none" />
   <input type="hidden" name="url" value="none" />
   <input type="hidden" name="symb" value="none" />
   </form>
   ENDSERVERFORM
   }
   
   sub constspaceform {
       return(<<ENDCONSTSPACEFORM);
   <form name="constspace" action="/adm/logout" method="post" target="_top">
   <input type="hidden" name="filename" value="" />
   </form>
   <form name="cstrdelete" action="/adm/cfile" method="post" target="_top">
   <input type="hidden" name="action" value="delete" /> 
   <input type="hidden" name="filename" value="" />
   </form>
   <form name="cstrprint" action="/adm/printout" target="_parent" method="post">
   <input type="hidden" name="postdata" value="" />
   <input type="hidden" name="curseed" value="" />
   <input type="hidden" name="problemtype" value="" />
   </form>
   
   ENDCONSTSPACEFORM
   }
   
   
   sub get_nav_status {
       my $navstatus="swmenu.w_loncapanav_flag=";
       if ($env{'environment.remotenavmap'} eq 'on') {
    $navstatus.="1";
       } else {
    $navstatus.="-1";
       }
       return $navstatus;
   }
   
 sub BEGIN {  #FIXME this needs to move into mydesktab and the other locations 
   unless ($readdesk) {  # the text is generated
   {  sub convert_menu_function {
     my $config=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.      my ($rolename,$type) = @_;
   '/mydesk.tab');      if ($type eq 'Group') {
     while (my $configline=<$config>) {          $rolename =~ s/student/member/g;
        chomp($configline);          $rolename =~ s/group/team/g;
        $desklines[$#desklines+1]=$configline;          $rolename =~ s/course/group/g;
           $rolename =~ s/Course/Group/g;
     }      }
   }      return $rolename;
 }  }
   
   sub hidden_button_check {
       my $hidden;
       if ($env{'request.course.id'} eq '') {
           return;
       }
       if ($env{'request.role.adv'}) {
           return;
       }
       my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide');
       return $buttonshide; 
 }  }
   
   sub roles_selector {
       my ($cdom,$cnum) = @_;
       my $now = time;
       my (%courseroles,%seccount,%gotnosection);
       my $is_cc;
       my $role_selector;
       if ($env{'user.role.cc./'.$cdom.'/'.$cnum}) {
           my ($start,$end) = split(/\./,$env{'user.role.cc./'.$cdom.'/'.$cnum});
           
           if ((($start) && ($start<0)) || 
               (($end) && ($end<$now))  ||
               (($start) && ($now<$start))) {
               $is_cc = 0;
           } else {
               $is_cc = 1;
           }
       }
       if ($is_cc) {
           my %adv_roles =
                &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1);
           foreach my $role (keys(%adv_roles)) {
               my ($urole,$usec) = split(/:/,$role);
               if (!$gotnosection{$urole}) {
                   $seccount{$urole} ++;
                   $gotnosection{$urole} = 1;
               }
               if (ref($courseroles{$urole}) eq 'ARRAY') {
                   if ($usec ne '') {
                       if (!grep(/^Q$usec\E$/,@{$courseroles{$urole}})) {
                           push(@{$courseroles{$urole}},$usec);
                           $seccount{$urole} ++;
                       }
                   }
               } else {
                   @{$courseroles{$urole}} = ();
                   if ($usec ne '') {
                       $seccount{$urole} ++;
                       push(@{$courseroles{$urole}},$usec);
                   }
               }
           }
           my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum);
           @{$courseroles{'st'}} = ();
           if (keys(%sections_count) > 0) {
               push(@{$courseroles{'st'}},keys(%sections_count));
           }
       } else {
           foreach my $item (keys(%env)) {
               if ($item =~ m-^user\.role\.([^.]+)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) {
                   my $role = $1;
                   my $sec = $2;
                   next if ($role eq 'gr');
                   my ($start,$end) = split(/\./,$env{$item});
                   next if (($start && $start > $now) || ($end && $end < $now));
                   if ($sec eq '') {
                       if (!$gotnosection{$role}) {
                           $seccount{$role} ++;
                           $gotnosection{$role} = 1;
                       }
                   }
                   if (ref($courseroles{$role}) eq 'ARRAY') {
                       if ($sec ne '') {
                           if (!grep(/^Q$sec\E$/,@{$courseroles{$role}})) {
                               push(@{$courseroles{$role}},$sec);
                               $seccount{$role} ++;
                           }
                       }
                   } else {
                       @{$courseroles{$role}} = ();
                       if ($sec ne '') {
                           $seccount{$role} ++;
                           push(@{$courseroles{$role}},$sec);
                       }
                   }
               }
           }
       }
       my @roles_order = ('cc','in','ta','ep','ad','st');
       if (keys(%courseroles) > 1) {
           $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles);
           $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">
                             <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';
           $role_selector .= '<option value="">'.&mt('Switch course role to...').'</option>';
           foreach my $role (@roles_order) {
               if (defined($courseroles{$role})) {
                   $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; 
               }
           }
           foreach my $role (sort(keys(%courseroles))) {
               if ($role =~ /^cr/) {
                   $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; 
               }
           }
           $role_selector .= '</select>'."\n".
                  '<input type="hidden" name="destinationurl" value="'.
                  $ENV{'REQUEST_URI'}.'" />'."\n".
                  '<input type="hidden" name="gotorole" value="1" />'."\n".
                  '<input type="hidden" name="selectrole" value="" />'."\n".
                  '<input type="hidden" name="switch" value="1" />'."\n".
                  '</form>';
       }
       return $role_selector;
   }
   
   sub jump_to_role {
       my ($cdom,$cnum,$seccount,$courseroles) = @_;
       my %lt = &Apache::lonlocal::texthash(
                   this => 'This role has section(s) associated with it.',
                   ente => 'Enter a specific section.',
                   orlb => 'Enter a specific section, or leave blank for no section.',
                   avai => 'Available sections are:',
                   youe => 'You entered an invalid section choice:',
                   plst => 'Please try again',
       );
       my $js;
       if (ref($courseroles) eq 'HASH') {
           $js = '    var secpick = new Array("'.$lt{'ente'}.'","'.$lt{'orlb'}.'");'."\n". 
                 '    var numsec = new Array();'."\n".
                 '    var rolesections = new Array();'."\n".
                 '    var rolenames = new Array();'."\n".
                 '    var roleseclist = new Array();'."\n";
           my @items = keys(%{$courseroles});
           for (my $i=0; $i<@items; $i++) {
               $js .= '    rolenames['.$i.'] = "'.$items[$i].'";'."\n";
               my ($secs,$secstr);
               if (ref($courseroles->{$items[$i]}) eq 'ARRAY') {
                   my @sections = sort { $a <=> $b } @{$courseroles->{$items[$i]}};
                   $secs = join('","',@sections);
                   $secstr = join(', ',@sections);
               }
               $js .= '    rolesections['.$i.'] = new Array("'.$secs.'");'."\n".
                      '    roleseclist['.$i.'] = "'.$secstr.'";'."\n".
                      '    numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n";
           }
       }
       my $output = <<"END";
   <script type="text/javascript">
   function adhocRole(roleitem) {
       $js
       var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;
       if (newrole == '') {
           return; 
       } 
       var fullrole = newrole+'./$cdom/$cnum';
       var selidx = '';
       for (var i=0; i<rolenames.length; i++) {
           if (rolenames[i] == newrole) {
               selidx = i;
           }
       }
       var secok = 1;
       var secchoice = '';
       if (selidx >= 0) {
           if (numsec[selidx] > 1) {
               secok = 0;
               var numrolesec = rolesections[selidx].length;
               var msgidx = numsec[selidx] - numrolesec;
               secchoice = prompt("$lt{'this'}\\n"+secpick[msgidx]+"\\n$lt{'avai'} "+roleseclist[selidx],"");
               if (secchoice == '') {
                   if (msgidx > 0) {
                       secok = 1;
                   }
               } else {
                   for (var j=0; j<rolesections[selidx].length; j++) {
                       if (rolesections[selidx][j] == secchoice) {
                           secok = 1;
                       }
                   }
               }
           } else {
               if (rolesections[selidx].length == 1) {
                   secchoice = rolesections[selidx][0];
               }
           }
       }
       if (secok == 1) {
           if (secchoice != '') {
               fullrole += '/'+secchoice;
           }
       } else {
           document.rolechooser.elements[roleitem].selectedIndex = 0;
           if (secchoice != null) {
               alert("$lt{'youe'} \\""+secchoice+"\\".\\n $lt{'plst'}");
           }
           return;
       }
       if (fullrole == "$env{'request.role'}") {
           return;
       }
       itemid = retrieveIndex('gotorole');
       if (itemid != -1) {
           document.rolechooser.elements[itemid].name = fullrole;
       }
       document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value = fullrole;
       document.rolechooser.selectrole.value = '1';
       document.rolechooser.submit();
       return;
   }
   
   function retrieveIndex(item) {
       for (var i=0;i<document.rolechooser.elements.length;i++) {
           if (document.rolechooser.elements[i].name == item) {
               return i;
           }
       }
       return -1;
   }
   
   
   </script>
   END
       return $output;
   }
   
   
   # ================================================================ Main Program
   
   BEGIN {
       if (! defined($readdesk)) {
    {
       my $tabfile = $Apache::lonnet::perlvar{'lonTabDir'}.'/mydesk.tab';
       if ( CORE::open( my $config,"<$tabfile") ) {
    while (my $configline=<$config>) {
       $configline=(split(/\#/,$configline))[0];
       $configline=~s/^\s+//;
       chomp($configline);
                       if ($configline=~/^cat\:/) {
                          my @entries=split(/\:/,$configline);
                          $category_positions{$entries[2]}=$entries[1];
                          $category_names{$entries[2]}=$entries[3];
       } elsif ($configline) {
    push(@desklines,$configline);
       }
    }
    CORE::close($config);
       }
    }
    $readdesk='done';
       }
   }
   
 1;  1;
 __END__  __END__
   

Removed from v.1.11  
changed lines
  Added in v.1.247


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