Diff for /loncom/interface/lonmenu.pm between versions 1.369.2.48 and 1.388

version 1.369.2.48, 2013/12/13 14:30:49 version 1.388, 2012/10/29 17:38:56
Line 106  secondary_menu(). Line 106  secondary_menu().
   
 =item primary_menu()  =item primary_menu()
   
 This routine evaluates @primary_menu and returns a two item array,   This routine evaluates @primary_menu and returns XHTML for the menu
 with the array elements containing XHTML for the left and right sides of   that contains following links: About, Message, Roles, Help, Logout
 the menu that contains the following links: About, Message, Roles, Help, Logout   
 @primary_menu is filled within the BEGIN block of this module with   @primary_menu is filled within the BEGIN block of this module with 
 entries from mydesk.tab  entries from mydesk.tab 
   
 =item secondary_menu()  =item secondary_menu()
   
Line 118  Same as primary_menu() but operates on @ Line 117  Same as primary_menu() but operates on @
   
 =item create_submenu()  =item create_submenu()
   
 Creates XHTML for unordered list of sub-menu items which belong to a  Creates XHTML for unordered list of sub-menu items which belong to a 
 particular top-level menu item. Uses hover pseudo class in css to display  particular top-level menu item. Uses hover pseudo class in css to display
 dropdown list when mouse hovers over top-level item. Support for IE6  dropdown list when mouse hovers over top-level item. Support for IE6 
 (no hover psuedo class) via LC_hoverable class for <li> tag for top-  (no hover psuedo class) via LC_hoverable class for <li> tag for top-
 level item, which employs jQuery to handle behavior on mouseover.  level item, which employs jQuery to handle behavior on mouseover.
   
Line 132  Inputs: 4 - (a) link and (b) target for Line 131  Inputs: 4 - (a) link and (b) target for
   
 This gets called in order to register a URL in the body of the document  This gets called in order to register a URL in the body of the document
   
 =item loadevents()  
   
 =item unloadevents()  
   
 =item startupremote()  
   
 =item setflags()  
   
 =item maincall()  
   
 =item load_remote_msg()  
   
 =item get_menu_name()  
   
 =item reopenmenu()  
   
 =item open()  
   
 Open the menu  
   
 =item clear()  =item clear()
   
 =item switch()  =item switch()
Line 203  use HTML::Entities(); Line 182  use HTML::Entities();
 use Apache::lonwishlist();  use Apache::lonwishlist();
   
 use vars qw(@desklines %category_names %category_members %category_positions   use vars qw(@desklines %category_names %category_members %category_positions 
             $readdesk @primary_menu %primary_submenu @secondary_menu %secondary_submenu);              $readdesk @primary_menu %primary_submenu @secondary_menu);
   
 my @inlineremote;  my @inlineremote;
   
Line 224  sub prep_menuitem { Line 203  sub prep_menuitem {
            . qq| href="$$menuitem[0]" target="_top">$link</a></li>|;             . qq| href="$$menuitem[0]" target="_top">$link</a></li>|;
 }  }
   
 # primary_menu() evaluates @primary_menu and returns a two item array,  # primary_menu() evaluates @primary_menu and returns XHTML for the menu
 # with the array elements containing XHTML for the left and right sides of   # that contains following links:
 # the menu that contains the following links:  # About, Message, Personal, Roles, Help, Logout
 # Personal, About, Message, Roles, Help, Logout  
 # @primary_menu is filled within the BEGIN block of this module with   # @primary_menu is filled within the BEGIN block of this module with 
 # entries from mydesk.tab  # entries from mydesk.tab
 sub primary_menu {  sub primary_menu {
     my %menu;      my $menu;
     # each element of @primary contains following array:      # each element of @primary contains following array:
     # (link url, icon path, alt text, link text, condition, position)      # (link url, icon path, alt text, link text, condition)
     my $public;      my $public;
     if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))      if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
         || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {          || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
Line 258  sub primary_menu { Line 236  sub primary_menu {
                 && !&Apache::loncommon::show_course(); ##                  && !&Apache::loncommon::show_course(); ##
                   
         my $title = $menuitem->[3];          my $title = $menuitem->[3];
         my $position = $menuitem->[5];  
         if ($position eq '') {  
             $position = 'right';  
         }  
         if (defined($primary_submenu{$title})) {          if (defined($primary_submenu{$title})) {
             my ($link,$target);              my ($link,$target);
             if ($menuitem->[0] ne '') {              if ($menuitem->[0] ne '') {
Line 273  sub primary_menu { Line 247  sub primary_menu {
             my @primsub;              my @primsub;
             if (ref($primary_submenu{$title}) eq 'ARRAY') {              if (ref($primary_submenu{$title}) eq 'ARRAY') {
                 foreach my $item (@{$primary_submenu{$title}}) {                  foreach my $item (@{$primary_submenu{$title}}) {
                     next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'}));                       next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'}));
                     next if ((($item->[2] eq 'portfolio') ||                       next if (($item->[2] eq 'reqcrs') && (!&check_for_rcrs()));
                              ($item->[2] eq 'blog')) &&                       next if ((($item->[2] eq 'portfolio') ||
                                ($item->[2] eq 'blog')) &&
                              (!&Apache::lonnet::usertools_access('','',$item->[2],                               (!&Apache::lonnet::usertools_access('','',$item->[2],
                                                            undef,'tools')));                                                             undef,'tools')));
                     push(@primsub,$item);                      push(@primsub,$item);
                 }                  }
                 if (@primsub > 0) {                  if (@primsub > 0) {
                     $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1);                      $menu .= &create_submenu($link,$target,$title,\@primsub);
                 } elsif ($link) {                  } elsif ($link) {
                     $menu{$position} .= '<li><a href="'.$link.'" target="'.$target.'">'.&mt($title).'</a></li>';                      $menu .= '<li><a href="'.$link.'" target="'.$target.'">'.&mt($title).'</a></li>';
                 }                  }
             }              }
         } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink          } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink
Line 294  sub primary_menu { Line 269  sub primary_menu {
                                                                   'helpdeskmail',                                                                    'helpdeskmail',
                                                                   $defdom,$origmail);                                                                    $defdom,$origmail);
                 if ($to ne '') {                  if ($to ne '') {
                     $menu{$position} .= &prep_menuitem($menuitem);                       $menu .= &prep_menuitem($menuitem); 
                 }                  }
             } else {              } else {
                 $menu{$position} .= '<li>'.&Apache::loncommon::top_nav_help('Help').'</li>';                  $menu .= '<li>'.&Apache::loncommon::top_nav_help('Help').'</li>';
             }              }
         } else {          } else {
             $menu{$position} .= prep_menuitem($menuitem);              $menu .= prep_menuitem($menuitem);
         }          }
     }      }
     my @output = ('','');      $menu =~ s/\[domain\]/$env{'user.domain'}/g;
     if ($menu{'left'} ne '') {      $menu =~ s/\[user\]/$env{'user.name'}/g;
         $output[0] = "<ol class=\"LC_primary_menu LC_floatleft\">$menu{'left'}</ol>";  
     }      return "<ol class=\"LC_primary_menu LC_right\">$menu</ol>";
     if ($menu{'right'} ne '') {  
         $output[1] = "<ol class=\"LC_primary_menu LC_floatright LC_right\">$menu{'right'}</ol>";  
     }  
     return @output;  
 }  }
   
 #returns hashref {user=>'',dom=>''} containing:  #returns hashref {user=>'',dom=>''} containing:
