Diff for /loncom/interface/lonmenu.pm between versions 1.263 and 1.337

version 1.263, 2009/05/08 16:08:56 version 1.337, 2010/08/24 09:11:38
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  =head1 NAME
Line 47  Coordinates the response to clicking an Line 40  Coordinates the response to clicking an
 This is part of the LearningOnline Network with CAPA project  This is part of the LearningOnline Network with CAPA project
 described at http://www.lon-capa.org.  described at http://www.lon-capa.org.
   
 =head1 SUBROUTINES  =head1 GLOBAL VARIABLES
   
 =over  =over
   
 =item show_course()  =item @desklines
   
 Little texts  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 initlittle()  =item %category_names
   
 =item menubuttons()  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.
   
 This gets called at the top of the body section  =item %category_members
   
 =item show_return_link()  TODO 
   
 =item registerurl()  =item %category_positions
   
 This gets called in the header section  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 innerregister()  =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
   
 This gets called in order to register a URL, both with the Remote  The elements of this array reference arrays that are made up of the components
 and in the body of the document  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.
   
 =item loadevents()  =back
   
 =item unloadevents()  =head1 SUBROUTINES
   
 =item startupremote()  =over
   
 =item setflags()  =item prep_menuitems(\@menuitem)
   
 =item maincall()  This routine wraps a menuitem in proper HTML. It is used by primary_menu() and 
   secondary_menu().
   
 =item load_remote_msg()  =item primary_menu()
   
 =item get_menu_name()  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 reopenmenu()  =item secondary_menu()
   
 =item open()  Same as primary_menu() but operates on @secondary_menu.
   
 Open the 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 clear()
   
Line 108  The javascript is usually similar to "go Line 129  The javascript is usually similar to "go
   
 =item rawconfig()  =item rawconfig()
   
 =item close()  
   
 =item footer()  
   
 =item utilityfunctions()  =item utilityfunctions()
   
 =item serverform()  =item serverform()
Line 120  The javascript is usually similar to "go Line 137  The javascript is usually similar to "go
   
 =item get_nav_status()  =item get_nav_status()
   
 =item convert_menu_function()  
   
 FIXME this needs to move into mydesktab and the other locations   
 the text is generated  
   
 =item hidden_button_check()  =item hidden_button_check()
   
 =item roles_selector()  =item roles_selector()