Line 339  sub getauthor{ Line 310  sub getauthor{
 }  }
   
 sub secondary_menu {  sub secondary_menu {
     my ($httphost) = @_;  
     my $menu;      my $menu;
   
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
Line 348  sub secondary_menu { Line 318  sub secondary_menu {
                                                : '');                                                 : '');
     my $canedit       = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});      my $canedit       = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
     my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'};      my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'};
     if ($canviewroster eq 'disabled') {      my $canviewgrps   = &Apache::lonnet::allowed('vcg', $crs_sec); 
         undef($canviewroster);      my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec); 
     }      my $canviewwnew   = &Apache::lonnet::allowed('whn', $crs_sec); 
     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 $canmodpara    = &Apache::lonnet::allowed('opa', $crs_sec);
     my $canvgr        = &Apache::lonnet::allowed('vgr', $crs_sec);      my $canvgr        = &Apache::lonnet::allowed('vgr', $crs_sec);
     my $canmgr        = &Apache::lonnet::allowed('mgr', $crs_sec);      my $canmgr        = &Apache::lonnet::allowed('mgr', $crs_sec); 
     my $author        = &getauthor();      my $author        = &getauthor();
   
     my ($cdom,$cnum,$showsyllabus,$showfeeds,$showresv);  
     if ($env{'request.course.id'}) {  
         $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
         unless ($canedit) {  
             unless (&Apache::lonnet::is_on_map("public/$cdom/$cnum/syllabus")) {  
                 if (($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'}) ||  
                     ($env{'course.'.$env{'request.course.id'}.'.uploadedsyllabus'}) ||  
                     ($env{'course.'.$env{'request.course.id'}.'.updatedsyllabus'}) ||  
                     ($env{'request.course.syllabustime'})) {  
                     $showsyllabus = 1;  
                 }  
             }  
             if ($env{'request.course.feeds'}) {  
                 $showfeeds = 1;  
             }  
         }  
         unless ($canmgr) {  
             my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom);  
             if (keys(%slots) > 0) {  
                 $showresv = 1;  
             }  
         }  
     }  
   
     my ($canmodifycoauthor);  
     if ($env{'request.role'} eq "au./$env{'user.domain'}/") {  
         my $extent = "$env{'user.domain'}/$env{'user.name'}";  
         if ((&Apache::lonnet::allowed('cca',$extent)) ||  
             (&Apache::lonnet::allowed('caa',$extent))) {  
             $canmodifycoauthor = 1;  
         }  
     }  
   
     my %groups = &Apache::lonnet::get_active_groups(      my %groups = &Apache::lonnet::get_active_groups(
                      $env{'user.domain'}, $env{'user.name'},                       $env{'user.domain'}, $env{'user.name'},
                      $env{'course.' . $env{'request.course.id'} . '.domain'},                       $env{'course.' . $env{'request.course.id'} . '.domain'},
                      $env{'course.' . $env{'request.course.id'} . '.num'});                       $env{'course.' . $env{'request.course.id'} . '.num'});
   
     my ($roleswitcher_js,$roleswitcher_form);  
   
     foreach my $menuitem (@secondary_menu) {      foreach my $menuitem (@secondary_menu) {
         # evaluate conditions           # evaluate conditions 
         next if    ref($menuitem)  ne 'ARRAY';          next if    ref($menuitem)  ne 'ARRAY';
         next if    $$menuitem[4]   ne 'always'          next if    $$menuitem[4]   ne 'always'
                 && ($$menuitem[4]  ne 'author' && $$menuitem[4] ne 'cca')                  && $$menuitem[4]   ne 'author'
                 && !$env{'request.course.id'};                  && !$env{'request.course.id'};
         next if    $$menuitem[4]   =~ /^mdc/          next if    $$menuitem[4]   =~ /^mdc/
                 && !$canedit;                  && !$canedit;
         next if    $$menuitem[4]  eq 'mdcCourse'  
                 && ($crstype eq 'Community');  
         next if    $$menuitem[4]  eq 'mdcCommunity'  
                 && ($crstype eq 'Course');  
         next if    $$menuitem[4]  eq 'nvgr'          next if    $$menuitem[4]  eq 'nvgr'
                 && $canvgr;                  && $canvgr;
         next if    $$menuitem[4]  eq 'vgr'          next if    $$menuitem[4]  eq 'vgr'
Line 422  sub secondary_menu { Line 349  sub secondary_menu {
                 && ($canmodifyuser || !$canviewroster);                  && ($canmodifyuser || !$canviewroster);
         next if    $$menuitem[4]   eq 'mgr'          next if    $$menuitem[4]   eq 'mgr'
                 && !$canmgr;                  && !$canmgr;
         next if    $$menuitem[4]   eq 'showresv'          next if    $$menuitem[4]   eq 'nmgr'
                 && !$showresv;                  && $canmgr;
         next if    $$menuitem[4]   eq 'whn'          next if    $$menuitem[4]   eq 'whn'
                 && !$canviewwnew;                  && !$canviewwnew;
         next if    $$menuitem[4]   eq 'opa'          next if    $$menuitem[4]   eq 'opa'
                 && !$canmodpara;                  && !$canmodpara;
         next if    $$menuitem[4]   eq 'nvcg'          next if    $$menuitem[4]   =~ /showgroups$/
                 && ($canviewgrps || !%groups);                  && !$canviewgrps
         next if    $$menuitem[4]   eq 'showsyllabus'                  && !%groups;
                 && !$showsyllabus;  
         next if    $$menuitem[4]   eq 'showfeeds'  
                 && !$showfeeds;  
         next if    $$menuitem[4]    eq 'author'          next if    $$menuitem[4]    eq 'author'
                 && !$author;                  && !$author;
         next if    $$menuitem[4]    eq 'cca'  
                 && !$canmodifycoauthor;  
   
         my $title = $menuitem->[3];          if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
         if (defined($secondary_submenu{$title})) {  
             my ($link,$target);  
             if ($menuitem->[0] ne '') {  
                 $link = $menuitem->[0];  
                 $target = '_top';  
             } else {  
                 $link = '#';  
             }  
             my @scndsub;  
             if (ref($secondary_submenu{$title}) eq 'ARRAY') {  
                 foreach my $item (@{$secondary_submenu{$title}}) {  
                     if (ref($item) eq 'ARRAY') {  
                         next if ($item->[2] eq 'vgr' && !$canvgr);  
                         next if ($item->[2] eq 'opa' && !$canmodpara);  
                         next if ($item->[2] eq 'cst' && !$canmodifyuser);  
                         next if ($item->[2] eq 'mgr' && !$canmgr);  
                         next if ($item->[2] eq 'vcg' && !$canviewgrps);  
                         next if ($item->[2] eq 'mdc' && !$canedit);  
                         push(@scndsub,$item);   
                     }  
                 }  
                 if (@scndsub > 0) {  
                     $menu .= &create_submenu($link,$target,$title,\@scndsub,1);  
                 } elsif ($link ne '#') {  
                     $menu .= '<li><a href="'.$link.'" target="'.$target.'">'.&mt($title).'</a></li>';  
                 }  
             }  
         } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {  
             # special treatment for role selector              # special treatment for role selector
             ($roleswitcher_js,$roleswitcher_form,my $switcher) =              my $roles_selector = &roles_selector(
                 &roles_selector(  
                         $env{'course.' . $env{'request.course.id'} . '.domain'},                          $env{'course.' . $env{'request.course.id'} . '.domain'},
                         $env{'course.' . $env{'request.course.id'} . '.num'},                          $env{'course.' . $env{'request.course.id'} . '.num'}  );
                         $httphost  
                 );              $menu .= $roles_selector ? "<li>$roles_selector</li>"
             $menu .= $switcher;                                       : '';
         } else {          } else {
             if ($$menuitem[3] eq 'Syllabus' && $env{'request.course.id'}) {  
                 my $url = $$menuitem[0];  
                 $url =~ s{\[cdom\]/\[cnum\]}{$cdom/$cnum};  
                 if (&Apache::lonnet::is_on_map($url)) {  
                     unless ($$menuitem[0] =~ /\?register=1/) {  
                         $$menuitem[0] .= '?register=1';  
                     }  
                 } else {  
                     $$menuitem[0] =~ s{\?register=1}{};  
                 }  
             }  
             $menu .= &prep_menuitem(\@$menuitem);              $menu .= &prep_menuitem(\@$menuitem);
         }          }
     }      }
Line 511  sub secondary_menu { Line 393  sub secondary_menu {
     }      }
     $menu =~ s/\[uname\]/$$author{user}/g;      $menu =~ s/\[uname\]/$$author{user}/g;
     $menu =~ s/\[udom\]/$$author{dom}/g;      $menu =~ s/\[udom\]/$$author{dom}/g;
     if ($env{'request.course.id'}) {    
         $menu =~ s/\[cnum\]/$cnum/g;  
         $menu =~ s/\[cdom\]/$cdom/g;  
     }  
     if ($menu) {      if ($menu) {
         $menu = "<ul id=\"LC_secondary_menu\">$menu</ul>";          $menu = "<ul id=\"LC_secondary_menu\">$menu</ul>";
     }      }
     if ($roleswitcher_form) {  
         $menu .= "\n$roleswitcher_js\n$roleswitcher_form";  
     }  
     return $menu;      return $menu;
 }  }
   
 sub create_submenu {  sub create_submenu {
     my ($link,$target,$title,$submenu,$translate) = @_;      my ($link,$target,$title,$submenu) = @_;
     return unless (ref($submenu) eq 'ARRAY');      return unless (ref($submenu) eq 'ARRAY');
     my $disptarget;      my $disptarget;
     if ($target ne '') {      if ($target ne '') {
         $disptarget = ' target="'.$target.'"';          $disptarget = ' target="'.$target.'"';
     }      }
     my $name;  
     if ($title eq 'Personal') {  
         if ($env{'user.name'} && $env{'user.domain'}) {  
             $name = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});  
         } else {  
             $name = &mt($title);  
         }  
     } else {  
         $name = &mt($title);  
     }  
     my $menu = '<li class="LC_hoverable">'.      my $menu = '<li class="LC_hoverable">'.
                '<a href="'.$link.'"'.$disptarget.'>'.                 '<a href="'.$link.'"'.$disptarget.'>'.
                '<span class="LC_nobreak">'.$name.                 '<span class="LC_nobreak">'.&mt($title).
                '<span class="LC_fontsize_small" style="font-weight:normal;">'.                 '<span class="LC_fontsize_small" style="font-weight:normal;">'.
                ' &#9660;</span></span></a>'.                 ' &#9660;</span></span></a>'.
                '<ul>';                 '<ul>';
Line 552  sub create_submenu { Line 417  sub create_submenu {
     foreach my $item (@{$submenu}) {      foreach my $item (@{$submenu}) {
         $count ++;          $count ++;
         if (ref($item) eq 'ARRAY') {          if (ref($item) eq 'ARRAY') {
             my $href = $item->[0];  
             if ($href =~ /(aboutme|rss\.html)$/) {  
                 next unless (($env{'user.name'} ne '') && ($env{'user.domain'} ne ''));  
                 $href =~ s/\[domain\]/$env{'user.domain'}/g;  
                 $href =~ s/\[user\]/$env{'user.name'}/g;  
             }  
             my $borderbot;              my $borderbot;
             if ($count == $numsub) {              if ($count == $numsub) {
                 $borderbot = 'border-bottom:1px solid black;';                  $borderbot = 'border-bottom:1px solid black;';
             }              }
             $menu .= '<li style="margin:0;padding:0;'.              $menu .= '<li style="margin:0;padding:0;'.
                      $borderbot.'"><a href="'.$href.'">';                       $borderbot.'"><a href="'.$item->[0].'">'.
             if ($translate) {                       &mt($item->[1]).'</a></li>';
                 $menu .= &mt($item->[1]);  
             } else {  
                 $menu .= $item->[1];  
             }  
             $menu .= '</a></li>';  
         }          }
     }      }
     $menu .= '</ul></li>';      $menu .= '</ul></li>';
     return $menu;      return $menu;
 }  }
   
 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{'environment.remote'} ne 'on') ||  
         ((($env{'request.publicaccess'}) ||  
          (!&Apache::lonnet::is_on_map(  
            &unescape($env{'request.noversionuri'})))) &&  
         (!$forcereg))) {  
         return  
         $result  
        .'<script type="text/javascript">'."\n"  
        .'// <![CDATA['."\n"  
        .'function LONCAPAreg(){;} function LONCAPAstale(){}'."\n"  
        .'// ]]>'."\n"  
        .'</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,$bread_crumbs,$group) = @_;      my ($forcereg,$bread_crumbs) = @_;
     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 613  sub innerregister { Line 439  sub innerregister {
   
     $env{'request.registered'} = 1;      $env{'request.registered'} = 1;
   
     my $noremote = ($env{'environment.remote'} ne 'on');  
   
     undef(@inlineremote);      undef(@inlineremote);
   
     my $reopen=&Apache::lonmenu::reopenmenu();      my $resurl; 
       if ( $env{'request.symb'} && $env{'request.course.id'} ) {
     my $newmail='';  
   
     if (&Apache::lonmsg::newmail() && !$noremote) {  
         # We have new mail and remote is up  
         $newmail= 'swmenu.setstatus("you have","messages");';  
     }  
   
     my ($mapurl,$resurl);  
   
     if ($env{'request.course.id'}) {          (my $mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());
         if ($env{'request.symb'}) {          my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
             ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb(&Apache::lonnet::symbread());  
             my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};  
   
             my $maptitle = &Apache::lonnet::gettitle($mapurl);  
             my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());  
   
           my $maptitle = &Apache::lonnet::gettitle($mapurl);
           my $restitle = &Apache::lonnet::gettitle(&Apache::lonnet::symbread());
   
 #SD  #SD
 #course_type only Course and Community?  #course_type only Course and Community?
 #  #
             my @crumbs;          my @crumbs;
             unless (($forcereg) &&           unless (($forcereg) && ($env{'request.noversionuri'} eq '/adm/navmaps')
                     ($env{'request.noversionuri'} eq '/adm/navmaps') &&                  && ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {
                     ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'})) {              @crumbs = ({text  => Apache::loncommon::course_type() 
                 @crumbs = ({text  => Apache::loncommon::course_type()                                   . ' Contents', 
                                     . ' Contents',                           href  => "Javascript:gopost('/adm/navmaps','')"});
                             href  => "Javascript:gopost('/adm/navmaps','')"});          }
             }          if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { 
             if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) {               push(@crumbs, {text  => '...',
                 push(@crumbs, {text  => '...',                             no_mt => 1});
                                no_mt => 1});          }
             }  
           push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle 
             push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle                                                      && $maptitle ne 'default.sequence' 
                                                        && $maptitle ne 'default.sequence'                                                      && $maptitle ne $coursetitle);
                                                        && $maptitle ne $coursetitle);  
           push @crumbs, {text => $restitle, no_mt => 1} if $restitle; 
             push @crumbs, {text => $restitle, no_mt => 1} if $restitle;   
             &Apache::lonhtmlcommon::clear_breadcrumbs();          &Apache::lonhtmlcommon::clear_breadcrumbs();
             &Apache::lonhtmlcommon::add_breadcrumb(@crumbs);          &Apache::lonhtmlcommon::add_breadcrumb(@crumbs);
         } else {      }elsif (! $const_space){
             $resurl = $env{'request.noversionuri'};  
             my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'});  
             my $crstype = &Apache::loncommon::course_type();  
             my $title = &mt('View Resource');  
             if ($resurl =~ m{^\Q/uploaded$courseurl/supplemental/\E(default|\d+)/}) {  
                 &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['folderpath','title']);  
                 &Apache::lonhtmlcommon::clear_breadcrumbs();  
                 if ($env{'form.title'}) {  
                     $title = $env{'form.title'};  
                 }  
                 my $trail;  
                 if ($env{'form.folderpath'}) {  
                     &prepare_functions($resurl,$forcereg,$group,undef,undef,1);  
                     ($trail) =  
                         &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);  
                 } else {  
                     &Apache::lonhtmlcommon::add_breadcrumb(  
                     {text  => "Supplemental $crstype Content",  
                      href  => "javascript:gopost('/adm/supplemental','')"});  
                     $title = &mt('View Resource');  
                     ($trail) =  
                         &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);  
                 }  
                 return $trail;  
             } elsif ($resurl =~ m{^\Q/uploaded$courseurl/portfolio/syllabus/}) {  
                 &Apache::lonhtmlcommon::clear_breadcrumbs();  
                 &prepare_functions('/public'.$courseurl."/syllabus",  
                                    $forcereg,$group,undef,undef,1);  
                 $title = &mt('Syllabus File');  
                 my ($trail) =  
                     &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1);  
                 return $trail;  
             }  
             unless ($env{'request.state'} eq 'construct') {  
                 &Apache::lonhtmlcommon::clear_breadcrumbs();  
                 &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});  
             }  
         }  
     } elsif (! $const_space){  
         #a situation when we're looking at a resource outside of context of a           #a situation when we're looking at a resource outside of context of a 
         #course or construction space (e.g. with cumulative rights)          #course or construction space (e.g. with cumulative rights)
         &Apache::lonhtmlcommon::clear_breadcrumbs();          &Apache::lonhtmlcommon::clear_breadcrumbs();
         unless ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) {          &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
             &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});  
         }  
     }      }
     my $timesync   = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' );  
 # =============================================================================  # =============================================================================
 # ============================ 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/})      return '' unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/}) 
                        || ($forcereg)) {                         || $forcereg );
   
         my %swtext;  # -- This applies to homework problems for users with grading privileges
         if ($noremote) {   my $crs='/'.$env{'request.course.id'};
             %swtext = &get_inline_text();   if ($env{'request.course.sec'}) {
         } else {      $crs.='_'.$env{'request.course.sec'};
             %swtext = &get_rc_text();   }
         }   $crs=~s/\_/\//g;
         my $hwkadd='';  
   
         my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,          my $hwkadd='';
             $forceview,$editbutton);          if ($env{'request.symb'} ne '' &&
         if (($resurl =~ m{^/adm/($match_domain)/($match_username)/aboutme$}) ||      $env{'request.filename'}=~/$LONCAPA::assess_re/) {
             ($env{'request.role'} !~/^(aa|ca|au)/)) {      if (&Apache::lonnet::allowed('mgr',$crs)) {
             if (($env{'environment.remote'} eq 'on') && ($env{'request.symb'})) {   $hwkadd.=&switch('','',7,2,'pgrd.png','Content Grades','grades[_4]',
                 &Apache::lonhtmlcommon::clear_breadcrumbs();                         "gocmd('/adm/grades','gradingmenu')",
                          'Content Grades');
               } elsif (&Apache::lonnet::allowed('vgr',$crs)) {
    $hwkadd.=&switch('','',7,2,'subm.png','Content Submissions','missions[_1]',
                          "gocmd('/adm/grades','submission')",
          'Content Submissions');
             }              }
             $editbutton = &prepare_functions($resurl,$forcereg,$group);   }
         }   if ($env{'request.symb'} ne '' &&
         if ($editbutton eq '') {      &Apache::lonnet::allowed('opa',$crs)) {
             $editbutton = &clear(6,1);      $hwkadd.=&switch('','',7,3,'pparm.png','Content Settings','parms[_2]',
         }       "gocmd('/adm/parmset','set')",
        'Content Settings');
 #   }
 # This applies in course context          if ($env{'request.symb'}=~/^uploaded/ &&
 #              &Apache::lonnet::allowed('mdc',$crs)) {
               $hwkadd.=&switch('','',7,4,'docs.png','Folder/Page Content','parms[_2]',
                                "gocmd('/adm/coursedocs','direct')",
                                'Folder/Page Content');
           }
   # -- End Homework
           ###
           ### Determine whether or not to display the 'cstr' button for this
           ### resource
           ###
           my $editbutton = '';
           my $noeditbutton = 1;
           my ($cnum,$cdom);
         if ($env{'request.course.id'}) {          if ($env{'request.course.id'}) {
             $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};              $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
             $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};              $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
             $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});          }
             my @privs;          if ($env{'user.author'}) {
             if ($env{'request.symb'} ne '') {              if ($env{'request.role'}=~/^(aa|ca|au)/) {
                 if ($env{'request.filename'}=~/$LONCAPA::assess_re/) {  
                     push(@privs,('mgr','vgr'));  
                 }  
                 push(@privs,'opa');  
             }  
             foreach my $priv (@privs) {  
                 $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'});  
                 if (!$perms{$priv} && $env{'request.course.sec'} ne '') {  
                     $perms{$priv} =  
                         &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}");  
                 }  
             }  
 #  #
 # Determine whether or not to show Grades and Submissions buttons  # We have the role of an author
 #  #
             if ($env{'request.symb'} ne '' &&                  # Set defaults for authors
                 $env{'request.filename'}=~/$LONCAPA::assess_re/) {                  my ($top,$bottom) = ('con-','struct');
                 if ($perms{'mgr'}) {                  my $action = "go('/priv/".$env{'user.domain'}.'/'.$env{'user.name'}."');";
                     $hwkadd.= &switch('','',7,2,'pgrd.png','Content Grades',                  my $cadom  = $env{'request.role.domain'};
                                       'grades[_4]',                  my $caname = $env{'user.name'};
                                       "gocmd('/adm/grades','gradingmenu')",                  my $desc = "Enter my construction space";
                                       'Content Grades');                  # Set defaults for co-authors
                 } elsif ($perms{'vgr'}) {                  if ($env{'request.role'} =~ /^ca/) { 
                     $hwkadd .= &switch('','',7,2,'subm.png','Content Submissions',                      ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);
                                        'missions[_1]',                      ($top,$bottom) = ('co con-','struct');
                                        "gocmd('/adm/grades','submission')",                      $action = "go('/priv/".$cadom.'/'.$caname."');";
                                        'Content Submissions');                      $desc = "Enter construction space as co-author";
                 }                  } elsif ($env{'request.role'} =~ /^aa/) {
             }                      ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/);
             if (($env{'request.symb'} ne '') && ($perms{'opa'})) {                      ($top,$bottom) = ('co con-','struct');
                 $hwkadd .= &switch('','',7,3,'pparm.png','Content Settings',                      $action = "go('/priv/".$cadom.'/'.$caname."');";
                                    'parms[_2]',"gocmd('/adm/parmset','set')",                      $desc = "Enter construction space as assistant co-author";
                                    'Content Settings');                  }
                   # Check that we are on the correct machine
                   my $home = &Apache::lonnet::homeserver($caname,$cadom);
    my $allowed=0;
    my @ids=&Apache::lonnet::current_machine_ids();
    foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
    if (!$allowed) {
       $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc);
                       $noeditbutton = 0;
                   }
             }              }
 # End grades/submissions check  
   
 #  #
 # This applies to items inside a folder/page modifiable in the course.  # 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.
             if (($env{'request.symb'}=~/^uploaded/) && ($perms{'mdc'})) {  # This should maybe become a privilege check in lonnet
                 my $text = 'Edit Folder';  #
                 if (($mapurl =~ /\.page$/) ||              ##
                     ($env{'request.symb'}=~              ## Determine if user can edit url.
                          m{uploaded/$cdom/$cnum/default_\d+\.page$}))  {              ##
                     $text = 'Edit Page';              my $cfile='';
                 }              my $cfuname='';
                 $hwkadd .= &switch('','',7,4,'docs-22x22.png',$text,'parms[_2]',              my $cfudom='';
                                    "gocmd('/adm/coursedocs','direct')",              my $uploaded;
                                    'Folder/Page Content');              my $switchserver='';
               my $home;
               if ($env{'request.filename'}) {
                   my $file=&Apache::lonnet::declutter($env{'request.filename'});
                   if (defined($cnum) && defined($cdom)) {
                       $uploaded = &is_course_upload($file,$cnum,$cdom);
                   }
                   if (!$uploaded) {
   
                       $file=~s{^(priv/$match_domain/$match_username)}{/$1};
                       $file=~s{^($match_domain/$match_username)}{/priv/$1};
   
                       # Check that the user has permission to edit this resource
                       my $setpriv = 1;
                       ($cfuname,$cfudom)=&Apache::lonnet::constructaccess($file,$setpriv);
                       if (defined($cfudom)) {
           $home=&Apache::lonnet::homeserver($cfuname,$cfudom);
           my $allowed=0;
           my @ids=&Apache::lonnet::current_machine_ids();
           foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
           if ($allowed) {
                               $cfile=$file;
                           } else {
                               $switchserver=$file;
                           }
                       }
                   }
               }
               # Finally, turn the button on or off
               if (($cfile || $switchserver) && !$const_space) {
                   my $nocrsedit;
                   # Suppress display where CC has switched to student role.
                   if ($env{'request.course.id'}) {
                       unless(&Apache::lonnet::allowed('mdc',
                                                       $env{'request.course.id'})) {
                           $nocrsedit = 1;
                       }
                   }
                   if ($nocrsedit) {
                       $editbutton=&clear(6,1);
                   } else {
                       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','resource[_2]',
                           $bot,"Edit this resource");
                       $noeditbutton = 0;
                   }
               } elsif ($editbutton eq '') {
                   $editbutton=&clear(6,1);
             }              }
 # End modifiable folder/page container check  
         }          }
 # End course context          if (($noeditbutton) && ($env{'request.filename'})) { 
               if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                   my $file=&Apache::lonnet::declutter($env{'request.filename'});
                   if (defined($cnum) && defined($cdom)) {
                       if (&is_course_upload($file,$cnum,$cdom)) {
                           my $cfile = &edit_course_upload($file,$cnum,$cdom);
                           if ($cfile) {
                               $editbutton=&switch
                                           ('','',6,1,'pcstr.png','Edit',
                                            'resource[_2]',"go('".$cfile."');",
                                            'Edit this resource');
                           }
                       }
                   }
               }
           }
           if ($env{'request.course.id'}) {
               if ($resurl eq "public/$cdom/$cnum/syllabus") {
                   if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ /\w/) {
                       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {
                           $editbutton=&switch('','',6,1,'pcstr.png','Edit',
                                               'resource[_2]',
                                               "go('/adm/courseprefs?phase=display&actions=courseinfo')",
                                               'Edit this resource');
                       }
                   }
               }
           }
           ###
           ###
 # Prepare the rest of the buttons  # Prepare the rest of the buttons
         my ($menuitems,$got_prt,$got_wishlist,$cstritems);          my ($menuitems,$got_prt,$got_wishlist);
         if ($const_space) {          if ($const_space) {
 #  #
 # We are in construction space  # We are in construction space
Line 824  s&6&3&pub.png&Publish&resource[_3]&gocst Line 689  s&6&3&pub.png&Publish&resource[_3]&gocst
 s&7&1&del.png&Delete&resource[_2]&gocstr('/adm/cfile?action=delete','/priv/$udom/$uname/$cleandisfn')&Delete this resource  s&7&1&del.png&Delete&resource[_2]&gocstr('/adm/cfile?action=delete','/priv/$udom/$uname/$cleandisfn')&Delete this resource
 s&7&2&prt.png&Print&printout[_1]&gocstr('/adm/printout','/priv/$udom/$uname/$cleandisfn')&Prepare a printable document  s&7&2&prt.png&Print&printout[_1]&gocstr('/adm/printout','/priv/$udom/$uname/$cleandisfn')&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
                 unless ($noremote) {  
                     $cstritems = $menuitems;  
                     undef($menuitems);  
                 }  
             }              }
             if (ref($bread_crumbs) eq 'ARRAY') {                  if (ref($bread_crumbs) eq 'ARRAY') {
                 &Apache::lonhtmlcommon::clear_breadcrumbs();                      &Apache::lonhtmlcommon::clear_breadcrumbs();
                 foreach my $crumb (@{$bread_crumbs}){                      foreach my $crumb (@{$bread_crumbs}){
                      &Apache::lonhtmlcommon::add_breadcrumb($crumb);                          &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 registered URL  # We are in a course and looking at a registered URL
 # Should probably be in mydesk.tab  # Should probably be in mydesk.tab
 #  #
   
     $menuitems=(<<ENDMENUITEMS);      $menuitems=(<<ENDMENUITEMS);
 c&3&1  c&3&1
 s&2&1&back.png&$swtext{'back'}&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1  s&2&1&back.png&&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1
 s&2&3&forw.png&$swtext{'forw'}&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3  s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3
 c&6&3  c&6&3
 c&8&1  c&8&1
 c&8&2  c&8&2
 s&8&3&prt.png&$swtext{'prt'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document  s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
             $got_prt = 1;              $got_prt = 1;
             if (($env{'user.adv'}) && ($env{'request.uri'} =~ /^\/res/)              if (($env{'user.adv'}) && ($env{'request.uri'} =~ /^\/res/)
Line 857  ENDMENUITEMS Line 717  ENDMENUITEMS
                 # wishlist is only available for users with access to resource-pool                  # wishlist is only available for users with access to resource-pool
                 # and links can only be set for resources within the resource-pool                  # and links can only be set for resources within the resource-pool
                 $menuitems .= (<<ENDMENUITEMS);                  $menuitems .= (<<ENDMENUITEMS);
 s&9&1&alnk.png&$swtext{'alnk'}&linkstor[_1]&set_wishlistlink()&Save a link for this resource in my personal Stored Links repository&&1  s&9&1&wishlist-link.png&Stored Links&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
 ENDMENUITEMS  ENDMENUITEMS
                 $got_wishlist = 1;                  $got_wishlist = 1;
             }              }
Line 871  if(length($annotation) > 0){ Line 731  if(length($annotation) > 0){
 }else{  }else{
  $menuitems.="anot.png";   $menuitems.="anot.png";
 }  }
 $menuitems.="&$swtext{'anot'}&tations[_1]&annotate()&";  $menuitems.="&Notes&&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|viewclasslist|portfolio)(\?|$)/) {              unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme|viewclasslist|portfolio)(\?|$)/) {
  if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/}) && ($env{'request.noversionuri'} !~ m{^/uploaded/$match_domain/$match_courseid/docs/})) {   if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/}) && ($env{'request.noversionuri'} !~ m{^/uploaded/$match_domain/$match_courseid/docs/})) {
     $menuitems.=(<<ENDREALRES);      $menuitems.=(<<ENDREALRES);
 s&6&3&catalog.png&$swtext{'catalog'}&info[_1]&catalog_info()&Show Metadata  s&6&3&catalog.png&Info&info[_1]&catalog_info()&Show Metadata
 ENDREALRES  
                 }  
                 unless (($env{'request.noversionuri'} =~ m{^/uploaded/$match_domain/$match_courseid/docs/}) ||  
                         ($env{'request.noversionuri'} =~ m{^\Q/adm/wrapper/\E(ext|uploaded)/})) {   
             $menuitems.=(<<ENDREALRES);  
 s&8&1&eval.png&$swtext{'eval'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource  
 ENDREALRES  ENDREALRES
                 }                  }
                 unless ($env{'request.noversionuri'} =~ m{^\Q/adm/wrapper/\E(ext|uploaded)/}) {                  unless ($env{'request.noversionuri'} =~ m{^/uploaded/$match_domain/$match_courseid/docs/}) {
                     $menuitems.=(<<ENDREALRES);                      $menuitems.=(<<ENDREALRES);
 s&8&2&fdbk.png&$swtext{'fdbk'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource  s&8&1&eval.png&Evaluate&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource
 ENDREALRES  ENDREALRES
                 }                  }
                   $menuitems.=(<<ENDREALRES);
   s&8&2&fdbk.png&Communicate&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource
   ENDREALRES
     }      }
         }          }
  if ($env{'request.uri'} =~ /^\/res/) {   if ($env{'request.uri'} =~ /^\/res/) {
             unless ($got_prt) {              unless ($got_prt) {
         $menuitems .= (<<ENDMENUITEMS);          $menuitems .= (<<ENDMENUITEMS);
 s&8&3&prt.png&$swtext{'prt'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document  s&8&3&prt.png&Print&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document
 ENDMENUITEMS  ENDMENUITEMS
                 $got_prt = 1;                  $got_prt = 1;
             }              }
Line 904  ENDMENUITEMS Line 761  ENDMENUITEMS
                 if (($env{'user.adv'}) && (!$env{'request.enc'})) {                  if (($env{'user.adv'}) && (!$env{'request.enc'})) {
                     # wishlist is only available for users with access to resource-pool                      # wishlist is only available for users with access to resource-pool
                     $menuitems .= (<<ENDMENUITEMS);                      $menuitems .= (<<ENDMENUITEMS);
 s&9&1&alnk.png&$swtext{'alnk'}&linkstor[_1]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1  s&9&1&wishlist-link.png&Stored Links&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository&&1
 ENDMENUITEMS  ENDMENUITEMS
                     $got_wishlist = 1;                      $got_wishlist = 1;
                 }                  }
             }      }
  }  
         unless ($got_prt) {  
             $menuitems .= (<<ENDMENUITEMS);  
 c&8&3  
 ENDMENUITEMS  
         }  
         unless ($got_wishlist) {  
             $menuitems .= (<<ENDMENUITEMS);  
 c&9&1  
 ENDMENUITEMS  
         }          }
         my $buttons='';          my $buttons='';
         foreach (split(/\n/,$menuitems)) {          foreach (split(/\n/,$menuitems)) {
Line 938  ENDMENUITEMS Line 785  ENDMENUITEMS
                 }                  }
             }              }
         }          }
         if ($noremote) {  
     my $addremote=0;      my $addremote=0;
     foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }      foreach (@inlineremote) { if ($_ ne '') { $addremote=1; last;} }
             if ($addremote) {      if ($addremote) {
   
                 &Apache::lonhtmlcommon::clear_breadcrumb_tools();  
   
                 &Apache::lonhtmlcommon::add_breadcrumb_tool(          &Apache::lonhtmlcommon::clear_breadcrumb_tools();
                     'navigation', @inlineremote[21,23]);  
   
                 my $countdown = &countdown_timer();              &Apache::lonhtmlcommon::add_breadcrumb_tool(
                 if (&hidden_button_check() eq 'yes') {                  'navigation', @inlineremote[21,23]);
                     if ($countdown) {  
                         &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown);  
                     }  
                 } else {  
                     my @tools = @inlineremote[93,91,81,82,83];  
                     if ($countdown) {  
                         unshift(@tools,$countdown);  
                     }  
                     &Apache::lonhtmlcommon::add_breadcrumb_tool(  
                         'tools',@tools);  
   
                     #publish button in construction space          my $countdown = &countdown_timer();
                     if ($env{'request.state'} eq 'construct'){          if (&hidden_button_check() eq 'yes') {
                         &Apache::lonhtmlcommon::add_breadcrumb_tool(              if ($countdown) {
                             'advtools', $inlineremote[63]);                  &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown);
                     } else {  
                         &Apache::lonhtmlcommon::add_breadcrumb_tool(  
                             'tools', $inlineremote[63]);  
                     }  
                     &advtools_crumbs(@inlineremote);  
                 }  
             }              }
             return   &Apache::lonhtmlcommon::scripttag('', 'start')  
                    . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)  
                    . &Apache::lonhtmlcommon::scripttag('', 'end');  
   
         } else {          } else {
             my $cstrcrumbs;              my @tools = @inlineremote[93,91,81,82,83];
             if ($const_space) {              if ($countdown) {
                 foreach (split(/\n/,$cstritems)) {                  unshift(@tools,$countdown);
                     my ($command,@rest)=split(/\&/,$_);              }
                     my $idx=10*$rest[0]+$rest[1];              &Apache::lonhtmlcommon::add_breadcrumb_tool(
                     &switch('','',@rest);                  'tools',@tools);
                 }  
                 &Apache::lonhtmlcommon::add_breadcrumb_tool('advtools',  
                                                             @inlineremote[63,61,71,72]);  
   
                 $cstrcrumbs = &Apache::lonhtmlcommon::scripttag('', 'start')  
                              .&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)  
                              .&Apache::lonhtmlcommon::scripttag('', 'end');  
             }  
             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)'; }  
             return <<ENDREGTHIS;  
   
 <script type="text/javascript">  
 // <![CDATA[  
 // 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>  
   
 $cstrcrumbs  
 ENDREGTHIS  
         }  
     } else {  
        unless ($noremote) {  
 # Not registered, graphical  
            return (<<ENDDONOTREGTHIS);  
   
 <script type="text/javascript">  
 // <![CDATA[  
 // BEGIN LON-CAPA Internal  
 var swmenu=null;  
   
     function LONCAPAreg() {  
           swmenu=$reopen  
           $timesync  
           swmenu.currentStale=1;  
           swmenu.clearbut(2,1);  
           swmenu.clearbut(2,3);  
           swmenu.clearbut(8,1);  
           swmenu.clearbut(8,2);  
           swmenu.clearbut(8,3);  
           swmenu.clearbut(9,1);  
           if (swmenu.currentURL) {  
              swmenu.switchbutton  
               (3,1,'reload.gif','return','location','go(currentURL)');  
           } else {  
               swmenu.clearbut(3,1);  
           }  
     }  
   
     function LONCAPAstale() {  
     }  
   
 // END LON-CAPA Internal  
 // ]]>  
 </script>  
 ENDDONOTREGTHIS  
   
               #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,74,92]);
               }
         }          }
         return '';  
     }      }
 }  
   
 sub get_inline_text {      return   &Apache::lonhtmlcommon::scripttag('', 'start')
     my %text = (             . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
                  pgrd     => 'Content Grades',             . &Apache::lonhtmlcommon::scripttag('', 'end');
                  subm     => 'Content Submissions',  
                  pparm    => 'Content Settings',  
                  docs     => 'Folder/Page Content',  
                  pcstr    => 'Edit',  
                  prt      => 'Print',  
                  alnk     => 'Stored Links',  
                  anot     => 'Notes',  
                  catalog  => 'Info',  
                  eval     => 'Evaluate',  
                  fdbk     => 'Feedback',  
     );  
     return %text;  
 }  }
   
 sub get_rc_text {  sub is_course_upload {
     my %text = (      my ($file,$cnum,$cdom) = @_;
                    pgrd    => 'problem[_1]',      my $uploadpath = &LONCAPA::propath($cdom,$cnum);
                    subm    => 'view sub-[_1]',      $uploadpath =~ s{^\/}{};
                    pparm   => 'problem[_2]',      if (($file =~ m{^\Q$uploadpath\E/userfiles/docs/}) ||
                    pcstr   => 'edit[_1]',          ($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/docs/})) {
                    prt     => 'prepare[_1]',          return 1;
                    back    => 'backward[_1]',  
                    forw    => 'forward[_1]',  
                    alnk    => 'add to[_1]',  
                    anot    => 'anno-[_1]',  
                    catalog => 'catalog[_2]',  
                    eval    => 'evaluate[_1]',  
                    fdbk    => 'feedback[_1]',  
     );  
     return %text;  
 }  
   
 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)=@_;  
     unless ($env{'environment.remote'} eq 'on') {  
         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">  
 // <![CDATA[  
 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">  
 // <![CDATA[  
     menuloaded=0;  
     tim=0;  
 // ]]>  
 </script>  
 ENDSETFLAGS  
 }  
   
 sub maincall() {  
     unless ($env{'environment.remote'} eq 'on') { return ''; }  
     return(<<ENDMAINCALL);  
 <script type="text/javascript">  
 // <![CDATA[  
     main();  
 // ]]>  
 </script>  
 ENDMAINCALL  
 }  
   
 sub load_remote_msg {  
     my ($lowerurl)=@_;  
   
     unless ($env{'environment.remote'} eq 'on') { 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 {  
    unless ($env{'environment.remote'} eq 'on') { return ''; }  
    my $menuname = &get_menu_name();  
    my $nothing = &Apache::lonhtmlcommon::javascript_nothing();  
    return('window.open('.$nothing.',"'.$menuname.'","",false);');  
 }  
   
   
 sub open {  
     my $returnval='';  
     unless ($env{'environment.remote'} eq 'on') {  
         return  
         '<script type="text/javascript">'."\n"  
        .'// <![CDATA['."\n"  
        .'self.name="loncapaclient";'."\n"  
        .'// ]]>'."\n"  
        .'</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);  
 // <![CDATA[  
 window.status='Opening LON-CAPA Remote Control';  
 var menu=window.open("/res/adm/pages/menu.html?inhibitmenu=yes","$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>';  
 }  
   
 sub get_editbutton {  
     my ($cfile,$home,$switchserver,$forceedit,$forceview,$forcereg) = @_;  
     my $jscall;  
     if (($forceview) && ($env{'form.todocs'})) {  
         my ($folderpath,$command);  
         if ($env{'request.symb'}) {  
             $folderpath = &Apache::loncommon::symb_to_docspath($env{'request.symb'});  
         } elsif ($env{'form.folderpath'} =~ /^supplemental/) {  
             $folderpath = $env{'form.folderpath'};  
             $command = '&forcesupplement=1';  
         }  
         $folderpath = &escape(&HTML::Entities::encode(&escape($folderpath),'<>&"'));  
         $jscall = "go('/adm/coursedocs?folderpath=$folderpath$command')";  
     } else {  
         $jscall = &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,$switchserver,  
                                                 $forceedit,$forcereg,$env{'request.symb'},  
                                                 &escape($env{'form.folderpath'}),  
                                                 &escape($env{'form.title'}),$env{'form.idx'},  
                                                 &escape($env{'form.suppurl'},$env{'form.todocs'}));  
     }  
     if ($jscall) {  
         my $icon = 'pcstr.png';  
         my $label = 'Edit';  
         if ($forceview) {  
             $icon = 'tolastloc.png';  
             $label = 'Exit Editing';  
         }  
         my $infunc = 1;  
         my $clearbutton;  
         if ($env{'environment.remote'} eq 'on') {  
             if ($cfile =~ m{^/priv/}) {  
                 undef($infunc);  
                 $label = 'edit';  
             } else {  
                 $clearbutton = 1;  
             }  
         }  
         my $editor = &switch('','',6,1,$icon,$label,'resource[_2]',  
                              $jscall,"Edit this resource",'','',$infunc);  
         if ($infunc) {  
             return 1;  
         } elsif ($clearbutton) {  
             return &clear(6,1);  
         } else {  
             return $editor;  
         }  
     }      }
     return;      return;
 }  }
   
 sub prepare_functions {  sub edit_course_upload {
     my ($resurl,$forcereg,$group,$bread_crumbs,$advtools,$docscrumbs,$forbodytag) = @_;      my ($file,$cnum,$cdom) = @_;
     unless ($env{'request.registered'}) {      my $cfile;
         undef(@inlineremote);      if ($file =~/\.(htm|html|css|js|txt)$/) {
     }          my $ext = $1;
     my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,          my $url = &Apache::lonnet::hreflocation('',$file);
         $forceview);          my $home = &Apache::lonnet::homeserver($cnum,$cdom);
           my @ids=&Apache::lonnet::current_machine_ids();
     if ($env{'request.course.id'}) {          my $dest;
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          if ($home && grep(/^\Q$home\E$/,@ids)) {
         $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};              $dest = $url.'?forceedit=1';
         $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});          } else {
     }              unless (&Apache::lonnet::get_locks()) {
                   $dest = '/adm/switchserver?otherserver='.
     my $editbutton = '';                          $home.'&role='.$env{'request.role'}.
 #                          '&url='.$url.'&forceedit=1';
 # Determine whether or not to display 'Edit' icon/button  
 #  
     if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) {  
         my $file=&Apache::lonnet::declutter($env{'request.filename'});  
         ($cfile,$home,$switchserver,$forceedit,$forceview) =  
             &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,  
                 &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group);  
         if (($cfile) && ($home ne '') && ($home ne 'no_host')) {  
             $editbutton = &get_editbutton($cfile,$home,$switchserver,  
                                           $forceedit,$forceview,$forcereg);  
         }  
     } elsif ((!$env{'request.course.id'}) &&  
              ($env{'user.author'}) && ($env{'request.filename'}) &&  
              ($env{'request.role'} !~/^(aa|ca|au)/)) {  
 #  
 # Currently do not have the role of author or co-author.  
 # Do we have authoring privileges for the resource?  
 #  
         my $file=&Apache::lonnet::declutter($env{'request.filename'});  
         ($cfile,$home,$switchserver,$forceedit,$forceview) =  
             &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,  
                 &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group);  
         if (($cfile) && ($home ne '') && ($home ne 'no_host')) {  
             $editbutton = &get_editbutton($cfile,$home,$switchserver,  
                                           $forceedit,$forceview,$forcereg);  
         }  
     } elsif ($env{'request.course.id'}) {  
 #  
 # This applies in course context  
 #  
         if (($perms{'mdc'}) &&  
             (($resurl eq "/public/$cdom/$cnum/syllabus") ||  
             ($resurl =~ m{^/uploaded/$cdom/$cnum/portfolio/syllabus/}))) {  
             $cfile = $resurl;  
             $home = &Apache::lonnet::homeserver($cnum,$cdom);  
             if ($env{'form.forceedit'}) {  
                 $forceview = 1;  
             } else {  
                 $forceedit = 1;  
             }  
             $editbutton = &get_editbutton($cfile,$home,$switchserver,  
                                           $forceedit,$forceview,$forcereg);  
         } elsif (($resurl eq '/adm/extresedit') &&  
                  (($env{'form.symb'}) || ($env{'form.folderpath'}))) {  
             ($cfile,$home,$switchserver,$forceedit,$forceview) =  
             &Apache::lonnet::can_edit_resource($resurl,$cnum,$cdom,$resurl,  
                                                $env{'form.symb'});  
             if ($cfile ne '') {  
                 $editbutton = &get_editbutton($cfile,$home,$switchserver,  
                                               $forceedit,$forceview,$forcereg,  
                                               $env{'form.title'},$env{'form.suppurl'});  
             }  
         } elsif (($resurl =~ m{^/?adm/viewclasslist$}) &&  
                  (&Apache::lonnet::allowed('opa',$env{'request.course.id'}))) {  
             ($cfile,$home,$switchserver,$forceedit,$forceview) =  
             &Apache::lonnet::can_edit_resource($resurl,$cnum,$cdom,$resurl,  
                                                $env{'form.symb'});  
             $editbutton = &get_editbutton($cfile,$home,$switchserver,  
                                           $forceedit,$forceview,$forcereg);  
         } elsif (($resurl !~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) &&  
                  ($resurl ne '/cgi-bin/printout.pl')) {  
             if ($env{'request.filename'}) {  
                 my $file=&Apache::lonnet::declutter($env{'request.filename'});  
                 ($cfile,$home,$switchserver,$forceedit,$forceview) =  
                     &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,  
                         &Apache::lonnet::clutter($resurl),$env{'request.symb'},$group);  
                 if ($cfile ne '') {  
                     $editbutton = &get_editbutton($cfile,$home,$switchserver,  
                                                   $forceedit,$forceview,$forcereg);  
                 }  
             }  
         }  
     }  
 # End determination of 'Edit' icon/button display  
   
     if ($env{'request.course.id'}) {  
 # This applies to about me page for users in a course  
         if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) {  
             my ($sdom,$sname) = ($1,$2);  
             unless (&Apache::lonnet::is_course($sdom,$sname)) {  
                 &switch('','',6,4,'mail-message-new-22x22.png','Message to user',  
                         '',  
                         "go('/adm/email?compose=individual&amp;recname=$sname&amp;recdom=$sdom')",  
                             'Send message to specific user','','',1);  
             }  
             my $hideprivileged = 1;  
             if (&Apache::lonnet::in_course($sdom,$sname,$cdom,$cnum,undef,  
                                            $hideprivileged)) {  
                 foreach my $priv ('vsa','vgr','srm') {  
                     $perms{$priv} = &Apache::lonnet::allowed($priv,$env{'request.course.id'});  
                     if (!$perms{$priv} && $env{'request.course.sec'} ne '') {  
                         $perms{$priv} =  
                             &Apache::lonnet::allowed($priv,"$env{'request.course.id'}/$env{'request.course.sec'}");  
                     }  
                 }  
                 if ($perms{'vsa'}) {  
                     &switch('','',6,5,'trck-22x22.png','Activity',  
                             '',  
                             "go('/adm/trackstudent?selected_student=$sname:$sdom')",  
                             'View recent activity by this person','','',1);  
                 }  
                 if ($perms{'vgr'}) {  
                     &switch('','',6,6,'rsrv-22x22.png','Reservations',  
                             '',  
                             "go('/adm/slotrequest?command=showresv&amp;origin=aboutme&amp;uname=$sname&amp;udom=$sdom')",  
                             'Slot reservation history','','',1);  
                 }  
                 if ($perms{'srm'}) {  
                     &switch('','',6,7,'contact-new-22x22.png','Records',  
                             '',  
                             "go('/adm/email?recordftf=retrieve&amp;recname=$sname&amp;recdom=$sdom')",  
                             'Add records','','',1);  
                 }  
             }              }
         }          }
         if (($env{'form.folderpath'} =~ /^supplemental/) &&          if ($dest) {
             (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&              $cfile = &HTML::Entities::encode($dest,'"<>&');
             (($resurl =~ m{^/adm/wrapper/ext/}) ||  
              ($resurl =~ m{^/uploaded/$cdom/$cnum/supplemental/}) ||  
              ($resurl eq '/adm/supplemental') ||  
              ($resurl =~ m{^/public/$cdom/$cnum/syllabus$}) ||  
              ($resurl =~ m{^/adm/$match_domain/$match_username/aboutme$}))) {  
             my @folders=split('&',$env{'form.folderpath'});  
             if ((@folders > 2) || ($resurl ne '/adm/supplemental')) {  
                 my $esc_path=&escape(&HTML::Entities::encode(&escape($env{'form.folderpath'}),'<>&"'));  
                 &switch('','',7,4,'docs-22x22.png','Edit Folder','parms[_2]',  
                         "location.href='/adm/coursedocs?command=direct&amp;forcesupplement=1&amp;supppath=$esc_path'",  
                         'Folder/Page Content','','',1);  
             }  
         }          }
     }      }
       return $cfile;
 # End checking for items for about me page for users in a course  
     if ($docscrumbs) {  
         &Apache::lonhtmlcommon::clear_breadcrumb_tools();  
         &advtools_crumbs(@inlineremote);  
         return $editbutton;  
     } elsif (($env{'request.registered'}) && (!ref($forbodytag))) {  
         return $editbutton;  
     } else {  
         if (ref($bread_crumbs) eq 'ARRAY') {  
             if (@inlineremote > 0) {  
                 if (ref($advtools) eq 'ARRAY') {  
                     @{$advtools} = @inlineremote;  
                 }  
             }  
             return;  
         } elsif (@inlineremote > 0) {  
             &Apache::lonhtmlcommon::clear_breadcrumb_tools();  
             &advtools_crumbs(@inlineremote);  
             if (ref($forbodytag)) {  
                 $$forbodytag =  
                     &Apache::lonhtmlcommon::scripttag('', 'start')  
                    .&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)  
                    .&Apache::lonhtmlcommon::scripttag('', 'end');  
             }  
             return;  
         }  
     }  
 }  
   
 sub advtools_crumbs {  
     my @funcs = @_;  
     if ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) {  
         &Apache::lonhtmlcommon::add_breadcrumb_tool(  
             'advtools', @funcs[61,64,65,66,67,74]);  
     } elsif ($env{'request.noversionuri'} !~ m{^/adm/(navmaps|viewclasslist)(\?|$)}) {  
         &Apache::lonhtmlcommon::add_breadcrumb_tool(  
             'advtools', @funcs[61,71,72,73,74,92]);  
     } elsif ($env{'request.noversionuri'} eq '/adm/viewclasslist') {  
         &Apache::lonhtmlcommon::add_breadcrumb_tool(  
             'advtools', $funcs[61]);  
     }  
 }  }
   
 # ================================================================== Raw Config  # ================================================================== Raw Config
   
 sub clear {  sub clear {
     my ($row,$col)=@_;      my ($row,$col)=@_;
     if ($env{'environment.remote'} eq 'on') {      $inlineremote[10*$row+$col]='';
        if (($row<1) || ($row>13)) { return ''; }      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 1547  sub clear { Line 878  sub clear {
 # The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".  # The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".
   
 sub switch {  sub switch {
     my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak,$infunc)=@_;      my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak)=@_;
     $act=~s/\$uname/$uname/g;      $act=~s/\$uname/$uname/g;
     $act=~s/\$udom/$udom/g;      $act=~s/\$udom/$udom/g;
     $top=&mt($top);      $top=&mt($top);
Line 1556  sub switch { Line 887  sub switch {
     my $idx=10*$row+$col;      my $idx=10*$row+$col;
     $category_members{$cat}.=':'.$idx;      $category_members{$cat}.=':'.$idx;
   
     if (($env{'environment.remote'} eq 'on') && (!$infunc)) {  
         if (($row<1) || ($row>13)) { return ''; }  
         if ($env{'request.state'} eq 'construct') {  
             my $text = $top.' '.$bot;  
             $text=~s/\s*\-\s*//gs;  
             my $pic = '<img alt="'.$text.'" src="'.  
                       &Apache::loncommon::lonhttpdurl('/res/adm/pages/'.$img).  
                       '" align="'.($nobreak==3?'right':'left').'" class="LC_icon" />';  
            $inlineremote[$idx] =  
                '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.  
                $pic.'<span class="LC_menubuttons_inline_text">'.$top.'&nbsp;</span></a>';  
         }  
 # Remote  
         $img=~s/\.png$/\.gif/;  
         return "\n".  
  qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););  
     }  
   
 # Inline Menu  # Inline Menu
     if ($nobreak==2) { return ''; }      if ($nobreak==2) { return ''; }
     my $text=$top.' '.$bot;      my $text=$top.' '.$bot;
Line 1608  sub switch { Line 921  sub switch {
         unless ($env{'request.state'} eq 'construct') {          unless ($env{'request.state'} eq 'construct') {
             push(@tools,63);              push(@tools,63);
         }          }
         if (($env{'environment.icons'} eq 'iconsonly') &&          if (($env{'environment.icons'} eq 'iconsonly') && 
             (grep(/^$idx$/,@tools))) {              (grep(/^$idx$/,@tools))) {
             $inlineremote[$idx] =              $inlineremote[$idx] =
         '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.'</a>';          '<a title="'.$desc.'" class="LC_menubuttons_link" href="javascript:'.$act.';">'.$pic.'</a>';
Line 1635  sub secondlevel { Line 948  sub secondlevel {
     return $output;      return $output;
 }  }
   
 sub openmenu {  
     my $menuname = &get_menu_name();  
     unless ($env{'environment.remote'} eq 'on') { 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);
Line 1684  sub rawconfig { Line 990  sub rawconfig {
 #  #
     my $textualoverride=shift;      my $textualoverride=shift;
     my $output='';      my $output='';
     if ($env{'environment.remote'} eq 'on') {      return '' unless $textualoverride;
        $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'};
Line 1865  sub rawconfig { Line 1165  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);
         }          }
     }      }
     if ($env{'environment.remote'} eq 'on') {  
         $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;
 }  }
   
Line 1896  sub check_for_rcrs { Line 1190  sub check_for_rcrs {
     return $showreqcrs;      return $showreqcrs;
 }  }
   
 # ======================================================================= Close  
   
 sub close {  
     unless ($env{'environment.remote'} eq 'on') { return ''; }  
     my $menuname = &get_menu_name();  
     return(<<ENDCLOSE);  
 <script type="text/javascript">  
 // <![CDATA[  
 window.status='Accessing Remote Control';  
 menu=window.open("/adm/rat/empty.html","$menuname",  
                  "height=350,width=150,scrollbars=no,menubar=no");  
 window.status='Disabling Remote Control';  
 menu.active=0;  
 menu.autologout=0;  
 window.status='Closing Remote Control';  
 menu.close();  
 window.status='Done.';  
 // ]]>  
 </script>  
 ENDCLOSE  
 }  
   
 sub dc_popup_js {  sub dc_popup_js {
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                           more => '(More ...)',                                            more => '(More ...)',
Line 1965  END Line 1237  END
 }  }
   
 sub utilityfunctions {  sub utilityfunctions {
     my ($httphost) = @_;  
     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/}      if ($currenturl =~ m{^/adm/wrapper/ext/}
         && $env{'request.external.querystring'} ) {          && $env{'request.external.querystring'} ) {
Line 1993  sub utilityfunctions { Line 1264  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 $jumptores = &Apache::lonhtmlcommon::javascript_jumpto_resource();      my $confirm_switch = &mt("Editing requires switching to the resource's home server.").'\n'.
                            &mt('Switch server?');
   
     my $esc_url=&escape($currenturl);      my $esc_url=&escape($currenturl);
     my $esc_symb=&escape($currentsymb);      my $esc_symb=&escape($currentsymb);
Line 2001  sub utilityfunctions { Line 1273  sub utilityfunctions {
     my $countdown = &countdown_toggle_js();      my $countdown = &countdown_toggle_js();
   
 return (<<ENDUTILITY)  return (<<ENDUTILITY)
     var host="$httphost";  
     var currentURL=unescape("$esc_url");      var currentURL=unescape("$esc_url");
     var reloadURL=unescape("$esc_url");      var reloadURL=unescape("$esc_url");
     var currentSymb=unescape("$esc_symb");      var currentSymb=unescape("$esc_symb");
Line 2012  function go(url) { Line 1284  function go(url) {
    if (url!='' && url!= null) {     if (url!='' && url!= null) {
        currentURL = null;         currentURL = null;
        currentSymb= null;         currentSymb= null;
        window.location.href=host+url;         window.location.href=url;
    }     }
 }  }
   
 $jumptores  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=host+url;        this.document.server.action=url;
       this.document.server.postdata.value=postdata;        this.document.server.postdata.value=postdata;
       this.document.server.command.value='';        this.document.server.command.value='';
       this.document.server.url.value='';        this.document.server.url.value='';
Line 2031  function gopost(url,postdata) { Line 1310  function gopost(url,postdata) {
   
 function gocmd(url,cmd) {  function gocmd(url,cmd) {
    if (url!='') {     if (url!='') {
       this.document.server.action=host+url;        this.document.server.action=url;
       this.document.server.postdata.value='';        this.document.server.postdata.value='';
       this.document.server.command.value=cmd;        this.document.server.command.value=cmd;
       this.document.server.url.value=currentURL;        this.document.server.url.value=currentURL;
Line 2083  function golist(url) { Line 1362  function golist(url) {
    if (url!='' && url!= null) {     if (url!='' && url!= null) {
        currentURL = null;         currentURL = null;
        currentSymb= null;         currentSymb= null;
        top.location.href=host+url;         top.location.href=url;
    }     }
 }  }
   
Line 2094  function catalog_info() { Line 1373  function catalog_info() {
 }  }
   
 function chat_win() {  function chat_win() {
    lonchat=window.open(host+'/res/adm/pages/chatroom.html',"LONchat",'height=320,width=480,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) {
    var url = host+'/adm/groupchat?group='+group;     var url = '/adm/groupchat?group='+group;
    var winName = 'LONchat_'+group;     var winName = 'LONchat_'+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');
 }  }
Line 2119  function annotate() { Line 1398  function annotate() {
 function open_StoredLinks_Import(rat) {  function open_StoredLinks_Import(rat) {
    var newWin;     var newWin;
    if (rat) {     if (rat) {
        newWin = window.open(host+'/adm/wishlist?inhibitmenu=yes&mode=import&rat='+rat,         newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import&rat='+rat,
                             'wishlistImport','scrollbars=1,resizable=1,menubar=0');                              'wishlistImport','scrollbars=1,resizable=1,menubar=0');
    }     }
    else {     else {
        newWin = window.open(host+'/adm/wishlist?inhibitmenu=yes&mode=import',         newWin = window.open('/adm/wishlist?inhibitmenu=yes&mode=import',
                             'wishlistImport','scrollbars=1,resizable=1,menubar=0');                              'wishlistImport','scrollbars=1,resizable=1,menubar=0');
    }     }
    newWin.focus();     newWin.focus();
Line 2177  sub constspaceform { Line 1456  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;  
 }  
   
 sub hidden_button_check {  sub hidden_button_check {
     if ( $env{'request.course.id'} eq ''      if ( $env{'request.course.id'} eq ''
          || $env{'request.role.adv'} ) {           || $env{'request.role.adv'} ) {
Line 2198  sub hidden_button_check { Line 1467  sub hidden_button_check {
 }  }
   
 sub roles_selector {  sub roles_selector {
     my ($cdom,$cnum,$httphost) = @_;      my ($cdom,$cnum) = @_;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $now = time;      my $now = time;
     my (%courseroles,%seccount,%courseprivs);      my (%courseroles,%seccount,%courseprivs);
     my $is_cc;      my $is_cc;
     my ($js,$form,$switcher,$switchtext);      my $role_selector;
     my $ccrole;      my $ccrole;
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $ccrole = 'co';          $ccrole = 'co';
Line 2291  sub roles_selector { Line 1560  sub roles_selector {
             }              }
         }          }
     }      }
     $switchtext = 'Switch role'; # do not translate here      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');      my @roles_order = ($ccrole,'in','ta','ep','ad','st');
     my $numdiffsec;      if (keys(%courseroles) > 1) {
     if (keys(%seccount) == 1) {          $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$priv);
         foreach my $key (keys(%seccount)) {          $role_selector .= '<form name="rolechooser" method="post" action="/adm/roles">
             $numdiffsec = $seccount{$key};                            <select name="switchrole" onchange="javascript:adhocRole('."'switchrole'".')">';
         }          $role_selector .= '<option value="">'.$switchtext.'</option>';
     }  
     if ((keys(%seccount) > 1) || ($numdiffsec > 1)) {  
         my @submenu;  
         $js = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles,\%courseprivs,$priv);  
         $form =   
             '<form name="rolechooser" method="post" action="'.$httphost.'/adm/roles">'."\n".  
             '  <input type="hidden" name="destinationurl" value="'.  
             &HTML::Entities::encode($destinationurl).'" />'."\n".  
             '  <input type="hidden" name="gotorole" value="1" />'."\n".  
             '  <input type="hidden" name="selectrole" value="" />'."\n".  
             '  <input type="hidden" name="switchrole" value="" />'."\n";  
         if ($destsymb ne '') {  
             $form .= '   <input type="hidden" name="destsymb" value="'.  
                          &HTML::Entities::encode($destsymb).'" />'."\n";  
         }  
         $form .= '</form>'."\n";  
         foreach my $role (@roles_order) {          foreach my $role (@roles_order) {
             my $include;  
             if (defined($courseroles{$role})) {              if (defined($courseroles{$role})) {
                 if ($env{'request.role'} =~ m{^\Q$role\E}) {                  $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role,$crstype).'</option>'; 
                     if ($seccount{$role} > 1) {  
                         $include = 1;  
                     }  
                 } else {  
                     $include = 1;  
                 }  
             }  
             if ($include) {  
                 push(@submenu,['javascript:adhocRole('."'$role'".')',  
                                &Apache::lonnet::plaintext($role,$crstype)]);  
             }              }
         }          }
         foreach my $role (sort(keys(%courseroles))) {          foreach my $role (sort(keys(%courseroles))) {
             if ($role =~ /^cr/) {              if ($role =~ /^cr/) {
                 my $include;                  $role_selector .= "\n".'<option value="'.$role.'">'.&Apache::lonnet::plaintext($role).'</option>'; 
                 if ($env{'request.role'} =~ m{^\Q$role\E}) {  
                     if ($seccount{$role} > 1) {  
                         $include = 1;  
                     }  
                 } else {  
                     $include = 1;  
                 }  
                 if ($include) {  
                     push(@submenu,['javascript:adhocRole('."'$role'".')',  
                                    &Apache::lonnet::plaintext($role)]);  
                 }  
             }              }
         }          }
         if (@submenu > 0) {          $role_selector .= '</select>'."\n";
             $switcher = &create_submenu('','',$switchtext,\@submenu);          if ($destsymb ne '') {
               $role_selector .= '<input type="hidden" name="destsymb" value="'.
                                 &HTML::Entities::encode($destsymb).'" />'."\n";
         }          }
           $role_selector .=
                  '<input type="hidden" name="destinationurl" value="'.
                  &HTML::Entities::encode($destinationurl).'" />'."\n".
                  '<input type="hidden" name="gotorole" value="1" />'."\n".
                  '<input type="hidden" name="selectrole" value="" />'."\n".
                  '<input type="hidden" name="switch" value="1" />'."\n".
                  '</form>';
     }      }
     return ($js,$form,$switcher);      return $role_selector;
 }  }
   
 sub get_all_courseroles {  sub get_all_courseroles {
Line 2413  sub get_all_courseroles { Line 1658  sub get_all_courseroles {
         push(@{$courseroles->{'st'}},keys(%sections_count));          push(@{$courseroles->{'st'}},keys(%sections_count));
         $seccount->{'st'} = scalar(keys(%sections_count));          $seccount->{'st'} = scalar(keys(%sections_count));
     }      }
     $seccount->{'st'} ++; # Increment for a section-less student role.  
     my $rolehash = {      my $rolehash = {
                      'roles'    => $courseroles,                       'roles'    => $courseroles,
                      'seccount' => $seccount,                       'seccount' => $seccount,
Line 2490  sub jump_to_role { Line 1734  sub jump_to_role {
     return <<"END";      return <<"END";
 <script type="text/javascript">  <script type="text/javascript">
 //<![CDATA[  //<![CDATA[
 function adhocRole(newrole) {  function adhocRole(roleitem) {
     $js      $js
       var newrole =  document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value;
     if (newrole == '') {      if (newrole == '') {
         return;          return;
     }       } 
Line 2508  function adhocRole(newrole) { Line 1753  function adhocRole(newrole) {
                 if (confirm("$lt{'role'}\\n$lt{'swit'}")) {                  if (confirm("$lt{'role'}\\n$lt{'swit'}")) {
                     document.rolechooser.destinationurl.value = '/adm/menu';                      document.rolechooser.destinationurl.value = '/adm/menu';
                 } else {                  } else {
                       document.rolechooser.elements[roleitem].selectedIndex = 0;
                     return;                      return;
                 }                  }
             }              }
Line 2550  function adhocRole(newrole) { Line 1796  function adhocRole(newrole) {
         return;          return;
     }      }
     if (fullrole == "$env{'request.role'}") {      if (fullrole == "$env{'request.role'}") {
           document.rolechooser.elements[roleitem].selectedIndex = 0;
         return;          return;
     }      }
     itemid = retrieveIndex('gotorole');      itemid = retrieveIndex('gotorole');
     if (itemid != -1) {      if (itemid != -1) {
         document.rolechooser.elements[itemid].name = fullrole;          document.rolechooser.elements[itemid].name = fullrole;
     }      }
     document.rolechooser.switchrole.value = fullrole;      document.rolechooser.elements[roleitem].options[document.rolechooser.elements[roleitem].selectedIndex].value = fullrole;
     document.rolechooser.selectrole.value = '1';      document.rolechooser.selectrole.value = '1';
     document.rolechooser.submit();      document.rolechooser.submit();
     return;      return;
Line 2619  sub countdown_timer { Line 1866  sub countdown_timer {
         }          }
         my $duedate = &Apache::lonnet::EXT("resource.0.duedate");          my $duedate = &Apache::lonnet::EXT("resource.0.duedate");
         my @interval=&Apache::lonnet::EXT("resource.0.interval");          my @interval=&Apache::lonnet::EXT("resource.0.interval");
           my $hastimeleft;
         if (@interval > 1) {          if (@interval > 1) {
             my $first_access=&Apache::lonnet::get_first_access($interval[1]);              my $first_access=&Apache::lonnet::get_first_access($interval[1]);
             if ($first_access > 0) {              if ($first_access > 0) {
Line 2676  BEGIN { Line 1924  BEGIN {
                         $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=~/^prim\:/) {                      } elsif ($configline=~/^prim\:/) {
                         my @entries = (split(/\:/, $configline))[1..6];                          my @entries = (split(/\:/, $configline))[1..5];
                         push(@primary_menu,\@entries);                          push @primary_menu, \@entries;
                     } elsif ($configline=~/^primsub\:/) {                      } elsif ($configline=~/^primsub\:/) {
                         my ($parent,@entries) = (split(/\:/, $configline))[1..4];                          my ($parent,@entries) = (split(/\:/, $configline))[1..4];
                         push(@{$primary_submenu{$parent}},\@entries);                          push (@{$primary_submenu{$parent}},\@entries);
                     } elsif ($configline=~/^scnd\:/) {                      } elsif ($configline=~/^scnd\:/) {
                         my @entries = (split(/\:/, $configline))[1..5];                          my @entries = (split(/\:/, $configline))[1..5];
                         push(@secondary_menu,\@entries);                          push @secondary_menu, \@entries; 
                     } elsif ($configline=~/^scndsub\:/) {  
                         my ($parent,@entries) = (split(/\:/, $configline))[1..4];  
                         push(@{$secondary_submenu{$parent}},\@entries);  
                     } elsif ($configline) {                      } elsif ($configline) {
                         push(@desklines,$configline);                          push(@desklines,$configline);
                     }                      }

Removed from v.1.369.2.48  
changed lines
  Added in v.1.388


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