Line 144  use Apache::loncommon(); Line 156  use Apache::loncommon();
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::lonlocal;  use Apache::lonlocal;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   use HTML::Entities();
   
 use vars qw(@desklines %category_names %category_members %category_positions $readdesk);  use vars qw(@desklines %category_names %category_members %category_positions 
               $readdesk @primary_menu @secondary_menu);
   
 my @inlineremote;  my @inlineremote;
   
   sub prep_menuitem {
       my ($menuitem) = @_;
       return '' unless(ref($menuitem) eq 'ARRAY');
       my $link;
       if ($$menuitem[1]) { # graphical Link
           $link = "<img class=\"LC_noBorder\""
                 . " src=\"" . &Apache::loncommon::lonhttpdurl($$menuitem[1]) . "\"" 
                 . " alt=\"" . &mt($$menuitem[2]) . "\" />";
       } else {             # textual Link
           $link = &mt($$menuitem[3]);
       }
       return '<li><a' 
              # highlighting for new messages
              . ( $$menuitem[4] eq 'newmsg' ? ' class="LC_new_message"' : '') 
              . qq| href="$$menuitem[0]" target="_top">$link</a></li>|;
   }
   
   # primary_menu() 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
   sub primary_menu {
       my $menu;
       # each element of @primary contains following array:
       # (link url, icon path, alt text, link text, condition)
       my $public;
       if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
           || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
           $public = 1;
       }
       foreach my $menuitem (@primary_menu) {
           # evaluate conditions 
           next if    ref($menuitem)       ne 'ARRAY';    #
           next if    $$menuitem[4]        eq 'nonewmsg'  # show links depending on
                   && &Apache::lonmsg::mynewmail();       # whether a new msg 
           next if    $$menuitem[4]        eq 'newmsg'    # arrived or not
                   && !&Apache::lonmsg::mynewmail();      # 
           next if    $$menuitem[4]        !~ /public/    ##we've a public user,
                   && $public;                            ##who should not see all
                                                          ##links
           next if    $$menuitem[4]        eq 'onlypublic'# hide links which are 
                   && !$public;                           # only visible to public
                                                          # users
           next if    $$menuitem[4]        eq 'roles'     ##show links depending on
                   && &Apache::loncommon::show_course();  ##term 'Courses' or 
           next if    $$menuitem[4]        eq 'courses'   ##'Roles' wanted
                   && !&Apache::loncommon::show_course(); ##
           
               
           if ($$menuitem[3] eq 'Help') { # special treatment for helplink
               $menu .= '<li>'.&Apache::loncommon::top_nav_help('Help').'</li>';
           } else {
               $menu .= prep_menuitem($menuitem);
           }
       }
       $menu =~ s/\[domain\]/$env{'user.domain'}/g;
       $menu =~ s/\[user\]/$env{'user.name'}/g;
   
       return "<ol class=\"LC_primary_menu LC_right\">$menu</ol>";
   }
   
 sub show_course {  #returns hashref {user=>'',dom=>''} containing:
     my $course = !$env{'user.adv'};  #   own name, domain if user is au
     if (!$env{'user.adv'}) {  #   name, domain of parent author if user is ca or aa
  foreach my $env (keys(%env)) {  #empty return if user is not an author or not on homeserver
     next if ($env !~ m/^user\.priv\./);  #
     if ($env !~ m/^user\.priv\.(?:st|cm)/) {  #TODO this should probably be moved somewhere more central
  $course = 0;  #since it can be used by different parts of the system
  last;  sub getauthor{
     }      return unless $env{'request.role'}=~/^(ca|aa|au)/; #nothing to do if user isn't some kind of author
  }  
                           #co- or assistent author?
       my ($dom, $user) = ($env{'request.role'} =~ /^(?:ca|aa)\.\/($match_domain)\/($match_username)$/)
                          ? ($1, $2) #domain, username of the parent author
                          : @env{ ('request.role.domain', 'user.name') }; #own domain, username
   
       # current server == home server?
       my $home =  &Apache::lonnet::homeserver($user,$dom);
       foreach (&Apache::lonnet::current_machine_ids()){
           return {user => $user, dom => $dom} if $_ eq $home;
     }      }
     return $course;  
       # if wrong server
       return;
 }  }
   
 sub initlittle {  sub secondary_menu {
     return &Apache::lonlocal::texthash('ret' => 'Return to Last Location',      my $menu;
        'nav' => 'Navigate Contents',  
        'main' => 'Main Menu',  
                                        'roles' => (&show_course()?  
                                                     'Courses':'Roles'),  
                                        'other' => 'Other Roles',  
                                        'docs' => 'Edit Course',  
                                        'exit' => 'Logout',  
                                        '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 $crstype = &Apache::loncommon::course_type();
       my $crs_sec = $env{'request.course.id'} . ($env{'request.course.sec'} 
                                                  ? "/$env{'request.course.sec'}"
                                                  : '');
       my $canedit       = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
       my $canviewgrps   = &Apache::lonnet::allowed('vcg', $crs_sec); 
       my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec); 
       my $canviewwnew   = &Apache::lonnet::allowed('whn', $crs_sec); 
       my $canmodpara    = &Apache::lonnet::allowed('opa', $crs_sec); 
       my $author        = getauthor();
   
       my $showlink = &show_return_link();
       my %groups = &Apache::lonnet::get_active_groups(
                        $env{'user.domain'}, $env{'user.name'},
                        $env{'course.' . $env{'request.course.id'} . '.domain'},
                        $env{'course.' . $env{'request.course.id'} . '.num'});
   
       foreach my $menuitem (@secondary_menu) {
           # evaluate conditions 
           next if    ref($menuitem)  ne 'ARRAY';
           next if    $$menuitem[4]   ne 'always'
                   && $$menuitem[4]   ne 'author'
                   && !$env{'request.course.id'};
           next if    $$menuitem[4]   eq 'showreturn'
                   && !$showlink
                   && !($env{'request.state'} eq 'construct');
           next if    $$menuitem[4]   =~ /^mdc/
                   && !$canedit;
           next if    $$menuitem[4]  eq 'mdcCourse'
                   && $crstype eq 'Community';
           next if    $$menuitem[4]  eq 'mdcCommunity'
                   && $crstype ne 'Community';
           next if    $$menuitem[4]   eq 'cst'
                   && !$canmodifyuser;
           next if    $$menuitem[4]   eq 'whn'
                   && !$canviewwnew;
           next if    $$menuitem[4]   eq 'opa'
                   && !$canmodpara;
           next if    $$menuitem[4]   =~ /showgroups$/
                   && !$canviewgrps
                   && !%groups;
           next if    $$menuitem[4]    eq 'author'
                   && !$author;
   
           if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
               # special treatment for role selector
               my $roles_selector = &roles_selector(
                           $env{'course.' . $env{'request.course.id'} . '.domain'},
                           $env{'course.' . $env{'request.course.id'} . '.num'}  );
   
     my %lt=&initlittle();              $menu .= $roles_selector ? "<li>$roles_selector</li>"
     my $navmaps='';                                       : '';
     my $reloadlink='';          } else {
     my $docs='';              $menu .= &prep_menuitem(\@$menuitem);
     my $groups='';  
     my $roles='<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>';  
     my $role_selector;  
     my $showgroups=0;  
     my ($cnum,$cdom);  
     my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'}));  
     my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'}));  
   
     my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif");  
     $logo = '<a href="/adm/about.html"><img src="'.  
  $logo.'" alt="LON-CAPA Logo" class="LC_noBorder" /></a>';  
   
     if ($env{'request.state'} eq 'construct') {  
         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 ($menu =~ /\[url\].*\[symb\]/) {
           my $escurl  = &escape( &Apache::lonenc::check_encrypt(
                                $env{'request.noversionuri'}));
   
     if ($env{'browser.interface'} eq 'textual') {          my $escsymb = &escape( &Apache::lonenc::check_encrypt(
 # Textual display only                               $env{'request.symb'})); 
         if ($env{'request.course.id'}) {  
     $navmaps=(<<ENDNAV);          if (    $env{'request.state'} eq 'construct'
 <a href="/adm/navmaps?postdata=$escurl&amp;postsymb=$escsymb" target="_top">$lt{'nav'}</a>              and (   $env{'request.noversionuri'} eq '' 
 ENDNAV                   || !defined($env{'request.noversionuri'}))) 
             if (&show_return_link()) {          {
                 my $escreload=&escape('return:');              ($escurl = $env{'request.filename'}) =~ 
                 $reloadlink=(<<ENDRELOAD);                  s{^/home/([^/]+)/public_html/(.*)$}{/priv/$1/$2};
 <a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a>  
 ENDRELOAD              $escurl  = &escape($escurl);
             }          }    
     if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {          $menu =~ s/\[url\]/$escurl/g;
                $docs=(<<ENDDOCS);          $menu =~ s/\[symb\]/$escsymb/g;
 <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>  
 <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>  
       <td>$logo</td>  
       <td></td>  
       <td class="LC_top_nav_login">  
         <a href="/adm/roles" target="_top">$lt{'login'}</a>  
      </td>  
     </tr>  
   </table>  
 ENDINLINEMENU  
         }  
         $roles = '<a href="/adm/roles" target="_top">'.$lt{'roles'}.'</a>';  
 # Do we have a NAV link?  
         if ($env{'request.course.id'}) {  
     my $link='/adm/navmaps?postdata='.$escurl.'&amp;postsymb='.  
  $escsymb;  
     if ($env{'environment.remotenavmap'} eq 'on') {  
  $link="javascript:gonav('".$link."')";  
     }  
     $navmaps=(<<ENDNAV);  
 <li><a href="$link" target="_top">$lt{'nav'}</a></li>  
 ENDNAV  
             my $is_group = (&Apache::loncommon::course_type() eq 'Group');  
     if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  
                 my $text = ($is_group) ? $lt{'gdoc'} : $lt{'docs'};  
  $docs=(<<ENDDOCS);  
 <li><a href="/adm/coursedocs" target="_top">$text</a></li>  
 ENDDOCS  
             }  
             if ($showgroups) {  
                 $groups =(<<ENDGROUPS);  
 <li><a href="/adm/coursegroups" target="_top">$lt{'groups'}</a></li>  
 ENDGROUPS  
             }  
     if (&show_return_link()) {  
                 my $escreload=&escape('return:');  
                 $reloadlink=(<<ENDRELOAD);  
 <li><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></li>  
 ENDRELOAD  
             }  
             if ($role_selector) {  
             #$roles = '<td>'.$role_selector.'</td><td><a href="/adm/roles" target="_top">'.$lt{'other'}.'</a></td>';  
  $role_selector = '<li>'.$role_selector.'</li>';  
             }  
         }  
  if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) {  
     my $escreload=&escape('return:');  
     $reloadlink=(<<ENDCRELOAD);  
 <li><a href="/adm/flip?postdata=$escreload" target="_top">$lt{'ret'}</a></li>  
 ENDCRELOAD  
         }  
         my $reg='';  
         if ($registration) {  
            $reg=&innerregister($forcereg,$titletable);  
         }  
         my $form=&serverform();  
  my $utility=&utilityfunctions();  
   
  my $messagelink = "";  
  if(&Apache::lonmsg::mynewmail()){  
  $messagelink = '<a href="javascript:go(\'/adm/communicate\');">Message(new)</a>'  
  }else{  
  $messagelink = '<a href="javascript:go(\'/adm/communicate\');">Message</a>'  
  }  
         my $helplink=&Apache::loncommon::top_nav_help('Help');  
  return (<<ENDINLINEMENU);  
 <script type="text/javascript">  
 // BEGIN LON-CAPA Internal  
 // <![CDATA[  
 $utility  
 // ]]>  
 </script>  
 <ol class="LC_smallMenu LC_right">  
  <li>$logo</li>  
  <li>$messagelink</li>  
  <li>$roles</li>  
  <li>$helplink</li>  
  <li><a href="/adm/logout" target="_top">$lt{'exit'}</a></li>  
 </ol>  
 <ul id="LC_TabMainMenuContent">  
 <li><a href="/adm/menu" target="_top">$lt{'main'}</a></li>  
 $reloadlink  
 $navmaps  
 $docs  
 $groups  
 $role_selector  
 </ul>  
 $form  
 <script type="text/javascript">  
 // END LON-CAPA Internal  
 </script>  
 <br clear="all" />  
 $reg  
 ENDINLINEMENU  
     } else {  
  return '';  
     }      }
       $menu =~ s/\[uname\]/$$author{user}/g;
       $menu =~ s/\[udom\]/$$author{dom}/g;
   
       return "<ul id=\"LC_secondary_menu\">$menu</ul>";
 }  }
   
 sub show_return_link {  sub show_return_link {
       if (($env{'request.noversionuri'} =~ m{^/adm/(viewclasslist|navmaps)($|\?)})
           || ($env{'request.noversionuri'} =~ m{^/adm/.*/aboutme($|\?)})) {
   
           return if ($env{'form.register'});
       }
     return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&      return (($env{'request.noversionuri'}=~m{^/(res|public)/} &&
      $env{'request.symb'} eq '')       $env{'request.symb'} eq '')
     ||      ||
Line 398  sub show_return_link { Line 348  sub show_return_link {
     (($env{'request.noversionuri'}=~/^\/adm\//) &&      (($env{'request.noversionuri'}=~/^\/adm\//) &&
      ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&       ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) &&
      ($env{'request.noversionuri'}!~       ($env{'request.noversionuri'}!~
       m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)])        m{^/adm/.*/(smppg|bulletinboard)($|\?)})
      ));             ));
 }  
   
   
 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;  
 }  }
   
 sub innerregister {  sub innerregister {
     my ($forcereg, $titletable) = @_;      my ($forcereg,$bread_crumbs) = @_;
     my $result = '';  
     my ($uname,$thisdisfn);  
     my $const_space = ($env{'request.state'} eq 'construct');      my $const_space = ($env{'request.state'} eq 'construct');
     my $is_const_dir = 0;      my $is_const_dir = 0;
   
Line 437  sub innerregister { Line 361  sub innerregister {
   
     $env{'request.registered'} = 1;      $env{'request.registered'} = 1;
   
     my $textinter=($env{'browser.interface'} eq 'textual');  
     my $noremote=($env{'environment.remote'} eq 'off');  
       
     my $textual=($textinter || $noremote);  
   
     undef(@inlineremote);      undef(@inlineremote);
   
     my $reopen=&Apache::lonmenu::reopenmenu();      if ( $env{'request.symb'} && $env{'request.course.id'} ) {
   
     my $newmail='';          my ($mapurl,$rid,$resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
     if ($noremote) {          my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
  $newmail='<table id="LC_nav_location"><tr>';  
     }          my $maptitle = &Apache::lonnet::gettitle($mapurl);
     if (&Apache::lonmsg::newmail()) {           my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());
  if ($textual) {  
     $newmail.= '<td class="LC_new_mail">  #SD
                    <a href="/adm/communicate" target="_top">'.  #course_type only Course and Community?
    &mt('You have new messages').'</a></td>';  #
  } else {          my @crumbs;
     $newmail= 'swmenu.setstatus("you have","messages");';          unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps')
  }                  && ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
     }               @crumbs = ({text  => Apache::loncommon::course_type() 
     if (($textual)                                   . ' Contents', 
      && ($env{'request.symb'})                           href  => "Javascript:gopost('/adm/navmaps','')"});
      && ($env{'request.course.id'})) {          }
  $newmail.= '<td class="LC_current_location">';          if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { 
  my ($mapurl,$rid,$resurl)=              push(@crumbs, {text  => '...',
     &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());                             no_mt => 1});
         my $coursetitle=$env{'course.'.$env{'request.course.id'}.'.description'};          }
         $newmail.=$coursetitle;  
         my $maptitle=&Apache::lonnet::gettitle($mapurl);          push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle 
  my $restitle=&Apache::lonnet::gettitle(&Apache::lonnet::symbread());                                                     && $maptitle ne 'default.sequence' 
         if ($maptitle && ($maptitle ne 'default.sequence') && ($maptitle ne $coursetitle)) {                                                     && $maptitle ne $coursetitle);
     $newmail.=', '.$maptitle;  
         }          push @crumbs, {text => $restitle, no_mt => 1} if $restitle; 
         if ($restitle) {  
     $newmail.=': '.$restitle;          &Apache::lonhtmlcommon::clear_breadcrumbs();
         }          &Apache::lonhtmlcommon::add_breadcrumb(@crumbs);
         $newmail.='&nbsp;&nbsp;&nbsp;</td>';      }elsif (! $const_space){
     }          #a situation when we're looking at a resource outside of context of a 
     if ($env{'request.state'} eq 'construct') {          #course or construction space (e.g. with cumulative rights)
         $newmail = $titletable;          &Apache::lonhtmlcommon::clear_breadcrumbs();
     } else {          &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
  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  # ============================ This is for URLs that actually can be registered
     if (($env{'request.noversionuri'}!~m|^/(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'}) {
Line 502  sub innerregister { Line 416  sub innerregister {
         if ($env{'request.symb'} ne '' &&          if ($env{'request.symb'} ne '' &&
     $env{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form|task)$/) {      $env{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form|task)$/) {
     if (&Apache::lonnet::allowed('mgr',$crs)) {      if (&Apache::lonnet::allowed('mgr',$crs)) {
  $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_4]',   $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)) {              } elsif (&Apache::lonnet::allowed('vgr',$crs)) {
  $hwkadd.=&switch('','',7,2,'subm.gif','view sub-[_1]','missions[_1]',   $hwkadd.=&switch('','',7,2,'subm.png','view sub-[_1]','missions[_1]',
                        "gocmd('/adm/grades','submission')",                         "gocmd('/adm/grades','submission')",
        'View user submissions for this assessment resource');         'View user submissions for this assessment resource');
             }              }
  }   }
  if ($env{'request.symb'} ne '' &&   if ($env{'request.symb'} ne '' &&
     &Apache::lonnet::allowed('opa',$crs)) {      &Apache::lonnet::allowed('opa',$crs)) {
     $hwkadd.=&switch('','',7,3,'pparm.gif','problem[_2]','parms[_2]',      $hwkadd.=&switch('','',7,3,'pparm.png','problem[_2]','parms[_2]',
      "gocmd('/adm/parmset','set')",       "gocmd('/adm/parmset','set')",
      'Modify parameter settings for this resource');       'Modify parameter settings for this resource');
  }   }
Line 531  sub innerregister { Line 445  sub innerregister {
         }          }
         if ($env{'user.author'}) {          if ($env{'user.author'}) {
             if ($env{'request.role'}=~/^(aa|ca|au)/) {              if ($env{'request.role'}=~/^(aa|ca|au)/) {
   #
   # We have the role of an author
   #
                 # Set defaults for authors                  # Set defaults for authors
                 my ($top,$bottom) = ('con-','struct');                  my ($top,$bottom) = ('con-','struct');
                 my $action = "go('/priv/".$env{'user.name'}."');";                  my $action = "go('/priv/".$env{'user.name'}."');";
Line 559  sub innerregister { Line 476  sub innerregister {
                     $noeditbutton = 0;                      $noeditbutton = 0;
                 }                  }
             }              }
   #
   # We are an author for some stuff, but currently do not have the role of author.
   # Figure out if we have authoring privileges for the resource we are looking at.
   # This should maybe become a privilege check in lonnet
   #
             ##              ##
             ## Determine if user can edit url.              ## Determine if user can edit url.
             ##              ##
Line 566  sub innerregister { Line 488  sub innerregister {
             my $cfuname='';              my $cfuname='';
             my $cfudom='';              my $cfudom='';
             my $uploaded;              my $uploaded;
               my $switchserver='';
               my $home;
             if ($env{'request.filename'}) {              if ($env{'request.filename'}) {
                 my $file=&Apache::lonnet::declutter($env{'request.filename'});                  my $file=&Apache::lonnet::declutter($env{'request.filename'});
                 if (defined($cnum) && defined($cdom)) {                  if (defined($cnum) && defined($cdom)) {
Line 576  sub innerregister { Line 500  sub innerregister {
                     # Check that the user has permission to edit this resource                      # Check that the user has permission to edit this resource
                     ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);                      ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1);
                     if (defined($cfudom)) {                      if (defined($cfudom)) {
         my $home=&Apache::lonnet::homeserver($cfuname,$cfudom);          $home=&Apache::lonnet::homeserver($cfuname,$cfudom);
         my $allowed=0;          my $allowed=0;
         my @ids=&Apache::lonnet::current_machine_ids();          my @ids=&Apache::lonnet::current_machine_ids();
         foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }          foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
         if ($allowed) {          if ($allowed) {
                             $cfile=$file;                              $cfile=$file;
                           } else {
                               $switchserver=$file;
                         }                          }
                     }                      }
                 }                  }
             }              }
             # Finally, turn the button on or off              # Finally, turn the button on or off
             if ($cfile && !$const_space) {              if (($cfile || $switchserver) && !$const_space) {
                 $editbutton=&switch                  my $nocrsedit;
                     ('','',6,1,'pcstr.gif','edit[_1]','resource[_2]',                  # Suppress display where CC has switched to student role.
                      "go('".$cfile."');","Edit this resource");                  if ($env{'request.course.id'}) {
                 $noeditbutton = 0;                      unless(&Apache::lonnet::allowed('mdc',
                                                       $env{'request.course.id'})) {
                           $nocrsedit = 1;
                       }
                   }
                   if ($nocrsedit) {
                       $editbutton=&clear(6,1);
                   } else {
                       my $bot = "go('$cfile')";
                       if ($switchserver) {
                           if ( $env{'request.symb'} && $env{'request.course.id'} ) {
                               $cfile = '/adm/switchserver?otherserver='.$home.'&amp;role='.
                                        &HTML::Entities::encode($env{'request.role'},'"<>&').'&amp;symb='.
                                        &HTML::Entities::encode($env{'request.symb'},'"<>&');
                               $bot = "need_switchserver('$cfile');";
                           }
                       }
                       $editbutton=&switch
                          ('','',6,1,'pcstr.png','edit[_1]','resource[_2]',
                           $bot,"Edit this resource");
                       $noeditbutton = 0;
                   }
             } elsif ($editbutton eq '') {              } elsif ($editbutton eq '') {
                 $editbutton=&clear(6,1);                  $editbutton=&clear(6,1);
             }              }
Line 604  sub innerregister { Line 551  sub innerregister {
                         my $cfile = &edit_course_upload($file,$cnum,$cdom);                          my $cfile = &edit_course_upload($file,$cnum,$cdom);
                         if ($cfile) {                          if ($cfile) {
                             $editbutton=&switch                              $editbutton=&switch
                                         ('','',6,1,'pcstr.gif','edit[_1]',                                          ('','',6,1,'pcstr.png','edit[_1]',
                                          'resource[_2]',"go('".$cfile."');",                                           'resource[_2]',"go('".$cfile."');",
                                          'Edit this resource');                                           'Edit this resource');
                         }                          }
Line 617  sub innerregister { Line 564  sub innerregister {
 # 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 $cleandisfn = &Apache::loncommon::escape_single($thisdisfn);
  my $esc_currdir = &Apache::loncommon::escape_single($currdir);   my $esc_currdir = &Apache::loncommon::escape_single($currdir);
   #
   # Probably should be in mydesk.tab
   #
                 $menuitems=(<<ENDMENUITEMS);                  $menuitems=(<<ENDMENUITEMS);
 s&6&1&list.gif&list[_1]&dir[_1]&golist('$esc_currdir')&List current directory  s&6&1&list.png&list[_1]&dir[_1]&golist('$esc_currdir')&List current directory
 s&6&2&rtrv.gif&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$cleandisfn')&Retrieve old version  s&6&2&rtrv.png&retrieve[_1]&version[_1]&gocstr('/adm/retrieve','/~$uname/$cleandisfn')&Retrieve old version
 s&6&3&pub.gif&publish[_1]&resource[_3]&gocstr('/adm/publish','/~$uname/$cleandisfn')&Publish this resource  s&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/$cleandisfn')&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]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document  s&7&2&prt.png&prepare[_1]&printout[_1]&gocstr('/adm/printout','/~$uname/$cleandisfn')&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
             }              }
                   if (ref($bread_crumbs) eq 'ARRAY') {
                       &Apache::lonhtmlcommon::clear_breadcrumbs();
                       foreach my $crumb (@{$bread_crumbs}){
                           &Apache::lonhtmlcommon::add_breadcrumb($crumb);
                       }
                   }
         } elsif ( defined($env{'request.course.id'}) &&           } elsif ( defined($env{'request.course.id'}) && 
  $env{'request.symb'} ne '' ) {   $env{'request.symb'} ne '' ) {
   #
   # We are in a course and looking at a registred URL
   # Should probably be in mydesk.tab
   #
     $menuitems=(<<ENDMENUITEMS);      $menuitems=(<<ENDMENUITEMS);
 c&3&1  c&3&1
 s&2&1&back.gif&backward[_1]&&gopost('/adm/flip','back:'+currentURL)&Go to the previous resource in the course sequence&&1  s&2&1&back.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&&1  
 ENDMENUITEMS  ENDMENUITEMS
               if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F' && $env{'request.uri'} =~ /^\/res/) {
                   # wishlist is only available for users with access to resource-pool
                   # and links can only be set for resources within the resource-pool
                   $menuitems .= (<<ENDMENUITEMS);
   s&9&1&wishlist-link.png&set[_1]&wishlistlink[_2]&set_wishlistlink()&Set a link for this resource to wishlist&&1
   ENDMENUITEMS
               }
   
 my $currentURL = &Apache::loncommon::get_symb();  my $currentURL = &Apache::loncommon::get_symb();
 my ($symb_old,$symb_old_enc) = &Apache::loncommon::clean_symb($currentURL);  my ($symb_old,$symb_old_enc) = &Apache::loncommon::clean_symb($currentURL);
 my $annotation = &Apache::loncommon::get_annotation($symb_old,$symb_old_enc);  my $annotation = &Apache::loncommon::get_annotation($symb_old,$symb_old_enc);
 $menuitems.="s&9&3&";  $menuitems.="s&9&3&";
 if(length($annotation) > 0){  if(length($annotation) > 0){
  $menuitems.="anot2.gif";   $menuitems.="anot2.png";
 }else{  }else{
  $menuitems.="anot.gif";   $menuitems.="anot.png";
 }  }
 $menuitems.="&anno-[_1]&tations[_1]&annotate()&";  $menuitems.="&anno-[_1]&tations[_1]&annotate()&";
 $menuitems.="Make notes and annotations about this resource&&1\n";  $menuitems.="Make notes and annotations about this resource&&1\n";
   
             unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) {              unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) {
  if (!$env{'request.enc'}) {   if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) {
     $menuitems.=(<<ENDREALRES);      $menuitems.=(<<ENDREALRES);
 s&6&3&catalog.gif&catalog[_2]&info[_1]&catalog_info()&Show Metadata  s&6&3&catalog.png&catalog[_2]&info[_1]&catalog_info()&Show Metadata
 ENDREALRES  ENDREALRES
                 }                  }
         $menuitems.=(<<ENDREALRES);          $menuitems.=(<<ENDREALRES);
 s&8&1&eval.gif&evaluate[_1]&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource  s&8&1&eval.png&evaluate[_1]&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
 s&8&2&fdbk.gif&feedback[_1]&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource  s&8&2&fdbk.png&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/) {   if ($env{'request.uri'} =~ /^\/res/) {
     $menuitems .= (<<ENDMENUITEMS);      $menuitems .= (<<ENDMENUITEMS);
 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
 ENDMENUITEMS  ENDMENUITEMS
               if (&Apache::lonnet::allowed('bre', $env{'request.course.id'}) eq 'F') {
                   # wishlist is only available for users with access to resource-pool
                   $menuitems .= (<<ENDMENUITEMS);
   s&9&1&wishlist-link.png&set[_1]&wishlistlink[_2]&set_wishlistlink()&Set a link for this resource to wishlist&&1
   ENDMENUITEMS
               }
  }   }
         my $buttons='';          my $buttons='';
         foreach (split(/\n/,$menuitems)) {          foreach (split(/\n/,$menuitems)) {
Line 695  ENDMENUITEMS Line 670  ENDMENUITEMS
             }              }
         }          }
   
         if ($textual) {  
     my $addremote=0;      my $addremote=0;
     foreach (@inlineremote) { if ($_ ne '') { $addremote=1; } }      foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }
     my $inlinebuttons='';      if ($addremote) {
     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          Apache::lonhtmlcommon::clear_breadcrumb_tools();
 # 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>  
 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">              Apache::lonhtmlcommon::add_breadcrumb_tool(
 // BEGIN LON-CAPA Internal                  'navigation', @inlineremote[21,23]);
 var swmenu=null;  
   
     function LONCAPAreg() {          if(hidden_button_check() ne 'yes') {
   swmenu=$reopen              Apache::lonhtmlcommon::add_breadcrumb_tool(
           $timesync                  'tools', @inlineremote[93,91,81,82,83]);
           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() {              #publish button in construction space
               if ($env{'request.state'} eq 'construct'){
                   Apache::lonhtmlcommon::add_breadcrumb_tool(
                        'advtools', @inlineremote[63]);
               }else{
                   Apache::lonhtmlcommon::add_breadcrumb_tool(
                        'tools', @inlineremote[63]);
               }
               
               unless ($env{'request.noversionuri'}=~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {
                   Apache::lonhtmlcommon::add_breadcrumb_tool(
                       'advtools', @inlineremote[61,71,72,73,92]);
               }
           }
     }      }
   
 // END LON-CAPA Internal      return   Apache::lonhtmlcommon::scripttag('', 'start')
 </script>             . Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
 ENDDONOTREGTHIS             . Apache::lonhtmlcommon::scripttag('', 'end');
        }  
 # =============================================================================  
     }  
     return $result;  
 }  }
   
 sub is_course_upload {  sub is_course_upload {
Line 882  sub edit_course_upload { Line 740  sub edit_course_upload {
     return $cfile;      return $cfile;
 }  }
   
 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('[_1]Continue[_2] on in Inline Menu mode'  
                 ,'<a href="/adm/remote?action=collapse&amp;url='.$esclowerurl.'">'  
                 ,'</a>');  
     return(<<ENDREMOTEFORM);  
 <p>  
 <form name="wheel">  
 <input name="spin" type="text" size="60" />  
 </form>  
 </p>  
 <p>$link</p>  
 ENDREMOTEFORM  
 }  
   
 sub get_menu_name {  
     my $hostid = $Apache::lonnet::perlvar{'lonHostID'};  
     $hostid =~ s/\W//g;  
     return 'LCmenu'.$hostid;  
 }  
   
   
 sub reopenmenu {  
    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)=@_;
     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 1069  sub switch { Line 759  sub switch {
     $top=&mt($top);      $top=&mt($top);
     $bot=&mt($bot);      $bot=&mt($bot);
     $desc=&mt($desc);      $desc=&mt($desc);
     if (($env{'environment.remote'} ne 'off') || ($env{'environment.icons'} eq 'classic')) {  
        $img=&mt($img);  
     }  
     my $idx=10*$row+$col;      my $idx=10*$row+$col;
     $category_members{$cat}.=':'.$idx;      $category_members{$cat}.=':'.$idx;
   
     unless (($env{'browser.interface'} eq 'textual')  ||  # Inline Menu
             ($env{'environment.remote'} eq 'off')) {      if ($nobreak==2) { return ''; }
 # Remote      my $text=$top.' '.$bot;
        return "\n".      $text=~s/\s*\-\s*//gs;
  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=      my $pic=
    '<img alt="'.$text.'" src="'.     '<img alt="'.$text.'" src="'.
    &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).     &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).
    '" align="'.($nobreak==3?'right':'left').'" class="LC_noBorder" />';     '" align="'.($nobreak==3?'right':'left').'" class="LC_icon" />';
        if ($env{'browser.interface'} eq 'faketextual') {      if ($env{'browser.interface'} eq 'faketextual') {
 # Accessibility  # Main Menu
    if ($nobreak==3) {     if ($nobreak==3) {
        $inlineremote[$idx]="\n".         $inlineremote[$idx]="\n".
    '<td class="LC_menubuttons_text" align="right">'.$text.     '<td class="LC_menubuttons_text" align="right">'.$text.
Line 1124  sub switch { Line 790  sub switch {
    '</a></td><td class="LC_menubuttons_text" colspan="3">'.     '</a></td><td class="LC_menubuttons_text" colspan="3">'.
    '<a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$desc.'</span></a></td></tr>';     '<a class="LC_menubuttons_link" href="javascript:'.$act.';"><span class="LC_menubuttons_inline_text">'.$desc.'</span></a></td></tr>';
    }     }
        } else {      } else {
 # Inline Menu  # Inline Menu
            if ($env{'environment.icons'} eq 'iconsonly') {        $inlineremote[$idx]=
               $inlineremote[$idx]='<a title="'.$desc.'" href="javascript:'.$act.';">'.$pic.'</a>';         '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.
            } else {         '<span class="LC_menubuttons_inline_text">'.$desc.'</span></a>';
       $inlineremote[$idx]=      }
    '<a class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.  
    '<span class="LC_menubuttons_inline_text">'.$desc.'</span></a>';  
            }  
        }  
    }  
     return '';      return '';
 }  }
   
Line 1152  sub secondlevel { Line 813  sub secondlevel {
     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 {  sub inlinemenu {
     undef(@inlineremote);      undef(@inlineremote);
     undef(%category_members);      undef(%category_members);
   # calling rawconfig with "1" will evaluate mydesk.tab, even if there is no active remote control
     &rawconfig(1);      &rawconfig(1);
     my $output='<table id="LC_mainmenu"><tr>';      my $output='<table><tr>';
     for (my $col=1; $col<=2; $col++) {      for (my $col=1; $col<=2; $col++) {
         $output.='<td class="LC_mainmenu_col_fieldset">';          $output.='<td class="LC_mainmenu_col_fieldset">';
         for (my $row=1; $row<=8; $row++) {          for (my $row=1; $row<=8; $row++) {
             foreach my $cat (keys(%category_members)) {              foreach my $cat (keys(%category_members)) {
                if ($category_positions{$cat} ne "$col,$row") { next; }                 if ($category_positions{$cat} ne "$col,$row") { next; }
                #$output.='<table><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';                 #$output.='<table><tr><td colspan="4" class="LC_menubuttons_category">'.&mt($category_names{$cat}).'</td></tr>';
                $output.='<div class="LC_ContentBoxSpecial">';                 $output.='<div class="LC_Box LC_400Box">';
        $output.='<h4 class="LC_hcell">'.&mt($category_names{$cat}).'</h4>';         $output.='<h3 class="LC_hcell">'.&mt($category_names{$cat}).'</h3>';
                $output.='<table>';                 $output.='<table>';
                my %active=();                 my %active=();
                foreach my $menu_item (split(/\:/,$category_members{$cat})) {                 foreach my $menu_item (split(/\:/,$category_members{$cat})) {
Line 1194  sub inlinemenu { Line 848  sub inlinemenu {
 }  }
   
 sub rawconfig {  sub rawconfig {
   #
   # This evaluates mydesk.tab
   # Need to add more positions and more privileges to deal with all
   # menu items.
   #
     my $textualoverride=shift;      my $textualoverride=shift;
     my $output='';      my $output='';
     unless (($env{'browser.interface'} eq 'textual') ||      return '' unless $textualoverride;
             ($env{'environment.remote'} eq 'off')) {  
        $output.=  
  "window.status='Opening Remote Control';var swmenu=".&openmenu().  
 "\nwindow.status='Configuring Remote Control ';";  
     } else {  
        unless ($textualoverride) { return ''; }  
     }  
     my $uname=$env{'user.name'};      my $uname=$env{'user.name'};
     my $udom=$env{'user.domain'};      my $udom=$env{'user.domain'};
     my $adv=$env{'user.adv'};      my $adv=$env{'user.adv'};
     my $show_course=&show_course();      my $show_course=&Apache::loncommon::show_course();
     my $author=$env{'user.author'};      my $author=$env{'user.author'};
     my $crs='';      my $crs='';
       my $crstype='';
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
        $crs='/'.$env{'request.course.id'};         $crs='/'.$env{'request.course.id'};
        if ($env{'request.course.sec'}) {         if ($env{'request.course.sec'}) {
    $crs.='_'.$env{'request.course.sec'};     $crs.='_'.$env{'request.course.sec'};
        }         }
        $crs=~s/\_/\//g;         $crs=~s/\_/\//g;
          $crstype = &Apache::loncommon::course_type();
     }      }
     my $pub=($env{'request.state'} eq 'published');      my $pub=($env{'request.state'} eq 'published');
     my $con=($env{'request.state'} eq 'construct');      my $con=($env{'request.state'} eq 'construct');
Line 1225  sub rawconfig { Line 879  sub rawconfig {
         my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line);          my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line);
         $prt=~s/\$uname/$uname/g;          $prt=~s/\$uname/$uname/g;
         $prt=~s/\$udom/$udom/g;          $prt=~s/\$udom/$udom/g;
         $prt=~s/\$crs/$crs/g;           if ($prt =~ /\$crs/) {
               next unless ($env{'request.course.id'});
               next if ($crstype eq 'Community');
               $prt=~s/\$crs/$crs/g;
           } elsif ($prt =~ /\$cmty/) {
               next unless ($env{'request.course.id'});
               next if ($crstype ne 'Community');
               $prt=~s/\$cmty/$crs/g;
           }
         $prt=~s/\$requested_domain/$requested_domain/g;          $prt=~s/\$requested_domain/$requested_domain/g;
         if ($category_names{$cat}!~/\w/) { $cat='oth'; }          if ($category_names{$cat}!~/\w/) { $cat='oth'; }
         my $type = &Apache::loncommon::course_type();  
         if ($type eq 'Group') {  
             $desc = &convert_menu_function($desc,$type);  
         }  
         if ($pro eq 'clear') {          if ($pro eq 'clear') {
     $output.=&clear($row,$col);      $output.=&clear($row,$col);
         } elsif ($pro eq 'any') {          } elsif ($pro eq 'any') {
Line 1258  sub rawconfig { Line 916  sub rawconfig {
   $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);    $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
             }              }
         } elsif (($pro=~/^p(\w+)/) && ($prt)) {          } elsif (($pro=~/^p(\w+)/) && ($prt)) {
     if (&Apache::lonnet::allowed($1,$prt)) {              my $priv = $1;
               if ($priv =~ /^mdc(Course|Community)/) {
                   if ($crstype eq $1) {
                       $priv = 'mdc';
                   } else {
                       next;
                   }
               }
       if (&Apache::lonnet::allowed($priv,$prt)) {
                $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
             }              }
         } elsif ($pro eq 'course') {          } elsif ($pro eq 'course')  {
             if ($env{'request.course.fn'}) {              if (($env{'request.course.fn'}) && ($crstype ne 'Community')) {
                $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
     }      }
           } elsif ($pro eq 'community')  {
               if (($env{'request.course.fn'}) && ($crstype eq 'Community')) {
                  $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
               }
         } elsif ($pro =~ /^courseenv_(.*)$/) {          } elsif ($pro =~ /^courseenv_(.*)$/) {
             my $key = $1;              my $key = $1;
             if ($env{'course.'.$env{'request.course.id'}.'.'.$key}) {              if ($crstype ne 'Community') {
                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                  my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
                   if ($key eq 'canuse_pdfforms') {
                       if ($env{'request.course.id'} && $coursepref eq '') {
                           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                           $coursepref = $domdefs{'canuse_pdfforms'};
                       }
                   }
                   if ($coursepref) { 
                       $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
                   }
               }
           } elsif ($pro =~ /^communityenv_(.*)$/) {
               my $key = $1;
               if ($crstype eq 'Community') {
                   my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
                   if ($key eq 'canuse_pdfforms') {
                       if ($env{'request.course.id'} && $coursepref eq '') {
                           my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
                           $coursepref = $domdefs{'canuse_pdfforms'};
                       }
                   }
                   if ($coursepref) { 
                       $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
                   }
             }              }
         } elsif ($pro =~ /^course_(.*)$/) {          } elsif ($pro =~ /^course_(.*)$/) {
             # Check for permissions inside of a course              # Check for permissions inside of a course
             if (($env{'request.course.id'}) &&              if (($env{'request.course.id'}) && ($crstype ne 'Community') && 
                 (&Apache::lonnet::allowed($1,$env{'request.course.id'}.                  (&Apache::lonnet::allowed($1,$env{'request.course.id'}.
             ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))              ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))
                  )) {                   )) {
                 $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);                  $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
     }      }
           } elsif ($pro =~ /^community_(.*)$/) {
               # Check for permissions inside of a community
               if (($env{'request.course.id'}) && ($crstype eq 'Community') &&   
                   (&Apache::lonnet::allowed($1,$env{'request.course.id'}.
               ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))
                    )) {
                   $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
               }
         } elsif ($pro eq 'author') {          } elsif ($pro eq 'author') {
             if ($author) {              if ($author) {
                 if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) ||                  if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) ||
Line 1310  sub rawconfig { Line 1011  sub rawconfig {
                     $output.=&clear($row,$col);                      $output.=&clear($row,$col);
                     next;                      next;
                 }                  }
             } elsif ($prt eq 'reqcrs') {              } elsif (($prt eq 'reqcrsnsc') || ($prt eq 'reqcrsshc')) {
                 my $showreqcrs = 0;                  if (($prt eq 'reqcrsnsc') && ($show_course))   {
                 foreach my $type ('official','unofficial') {                      next;
                     if (&Apache::lonnet::usertools_access($env{'user.name'},                  }
                                                     $env{'user.domain'},                  if (($prt eq 'reqcrsshc') && (!$show_course)) {
                                                     $type,undef,'requestcourses')) {                      next;
                         $showreqcrs = 1;  
                         last;  
                     }  
                 }                  }
                   my $showreqcrs = &check_for_rcrs();
                 if (!$showreqcrs) {                  if (!$showreqcrs) {
                     $output.=&clear($row,$col);                      $output.=&clear($row,$col);
                     next;                      next;
Line 1330  sub rawconfig { Line 1029  sub rawconfig {
           $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);            $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
         }          }
     }      }
     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 = &get_menu_name();                                                $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;  
     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]));      my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0]));
       if ($currenturl =~ m{^/adm/wrapper/ext/}
           && $env{'request.external.querystring'} ) {
               $currenturl .= ($currenturl=~/\?/)?'&':'?'.$env{'request.external.querystring'};
       }
     $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));      $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl));
           
     my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});      my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'});
     my $nav_control=&nav_control_js();  
       my $dc_popup_cid;
       if ($env{'user.adv'} && exists($env{'user.role.dc./'.
                           $env{'course.'.$env{'request.course.id'}.
                                    '.domain'}.'/'})) {
           $dc_popup_cid = &dc_popup_js();
       }
   
     my $start_page_annotate =       my $start_page_annotate = 
         &Apache::loncommon::start_page('Annotator',undef,          &Apache::loncommon::start_page('Annotator',undef,
Line 1406  sub utilityfunctions { Line 1107  sub utilityfunctions {
     my $end_page_annotate =       my $end_page_annotate = 
         &Apache::loncommon::end_page({'js_ready' => 1});          &Apache::loncommon::end_page({'js_ready' => 1});
   
     my $start_page_bookmark =       my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.
         &Apache::loncommon::start_page('Bookmarks',undef,                           &mt('Switch server?');
   
       my $start_page_wishlistlink = 
           &Apache::loncommon::start_page('Set link to wishlist',undef,
        {'only_body' => 1,         {'only_body' => 1,
  'js_ready'  => 1,   'js_ready'  => 1,
  'bgcolor'   => '#BBBBBB',});   'bgcolor'   => '#FFFFFF',});
   
       my $warningLink = &mt('You must insert a title!');
   
     my $end_page_bookmark =       # HTML-Markup for 'Set a link for this resource to wishlist'
       # this is written via JavaScript document.write (function set_wishlistlink) 
       # it is split into 3 parts and the inputfields for title and path are left out
       # these fields are inserted later to set the values for title and path
       # automatically via JavaScript (document.title and location.pathname) 
       my $in_page_wishlistlink1 = '<h1>'.&mt('Set a link to wishlist').'</h1>'.
                                   '<form method="post" name="newlink" action="/adm/wishlist?mode=set" '.
                                   'onsubmit="return newlinksubmit();" >'.
                                   &Apache::lonhtmlcommon::start_pick_box().
                                   &Apache::lonhtmlcommon::row_title(&mt('Link Title'));
   
       my $in_page_wishlistlink2 = &Apache::lonhtmlcommon::row_closure().
                                   &Apache::lonhtmlcommon::row_title(&mt('Path'));
   
       my $in_page_wishlistlink3 = &Apache::lonhtmlcommon::row_closure().
                                   &Apache::lonhtmlcommon::row_title(&mt('Note')).
                                   '<textarea name="note" rows="3" cols="35" style="width:100%"></textarea>'.
                                   &Apache::lonhtmlcommon::row_closure(1).
                                   &Apache::lonhtmlcommon::end_pick_box().
                                   '<br/><br/>'.
                                   '<input type="submit" value="'.&mt('Save in').'" />'.
                                   '<select name="folders">'.
                                   &Apache::lonwishlist::getfoldersOption().
                                   '</select>'.
                                   '<input type="button" value="'.&mt('cancel').'" onclick="javascript:window.close();" />'.
                                   '</form>';
   
       # remove all \n for inserting on javascript document.write
       $in_page_wishlistlink1 =~ s/\n//g;
       $in_page_wishlistlink2 =~ s/\n//g;
       $in_page_wishlistlink3 =~ s/\n//g;
   
       my $end_page_wishlistlink = 
         &Apache::loncommon::end_page({'js_ready' => 1});          &Apache::loncommon::end_page({'js_ready' => 1});
   
 return (<<ENDUTILITY)  return (<<ENDUTILITY)
Line 1421  return (<<ENDUTILITY) Line 1159  return (<<ENDUTILITY)
     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 1431  function go(url) { Line 1169  function go(url) {
    }     }
 }  }
   
   function need_switchserver(url) {
       if (url!='' && url!= null) {
           if (confirm("$confirm_switch")) {
               go(url); 
           }
       }
       return;
   }
   
 function gopost(url,postdata) {  function gopost(url,postdata) {
    if (url!='') {     if (url!='') {
       this.document.server.action=url;        this.document.server.action=url;
Line 1507  function catalog_info() { Line 1254  function catalog_info() {
 }  }
   
 function chat_win() {  function chat_win() {
    lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');     lonchat=window.open('/res/adm/pages/chatroom.html',"LONchat",'height=320,width=480,resizable=yes,location=no,menubar=no,toolbar=no');
 }  }
   
 function group_chat(group) {  function group_chat(group) {
Line 1516  function group_chat(group) { Line 1263  function group_chat(group) {
    grpchat=window.open(url,winName,'height=320,width=280,resizable=yes,location=no,menubar=no,toolbar=no');     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() {  function annotate() {
    w_Annotator_flag=1;     w_Annotator_flag=1;
    annotator=window.open('','Annotator','width=365,height=265,scrollbars=0');     annotator=window.open('','Annotator','width=365,height=265,scrollbars=0');
Line 1536  function annotate() { Line 1276  function annotate() {
    annotator.document.close();     annotator.document.close();
 }  }
   
 function set_bookmark() {  function set_wishlistlink(title, path) {
    go('');     if (!title) {
    clienttitle=document.title;         title=document.title;
    clienthref=location.pathname;     }
    w_bmquery_flag=1;     if (!path) {
    bmquery=window.open('','bmquery','width=365,height=165,scrollbars=0');         path=location.pathname;
    bmquery.document.write(     }
    '$start_page_bookmark'     title = title.replace(/^LON-CAPA /,'');
    +'<center><form method="post"'     wishlistlink=window.open('','wishlistNewLink','width=560,height=350,scrollbars=0');
    +' name="newlink" action="/adm/bookmarks" target="bmquery" '     wishlistlink.document.write(
    +'> <table width="340" height="150" '     '$start_page_wishlistlink'
    +'bgcolor="#FFFFFF" align="center"><tr><td>Link Name:<br /><input '     +'<script type="text\/javascript">'
    +'type="text" name="title" size="45" value="'+clienttitle+'" />'     +'function newlinksubmit(){'
    +'<br />Address:<br /><input type="text" name="address" size="45" '     +'var title = document.getElementsByName("title")[0].value;'
    +'value="'+clienthref+'" /><br /><center><input type="submit" '     +'if (!title) {'
    +'value="Save" /> <input type="button" value="Close" '     +'alert("$warningLink");'
    +'onclick="javascript:window.close();" /></center></td>'     +'return false;}'
    +'</tr></table></form></center>'     +'return true;}'
    +'$end_page_bookmark' );     +'<\/scr'+'ipt>'
    bmquery.document.close();     +'$in_page_wishlistlink1'
      +'<input type="text" name="title" size="45" value="'+title+'"/>'
      +'$in_page_wishlistlink2'
      +'<input type="text" name="path" size="45" value="'+path+'" '
      +'readonly="readonly" style="background-color: #DDDDDD"/>'
      +'$in_page_wishlistlink3'
      +'$end_page_wishlistlink' );
      wishlistlink.document.close();
   }
   
   function open_Wishlist_Import(rat) {
      var newWin;
      if (rat) {
          newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import&rat='+rat,
                               'wishlistImport','scrollbars=1,resizable=1,menubar=0');
      }
      else {
          newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import',
                               'wishlistImport','scrollbars=1,resizable=1,menubar=0');
      }
      newWin.focus();
 }  }
   
 ENDUTILITY  ENDUTILITY
Line 1590  sub constspaceform { Line 1350  sub constspaceform {
 ENDCONSTSPACEFORM  ENDCONSTSPACEFORM
 }  }
   
   
 sub get_nav_status {  
     my $navstatus="swmenu.w_loncapanav_flag=";  
     if ($env{'environment.remotenavmap'} eq 'on') {  
  $navstatus.="1";  
     } else {  
  $navstatus.="-1";  
     }  
     return $navstatus;  
 }  
   
 #FIXME this needs to move into mydesktab and the other locations   
 # the text is generated  
 sub convert_menu_function {  
     my ($rolename,$type) = @_;  
     if ($type eq 'Group') {  
         $rolename =~ s/student/member/g;  
         $rolename =~ s/group/team/g;  
         $rolename =~ s/course/group/g;  
         $rolename =~ s/Course/Group/g;  
     }  
     return $rolename;  
 }  
   
 sub hidden_button_check {  sub hidden_button_check {
     my $hidden;      if ( $env{'request.course.id'} eq ''
     if ($env{'request.course.id'} eq '') {           || $env{'request.role.adv'} ) {
         return;  
     }  
     if ($env{'request.role.adv'}) {  
         return;          return;
     }      }
     my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide');      my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide');
Line 1628  sub hidden_button_check { Line 1362  sub hidden_button_check {
   
 sub roles_selector {  sub roles_selector {
     my ($cdom,$cnum) = @_;      my ($cdom,$cnum) = @_;
       my $crstype = &Apache::loncommon::course_type();
     my $now = time;      my $now = time;
     my (%courseroles,%seccount);      my (%courseroles,%seccount);
     my $is_cc;      my $is_cc;
     my $role_selector;      my $role_selector;
     if ($env{'user.role.cc./'.$cdom.'/'.$cnum}) {      my $ccrole;
         my ($start,$end) = split(/\./,$env{'user.role.cc./'.$cdom.'/'.$cnum});      if ($crstype eq 'Community') {
           $ccrole = 'co';
       } else {
           $ccrole = 'cc';
       } 
       if ($env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}) {
           my ($start,$end) = split(/\./,$env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum});
                   
         if ((($start) && ($start<0)) ||           if ((($start) && ($start<0)) || 
             (($end) && ($end<$now))  ||              (($end) && ($end<$now))  ||
Line 1644  sub roles_selector { Line 1385  sub roles_selector {
         }          }
     }      }
     if ($is_cc) {      if ($is_cc) {
         &get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount);           &get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount);
     } else {      } else {
         my %gotnosection;          my %gotnosection;
         foreach my $item (keys(%env)) {          foreach my $item (keys(%env)) {
Line 1662  sub roles_selector { Line 1403  sub roles_selector {
                 }                  }
                 if (ref($courseroles{$role}) eq 'ARRAY') {                  if (ref($courseroles{$role}) eq 'ARRAY') {
                     if ($sec ne '') {                      if ($sec ne '') {
                         if (!grep(/^Q$sec\E$/,@{$courseroles{$role}})) {                          if (!grep(/^\Q$sec\E$/,@{$courseroles{$role}})) {
                             push(@{$courseroles{$role}},$sec);                              push(@{$courseroles{$role}},$sec);
                             $seccount{$role} ++;                              $seccount{$role} ++;
                         }                          }
Line 1677  sub roles_selector { Line 1418  sub roles_selector {
             }              }
         }          }
     }      }
     my @roles_order = ('cc','in','ta','ep','ad','st');      my $switchtext;
       if ($crstype eq 'Community') {
           $switchtext = &mt('Switch community role to...')
       } else {
           $switchtext = &mt('Switch course role to...')
       }
       my @roles_order = ($ccrole,'in','ta','ep','ad','st');
     if (keys(%courseroles) > 1) {      if (keys(%courseroles) > 1) {
         $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles);          $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles);
         $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">          $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">
                           <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';                            <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';
         $role_selector .= '<option value="">'.&mt('Switch course role to...').'</option>';          $role_selector .= '<option value="">'.$switchtext.'</option>';
         foreach my $role (@roles_order) {          foreach my $role (@roles_order) {
             if (defined($courseroles{$role})) {              if (defined($courseroles{$role})) {
                 $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>';                   $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role,$crstype).'</option>'; 
             }              }
         }          }
         foreach my $role (sort(keys(%courseroles))) {          foreach my $role (sort(keys(%courseroles))) {
Line 1695  sub roles_selector { Line 1442  sub roles_selector {
         }          }
         $role_selector .= '</select>'."\n".          $role_selector .= '</select>'."\n".
                '<input type="hidden" name="destinationurl" value="'.                 '<input type="hidden" name="destinationurl" value="'.
                $ENV{'REQUEST_URI'}.'" />'."\n".                 &HTML::Entities::encode($ENV{'REQUEST_URI'}).'" />'."\n".
                '<input type="hidden" name="gotorole" value="1" />'."\n".                 '<input type="hidden" name="gotorole" value="1" />'."\n".
                '<input type="hidden" name="selectrole" value="" />'."\n".                 '<input type="hidden" name="selectrole" value="" />'."\n".
                '<input type="hidden" name="switch" value="1" />'."\n".                 '<input type="hidden" name="switch" value="1" />'."\n".
Line 1790  sub jump_to_role { Line 1537  sub jump_to_role {
                    '    numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n";                     '    numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n";
         }          }
     }      }
     my $output = <<"END";      return <<"END";
 <script type="text/javascript">  <script type="text/javascript">
   //<![CDATA[
 function adhocRole(roleitem) {  function adhocRole(roleitem) {
     $js      $js
     var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;      var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;
Line 1862  function retrieveIndex(item) { Line 1610  function retrieveIndex(item) {
     }      }
     return -1;      return -1;
 }  }
   // ]]>
   
 </script>  </script>
 END  END
     return $output;  
 }  }
   
   
Line 1874  END Line 1620  END
   
 BEGIN {  BEGIN {
     if (! defined($readdesk)) {      if (! defined($readdesk)) {
  {          {
     my $tabfile = $Apache::lonnet::perlvar{'lonTabDir'}.'/mydesk.tab';              my $tabfile = $Apache::lonnet::perlvar{'lonTabDir'}.'/mydesk.tab';
     if ( CORE::open( my $config,"<$tabfile") ) {              if ( CORE::open( my $config,"<$tabfile") ) {
  while (my $configline=<$config>) {                  while (my $configline=<$config>) {
     $configline=(split(/\#/,$configline))[0];                      $configline=(split(/\#/,$configline))[0];
     $configline=~s/^\s+//;                      $configline=~s/^\s+//;
     chomp($configline);                      chomp($configline);
                     if ($configline=~/^cat\:/) {                      if ($configline=~/^cat\:/) {
                        my @entries=split(/\:/,$configline);                          my @entries=split(/\:/,$configline);
                        $category_positions{$entries[2]}=$entries[1];                          $category_positions{$entries[2]}=$entries[1];
                        $category_names{$entries[2]}=$entries[3];                          $category_names{$entries[2]}=$entries[3];
     } elsif ($configline) {                      } elsif ($configline=~/^prim\:/) {
  push(@desklines,$configline);                          my @entries = (split(/\:/, $configline))[1..5];
     }                          push @primary_menu, \@entries;
  }                      } elsif ($configline=~/^scnd\:/) {
  CORE::close($config);                          my @entries = (split(/\:/, $configline))[1..5];
     }                          push @secondary_menu, \@entries; 
  }                      } elsif ($configline) {
  $readdesk='done';                          push(@desklines,$configline);
                       }
                   }
                   CORE::close($config);
               }
           }
           $readdesk='done';
     }      }
 }  }
   
 1;  1;
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.263  
changed lines
  Added in v.1.337


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