--- loncom/interface/lonmenu.pm 2002/08/19 21:14:08 1.26 +++ loncom/interface/lonmenu.pm 2009/10/30 00:19:49 1.298 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines to control the menu # -# $Id: lonmenu.pm,v 1.26 2002/08/19 21:14:08 www Exp $ +# $Id: lonmenu.pm,v 1.298 2009/10/30 00:19:49 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,175 +25,1505 @@ # # http://www.lon-capa.org/ # -# (TeX Conversion Module # -# 05/29/00,05/30 Gerd Kortemeyer) +# There is one parameter controlling the action of this module: # -# 10/05,05/28,05/30,06/01,06/08,06/09,07/04,08/07 Gerd Kortemeyer -# 02/15/02 Matthew Hall +# environment.remote - if this is 'on', the routines controll the remote +# control, otherwise they render the main window controls; + +=head1 NAME + +Apache::lonmenu + +=head1 SYNOPSIS + +Coordinates the response to clicking an image. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +Little texts + +=item initlittle() + +=item menubuttons() + +This gets called at the top of the body section + +=item show_return_link() + +=item registerurl() + +This gets called in the header section + +=item innerregister() + +This gets called in order to register a URL, both with the Remote +and in the body of the document + +=item loadevents() + +=item unloadevents() + +=item startupremote() + +=item setflags() + +=item maincall() + +=item load_remote_msg() + +=item get_menu_name() + +=item reopenmenu() + +=item open() + +Open the menu + +=item clear() + +=item switch() + +Switch a button or create a link +Switch acts on the javascript that is executed when a button is clicked. +The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)". + +=item secondlevel() + +=item openmenu() + +=item inlinemenu() + +=item rawconfig() + +=item close() + +=item footer() + +=item utilityfunctions() + +=item serverform() + +=item constspaceform() + +=item get_nav_status() + +=item hidden_button_check() + +=item roles_selector() + +=item jump_to_role() + +=back + +=cut package Apache::lonmenu; use strict; use Apache::lonnet; -use Apache::File; -use vars qw(@desklines $readdesk); - -# =============================================================== Open the menu +use Apache::lonhtmlcommon(); +use Apache::loncommon(); +use Apache::lonenc(); +use Apache::lonlocal; +use LONCAPA qw(:DEFAULT :match); +use HTML::Entities(); + +use vars qw(@desklines %category_names %category_members %category_positions + $readdesk @primary_menu @secondary_menu); + +my @inlineremote; + +sub prep_menuitem { + my ($menuitem) = @_; + return '' unless(ref($menuitem) eq 'ARRAY'); + my $link; + if ($$menuitem[1]) { # graphical Link + $link = "\"""; + } else { # textual Link + $link = &mt($$menuitem[3]); + } + return '
  • '.$link.'
  • '; +} + +# primary_menu() evaluates @primary_menu and returns XHTML for the menu +# that contains following links: +# About, Message, Roles, Help, Logout +# @primary_menu is filled within the BEGIN block of this module with +# entries from mydesk.tab +sub primary_menu { + my $menu; + # each element of @primary contains following array: + # (link url, icon path, alt text, link text, condition) + foreach my $menuitem (@primary_menu) { + # evaluate conditions + next if ref($menuitem) ne 'ARRAY'; # + next if $$menuitem[4] eq 'nonewmsg' # show links depending on + && &Apache::lonmsg::mynewmail(); # whether a new msg + next if $$menuitem[4] eq 'newmsg' # arrived or not + && !&Apache::lonmsg::mynewmail(); # + next if $$menuitem[4] !~ /public/ ##we've a public user, + && $env{'user.name'} eq 'public' ##who should not see all + && $env{'user.domain'} eq 'public'; ##links + next if $$menuitem[4] eq 'onlypublic'# hide links which are + && $env{'user.name'} ne 'public' # only visible to public + && $env{'user.domain'} ne 'public'; # users + next if $$menuitem[4] eq 'roles' ##show links depending on + && &Apache::loncommon::show_course(); ##term 'Courses' or + next if $$menuitem[4] eq 'courses' ##'Roles' wanted + && !&Apache::loncommon::show_course(); ## + + + if ($$menuitem[3] eq 'Help') { # special treatment for helplink + $menu .= '
  • '.&Apache::loncommon::top_nav_help('Help').'
  • '; + } else { + my @items = @{$menuitem}; + $items[0] = 'javascript:'.$menuitem->[0].';'; + $menu .= &prep_menuitem(\@items); + } + } + + return "
      $menu
    "; +} + + +sub secondary_menu { + my $menu; + + my $crstype = &Apache::loncommon::course_type(); + my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'}); + my $canviewgrps = &Apache::lonnet::allowed('vcg', $env{'request.course.id'} + . ($env{'request.course.sec'} ? "/$env{'request.course.sec'}" + : '')); + my $showlink = &show_return_link(); + my %groups = &Apache::lonnet::get_active_groups( + $env{'user.domain'}, $env{'user.name'}, + $env{'course.' . $env{'request.course.id'} . '.domain'}, + $env{'course.' . $env{'request.course.id'} . '.num'}); + foreach my $menuitem (@secondary_menu) { + # evaluate conditions + next if ref($menuitem) ne 'ARRAY'; + next if $$menuitem[4] ne 'always' + && !$env{'request.course.id'}; + next if $$menuitem[4] eq 'showreturn' + && !$showlink + && !($env{'request.state'} eq 'construct'); + next if $$menuitem[4] =~ /^mdc/ + && !$canedit; + next if $$menuitem[4] eq 'mdcCourse' + && $crstype eq 'Community'; + next if $$menuitem[4] eq 'mdcCommunity' + && $crstype ne 'Community'; + next if $$menuitem[4] =~ /^remotenav/ + && $env{'environment.remotenavmap'} ne 'on'; + next if $$menuitem[4] =~ /noremotenav/ + && $env{'environment.remotenavmap'} eq 'on'; + next if $$menuitem[4] =~ /^(no|)remotenav$/ + && $crstype eq 'Community'; + next if $$menuitem[4] =~ /^(no|)remotenavCommunity$/ + && $crstype ne 'Community'; + next if $$menuitem[4] =~ /showgroups$/ + && $canviewgrps + && !%groups; + + if ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) { + # special treatment for role selector + my $roles_selector = &roles_selector( + $env{'course.' . $env{'request.course.id'} . '.domain'}, + $env{'course.' . $env{'request.course.id'} . '.num'} ); + + $menu .= $roles_selector ? "
  • $roles_selector
  • " + : ''; + } elsif ($env{'environment.remotenavmap'} eq 'on') { + # open link using javascript when remote navmap is activated + my @items = @{$menuitem}; + if ($menuitem->[4] eq 'remotenav') { + $items[0] = "javascript:gonav('$menuitem->[0]');"; + } else { + $items[0] = "javascript:go('$menuitem->[0]');"; + } + $menu .= &prep_menuitem(\@items); + } else { + $menu .= &prep_menuitem(\@$menuitem); + } + } + if ($menu =~ /\[url\].*\[symb\]/) { + my $escurl = &escape( &Apache::lonenc::check_encrypt( + $env{'request.noversionuri'})); + + my $escsymb = &escape( &Apache::lonenc::check_encrypt( + $env{'request.symb'})); + + if ( $env{'request.state'} eq 'construct' + and ( $env{'request.noversionuri'} eq '' + || !defined($env{'request.noversionuri'}))) + { + ($escurl = $env{'request.filename'}) =~ + s{^/home/([^/]+)/public_html/(.*)$}{/priv/$1/$2}; + + $escurl = &escape($escurl); + } + $menu =~ s/\[url\]/$escurl/g; + $menu =~ s/\[symb\]/$escsymb/g; + } + + return ""; +} + + +# +# This routine returns a translated hash for the menu items in the top inline menu row +# Probably should be in mydesk.tab + +#SD this sub is deprecated - don't use it +sub initlittle { + return &Apache::lonlocal::texthash('ret' => 'Return to Last Location', + 'nav' => 'Course Contents', + 'main' => 'Main Menu', + 'roles' => (&Apache::loncommon::show_course()? + 'Courses':'Roles'), + 'other' => 'Other Roles', + 'docs' => 'Edit Course', + 'exit' => 'Logout', + 'login' => 'Log In', + 'launch' => 'Launch Remote Control', + 'groups' => 'Groups', + 'gdoc' => 'Community Documents', + ); +} + +#SD this sub is deprecated - don't use it +#SD functionality is covered by new loncommon::bodytag and primary_menu(), secondary_menu() +sub menubuttons { + my $forcereg=shift; + my $titletable=shift; +# +# Early-out for pages that should not have a menu, triggered by query string "inhibitmenu=yes" +# + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['inhibitmenu']); + if (($env{'form.inhibitmenu'} eq 'yes') || + ($ENV{'REQUEST_URI'} eq '/adm/logout')) { return ''; } + + if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } + + my %lt=&initlittle(); + my $navmaps=''; + my $reloadlink=''; + my $docs=''; + my $groups=''; + my $roles=''.$lt{'roles'}.''; + my $role_selector; + my $showgroups=0; + my ($cnum,$cdom); +# +# if the URL is hidden, symbs and the non-versioned version of the URL would be encrypted +# + my $escurl=&escape(&Apache::lonenc::check_encrypt($env{'request.noversionuri'})); + my $escsymb=&escape(&Apache::lonenc::check_encrypt($env{'request.symb'})); + + my $logo=&Apache::loncommon::lonhttpdurl("/adm/lonIcons/minilogo.gif"); + $logo = 'LON-CAPA Logo'; + + if ($env{'request.state'} eq 'construct') { +# +# We are in construction space +# + if (($env{'request.noversionuri'} eq '') || (!defined($env{'request.noversionuri'}))) { + my $returnurl = $env{'request.filename'}; + $returnurl =~ s:^/home/([^/]+)/public_html/(.*)$:/priv/$1/$2:; + $escurl = &escape($returnurl); + } + } + if ($env{'request.course.id'}) { +# +# We are in a course +# + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my %coursegroups; + my $viewgrps_permission = + &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')); + if (!$viewgrps_permission) { + %coursegroups = &Apache::lonnet::get_active_groups($env{'user.domain'},$env{'user.name'},$cdom,$cnum); + } + if ((keys(%coursegroups) > 0) || ($viewgrps_permission)) { + $showgroups = 1; + } + $role_selector = &roles_selector($cdom,$cnum); + if ($role_selector) { + $roles = ''.$role_selector.'  '.$lt{'other'}.''; + } + } + + if ($env{'environment.remote'} eq 'off') { +# Remote Control is switched off +# figure out colors + my %lt=&initlittle(); + + my $domain=&Apache::loncommon::determinedomain(); + my $function=&Apache::loncommon::get_users_function(); + my $link=&Apache::loncommon::designparm($function.'.link',$domain); + my $alink=&Apache::loncommon::designparm($function.'.alink',$domain); + my $vlink=&Apache::loncommon::designparm($function.'.vlink',$domain); + my $sidebg=&Apache::loncommon::designparm($function.'.sidebg',$domain); + + if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { + return (< +
  • $logo
  • +
  • $lt{'login'}
  • + +
    +ENDINLINEMENU + } + $roles = ''.$lt{'roles'}.''; +# Do we have a NAV link? + if ($env{'request.course.id'}) { + my $link='/adm/navmaps?postdata='.$escurl.'&postsymb='. + $escsymb; + if ($env{'environment.remotenavmap'} eq 'on') { + $link="javascript:gonav('".$link."')"; + } + $navmaps=(<$lt{'nav'} +ENDNAV + my $is_community = + (&Apache::loncommon::course_type() eq 'Community'); + if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + my $text = ($is_community) ? $lt{'gdoc'} : $lt{'docs'}; + $docs=(<$text +ENDDOCS + } + if ($showgroups) { + $groups =(<$lt{'groups'} +ENDGROUPS + } + if (&show_return_link()) { + my $escreload=&escape('return:'); + $reloadlink=(<$lt{'ret'} +ENDRELOAD + } + if ($role_selector) { + #$roles = ''.$role_selector.''.$lt{'other'}.''; + $role_selector = '
  • '.$role_selector.'
  • '; + } + } + if (($env{'request.state'} eq 'construct') && ($env{'request.course.id'})) { + my $escreload=&escape('return:'); + $reloadlink=(<$lt{'ret'} +ENDCRELOAD + } + my $reg = $forcereg ? &innerregister($forcereg,$titletable) : ''; + my $form = &serverform(); + my $utility = &utilityfunctions(); + + #Prepare the message link that indicates the arrival of new mail + my $messagelink = &Apache::lonmsg::mynewmail() ? "Message (new)" : "Message"; + $messagelink = '' + . mt($messagelink) .''; + + my $helplink = &Apache::loncommon::top_nav_help('Help'); + return (< +// + +
      +
    1. $logo
    2. +
    3. $messagelink
    4. +
    5. $roles
    6. +
    7. $helplink
    8. +
    9. $lt{'exit'}
    10. +
    +
      +
    • $lt{'main'}
    • +$reloadlink +$navmaps +$docs +$groups +$role_selector +
    +$form + +$reg +ENDINLINEMENU + } else { + return ''; + } +} + +sub show_return_link { + return (($env{'request.noversionuri'}=~m{^/(res|public)/} && + $env{'request.symb'} eq '') + || + ($env{'request.noversionuri'}=~ m{^/cgi-bin/printout.pl}) + || + (($env{'request.noversionuri'}=~/^\/adm\//) && + ($env{'request.noversionuri'}!~/^\/adm\/wrapper\//) && + ($env{'request.noversionuri'}!~ + m[^/adm/.*/(smppg|bulletinboard|aboutme)($|\?)]) + )); +} + + +sub registerurl { + my ($forcereg) = @_; + my $result = ''; + if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } + my $force_title=''; + if ($env{'request.state'} eq 'construct') { + $force_title=&Apache::lonxml::display_title(); + } + if (($env{'environment.remote'} eq 'off') || + ((($env{'request.publicaccess'}) || + (!&Apache::lonnet::is_on_map( + &unescape($env{'request.noversionuri'})))) && + (!$forcereg))) { + return + $result + .'' + .$force_title; + } +# Graphical display after login only + if ($env{'request.registered'} && !$forcereg) { return ''; } + $result.=&innerregister($forcereg); + return $result.$force_title; +} + +sub innerregister { + my ($forcereg, $titletable) = @_; + my $result = ''; + my ($uname,$thisdisfn); + my $const_space = ($env{'request.state'} eq 'construct'); + my $is_const_dir = 0; + + if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } + + $env{'request.registered'} = 1; + + my $noremote = ($env{'environment.remote'} eq 'off'); + + undef(@inlineremote); + + my $reopen=&Apache::lonmenu::reopenmenu(); + + my $newmail=''; + + if (&Apache::lonmsg::newmail() && !$noremote) { + # We have new mail and remote is up + $newmail= 'swmenu.setstatus("you have","messages");'; + } + + my ($breadcrumb,$separator); + if ($noremote + && ($env{'request.symb'}) + && ($env{'request.course.id'})) { + + my ($mapurl,$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 @crumbs = ({text => "Course Contents", + href => "Javascript:gonav('/adm/navmaps')"}); + + if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) { + push(@crumbs, {text => '...', + no_mt => 1}); + } + + push @crumbs, {text => $maptitle, no_mt => 1} if ($maptitle + && $maptitle ne 'default.sequence' + && $maptitle ne $coursetitle); + + push @crumbs, {text => $restitle, no_mt => 1} if $restitle; + + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb(@crumbs); + $breadcrumb .= &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0); + unless (($env{'request.state'} eq 'edit') || ($newmail) || + ($env{'request.state'} eq 'construct') || + ($env{'form.register'})) { + $separator = &Apache::loncommon::head_subbox(); + } + # + } + if ($env{'request.state'} eq 'construct') { + $newmail = $titletable; + } + my $timesync = ( $noremote ? '' : 'swmenu.syncclock(1000*'.time.');' ); + my $tablestart = ( $noremote ? '' : ''); + my $tableend = ( $noremote ? '
    ' : ''); +# ============================================================================= +# ============================ This is for URLs that actually can be registered + if (($env{'request.noversionuri'}!~m{^/(res/)*adm/}) || ($forcereg)) { +# -- This applies to homework problems for users with grading privileges + my $crs='/'.$env{'request.course.id'}; + if ($env{'request.course.sec'}) { + $crs.='_'.$env{'request.course.sec'}; + } + $crs=~s/\_/\//g; + + my $hwkadd=''; + if ($env{'request.symb'} ne '' && + $env{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form|task)$/) { + if (&Apache::lonnet::allowed('mgr',$crs)) { + $hwkadd.=&switch('','',7,2,'pgrd.gif','problem[_1]','grades[_4]', + "gocmd('/adm/grades','gradingmenu')", + 'Modify user grades for this assessment resource'); + } elsif (&Apache::lonnet::allowed('vgr',$crs)) { + $hwkadd.=&switch('','',7,2,'subm.gif','view sub-[_1]','missions[_1]', + "gocmd('/adm/grades','submission')", + 'View user submissions for this assessment resource'); + } + } + if ($env{'request.symb'} ne '' && + &Apache::lonnet::allowed('opa',$crs)) { + $hwkadd.=&switch('','',7,3,'pparm.gif','problem[_2]','parms[_2]', + "gocmd('/adm/parmset','set')", + 'Modify parameter settings for this resource'); + } +# -- End Homework + ### + ### Determine whether or not to display the 'cstr' button for this + ### resource + ### + my $editbutton = ''; + my $noeditbutton = 1; + my ($cnum,$cdom); + if ($env{'request.course.id'}) { + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } + if ($env{'user.author'}) { + if ($env{'request.role'}=~/^(aa|ca|au)/) { +# +# We have the role of an author +# + # Set defaults for authors + my ($top,$bottom) = ('con-','struct'); + my $action = "go('/priv/".$env{'user.name'}."');"; + my $cadom = $env{'request.role.domain'}; + my $caname = $env{'user.name'}; + my $desc = "Enter my construction space"; + # Set defaults for co-authors + if ($env{'request.role'} =~ /^ca/) { + ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); + ($top,$bottom) = ('co con-','struct'); + $action = "go('/priv/".$caname."');"; + $desc = "Enter construction space as co-author"; + } elsif ($env{'request.role'} =~ /^aa/) { + ($cadom,$caname)=($env{'request.role'}=~/($match_domain)\/($match_username)$/); + ($top,$bottom) = ('co con-','struct'); + $action = "go('/priv/".$caname."');"; + $desc = "Enter construction space as assistant co-author"; + } + # Check that we are on the correct machine + my $home = &Apache::lonnet::homeserver($caname,$cadom); + my $allowed=0; + my @ids=&Apache::lonnet::current_machine_ids(); + foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } + if (!$allowed) { + $editbutton=&switch('','',6,1,$top,,$bottom,$action,$desc); + $noeditbutton = 0; + } + } +# +# We are an author for some stuff, but currently do not have the role of author. +# Figure out if we have authoring privileges for the resource we are looking at. +# This should maybe become a privilege check in lonnet +# + ## + ## Determine if user can edit url. + ## + my $cfile=''; + my $cfuname=''; + my $cfudom=''; + my $uploaded; + 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/^($match_domain)\/($match_username)/\/priv\/$2/; + # Check that the user has permission to edit this resource + ($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1); + if (defined($cfudom)) { + my $home=&Apache::lonnet::homeserver($cfuname,$cfudom); + my $allowed=0; + my @ids=&Apache::lonnet::current_machine_ids(); + foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } + if ($allowed) { + $cfile=$file; + } + } + } + } + # Finally, turn the button on or off + if ($cfile && !$const_space) { + $editbutton=&switch + ('','',6,1,'pcstr.gif','edit[_1]','resource[_2]', + "go('".$cfile."');","Edit this resource"); + $noeditbutton = 0; + } elsif ($editbutton eq '') { + $editbutton=&clear(6,1); + } + } + if (($noeditbutton) && ($env{'request.filename'})) { + if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { + my $file=&Apache::lonnet::declutter($env{'request.filename'}); + if (defined($cnum) && defined($cdom)) { + if (&is_course_upload($file,$cnum,$cdom)) { + my $cfile = &edit_course_upload($file,$cnum,$cdom); + if ($cfile) { + $editbutton=&switch + ('','',6,1,'pcstr.gif','edit[_1]', + 'resource[_2]',"go('".$cfile."');", + 'Edit this resource'); + } + } + } + } + } + ### + ### +# Prepare the rest of the buttons + my $menuitems; + if ($const_space) { +# +# We are in construction space +# + my ($uname,$thisdisfn) = + ($env{'request.filename'}=~m|^/home/([^/]+)/public_html/(.*)|); + my $currdir = '/priv/'.$uname.'/'.$thisdisfn; + if ($currdir =~ m-/$-) { + $is_const_dir = 1; + } else { + $currdir =~ s|[^/]+$||; + my $cleandisfn = &Apache::loncommon::escape_single($thisdisfn); + my $esc_currdir = &Apache::loncommon::escape_single($currdir); +# +# Probably should be in mydesk.tab +# + $menuitems=(< 0){ + $menuitems.="anot2.gif"; +}else{ + $menuitems.="anot.gif"; +} +$menuitems.="&anno-[_1]&tations[_1]&annotate()&"; +$menuitems.="Make notes and annotations about this resource&&1\n"; + + unless ($noremote) { + my $showreqcrs = &check_for_rcrs(); + if ($showreqcrs) { + $menuitems.="s&8&1&rcrs.gif&request[_1]&course[_16]". + "&go('/adm/requestcourse')&Course requests\n"; + } + } + unless ($env{'request.noversionuri'}=~/\/(bulletinboard|smppg|navmaps|syllabus|aboutme)(\?|$)/) { + if ((!$env{'request.enc'}) && ($env{'request.noversionuri'} !~ m{^/adm/wrapper/ext/})) { + $menuitems.=(< +$inlineremote[21] $inlineremote[23] +ENDARROWSINLINE + if (&hidden_button_check() ne 'yes') { + $inlinebuttons .= (< +ENDINLINEICONS + } + } else { + if ($inlineremote[21] ne '' || $inlineremote[23] ne '') { + $inlinebuttons=(<$inlineremote[21] $inlineremote[23] +ENDFIRSTLINE + } + if (&hidden_button_check() ne 'yes') { + foreach my $row (6..9) { + if ($inlineremote[${row}.'1'] ne '' + || $inlineremote[$row.'2'] ne '' + || $inlineremote[$row.'3'] ne '') { + $inlinebuttons .= <<"ENDLINE"; +$inlineremote["${row}1"]$inlineremote["${row}2"]$inlineremote["${row}3"] +ENDLINE + } + } + } + } + } + $result =(< +// BEGIN LON-CAPA Internal + +$timesync +$breadcrumb +$tablestart +$inlinebuttons +$tableend +$newmail +$separator + + +ENDREGTEXT +# Registered, graphical output + } else { + my $requri=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0])); + $requri=&Apache::lonenc::check_encrypt(&unescape($requri)); + my $cursymb=&Apache::lonenc::check_encrypt($env{'request.symb'}); + my $navstatus=&get_nav_status(); + my $clearcstr; + + if ($env{'user.adv'}) { $clearcstr='clearbut(6,1)'; } + $result = (< +// + +ENDREGTHIS + } +# ============================================================================= + } else { +# ========================================== This can or will not be registered + if ($noremote) { +# Not registered + $result= (< +// + +ENDDONOTREGTHIS + } +# ============================================================================= + } + return $result; +} + +sub is_course_upload { + my ($file,$cnum,$cdom) = @_; + my $uploadpath = &LONCAPA::propath($cdom,$cnum); + $uploadpath =~ s{^\/}{}; + if (($file =~ m{^\Q$uploadpath\E/userfiles/docs/}) || + ($file =~ m{^userfiles/\Q$cdom\E/\Q$cnum\E/docs/})) { + return 1; + } + return; +} + +sub edit_course_upload { + my ($file,$cnum,$cdom) = @_; + my $cfile; + if ($file =~/\.(htm|html|css|js|txt)$/) { + my $ext = $1; + my $url = &Apache::lonnet::hreflocation('',$file); + my $home = &Apache::lonnet::homeserver($cnum,$cdom); + my @ids=&Apache::lonnet::current_machine_ids(); + my $dest; + if ($home && grep(/^\Q$home\E$/,@ids)) { + $dest = $url.'?forceedit=1'; + } else { + unless (&Apache::lonnet::get_locks()) { + $dest = '/adm/switchserver?otherserver='. + $home.'&role='.$env{'request.role'}. + '&url='.$url.'&forceedit=1'; + } + } + if ($dest) { + $cfile = &HTML::Entities::encode($dest,'"<>&'); + } + } + return $cfile; +} + +sub loadevents() { + if ($env{'request.state'} eq 'construct' || + $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } + return 'LONCAPAreg();'; +} + +sub unloadevents() { + if ($env{'request.state'} eq 'construct' || + $env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; } + return 'LONCAPAstale();'; +} + + +sub startupremote { + my ($lowerurl)=@_; + if ($env{'environment.remote'} eq 'off') { + return (''); + } +# +# 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 +} + +sub setflags() { + return(< +// + +ENDSETFLAGS +} + +sub maincall() { + if ($env{'environment.remote'} eq 'off') { return ''; } + return(< +// + +ENDMAINCALL +} + +sub load_remote_msg { + my ($lowerurl)=@_; + + if ($env{'environment.remote'} eq 'off') { return ''; } + + my $esclowerurl=&escape($lowerurl); + my $link=&mt('[_1]Continue[_2] on in Inline Menu mode' + ,'' + ,''); + return(< +
    + +
    +

    +

    $link

    +ENDREMOTEFORM +} + +sub get_menu_name { + my $hostid = $Apache::lonnet::perlvar{'lonHostID'}; + $hostid =~ s/\W//g; + return 'LCmenu'.$hostid; +} + + +sub reopenmenu { + if ($env{'environment.remote'} eq 'off') { return ''; } + my $menuname = &get_menu_name(); + my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); + return('window.open('.$nothing.',"'.$menuname.'","",false);'); +} + sub open { my $returnval=''; - unless (shift eq 'unix') { + if ($env{'environment.remote'} eq 'off') { + return + ''; + } + my $menuname = &get_menu_name(); + +# unless (shift eq 'unix') { # resizing does not work on linux because of virtual desktop sizes - $returnval.=(< ENDOPEN - return ''; + return ''; } -# ============================================================ Switch Menu Item - -sub switchmenu { - my ($row,$col,$imgsrc,$texttop,$textbot,$action)=@_; - my $openwin=&openmenu(); - return(< - var swmenu=$openwin - swmenu.switchbutton($row,$col,"$imgsrc","$texttop","$textbot","$action"); - -ENDSMENU -} # ================================================================== Raw Config sub clear { my ($row,$col)=@_; - return qq(swmenu.clearbut($row,$col);); + unless ($env{'environment.remote'} eq 'off') { + if (($row<1) || ($row>13)) { return ''; } + return "\n".qq(window.status+='.';swmenu.clearbut($row,$col);); + } else { + $inlineremote[10*$row+$col]=''; + return ''; + } } +# ============================================ Switch a button or create a link # Switch acts on the javascript that is executed when a button is clicked. # The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)". + sub switch { - my ($uname,$udom,$row,$col,$img,$top,$bot,$act)=@_; + my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak)=@_; $act=~s/\$uname/$uname/g; $act=~s/\$udom/$udom/g; - return "\n". - qq(swmenu.switchbutton($row,$col,"$img","$top","$bot","$act");); + $top=&mt($top); + $bot=&mt($bot); + $desc=&mt($desc); + if (($env{'environment.remote'} ne 'off') || ($env{'environment.icons'} eq 'classic')) { + $img=&mt($img); + } + my $idx=10*$row+$col; + $category_members{$cat}.=':'.$idx; + + unless ($env{'environment.remote'} eq 'off') { + if (($row<1) || ($row>13)) { return ''; } +# Remote + return "\n". + qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc");); + } else { +# Inline Remote + if ($env{'environment.icons'} ne 'classic') { + $img=~s/\.gif$/\.png/; + } + if ($nobreak==2) { return ''; } + my $text=$top.' '.$bot; + $text=~s/\s*\-\s*//gs; + + my $pic= + ''.$text.''; + if ($env{'browser.interface'} eq 'faketextual') { +# Main Menu + if ($nobreak==3) { + $inlineremote[$idx]="\n". + ''.$text. + ''. + ''.$pic.''; + } elsif ($nobreak) { + $inlineremote[$idx]="\n". + ''. + ''.$pic.' + '.$text.''; + } else { + $inlineremote[$idx]="\n". + ''. + ''.$pic. + ''. + ''.$desc.''; + } + } else { +# Inline Menu + if ($env{'environment.icons'} eq 'iconsonly') { + $inlineremote[$idx]=''.$pic.''; + } else { + $inlineremote[$idx]= + ''.$pic. + ''.$desc.''; + } + } + } + return ''; } sub secondlevel { my $output=''; my - ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act)=@_; + ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat)=@_; if ($prt eq 'any') { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } elsif ($prt=~/^r(\w+)/) { if ($rol eq $1) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act); + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } } return $output; } sub openmenu { - if ($ENV{'browser.type'} eq 'explorer') { - return "window.open('javascript:void(0);','LONCAPAmenu');"; - } else { - return "window.open('','LONCAPAmenu');"; - } + my $menuname = &get_menu_name(); + if ($env{'environment.remote'} eq 'off') { return ''; } + my $nothing = &Apache::lonhtmlcommon::javascript_nothing(); + return "window.open(".$nothing.",'".$menuname."');"; +} + +sub inlinemenu { + undef(@inlineremote); + undef(%category_members); +# calling rawconfig with "1" will evaluate mydesk.tab, even if there is no active remote control + &rawconfig(1); + my $output=''; + for (my $col=1; $col<=2; $col++) { + $output.='"; + } + $output.="
    '; + for (my $row=1; $row<=8; $row++) { + foreach my $cat (keys(%category_members)) { + if ($category_positions{$cat} ne "$col,$row") { next; } + #$output.=''; + $output.='
    '; + $output.='

    '.&mt($category_names{$cat}).'

    '; + $output.='
    '.&mt($category_names{$cat}).'
    '; + my %active=(); + foreach my $menu_item (split(/\:/,$category_members{$cat})) { + if ($inlineremote[$menu_item]) { + $active{$menu_item}=1; + } + } + foreach my $item (sort(keys(%active))) { + $output.=$inlineremote[$item]; + } + $output.='
    '; + $output.=''; + } + } + $output.="
    "; + return $output; } sub rawconfig { - my $r = shift; - my $output="var swmenu=".&openmenu(); - my $uname=$ENV{'user.name'}; - my $udom=$ENV{'user.domain'}; - my $adv=$ENV{'user.adv'}; - my $author=$ENV{'user.author'}; +# +# This evaluates mydesk.tab +# Need to add more positions and more privileges to deal with all +# menu items. +# + my $textualoverride=shift; + my $output=''; + unless ($env{'environment.remote'} eq 'off') { + $output.= + "window.status='Opening Remote Control';var swmenu=".&openmenu(). +"\nwindow.status='Configuring Remote Control ';"; + } else { + unless ($textualoverride) { return ''; } + } + my $uname=$env{'user.name'}; + my $udom=$env{'user.domain'}; + my $adv=$env{'user.adv'}; + my $show_course=&Apache::loncommon::show_course(); + my $author=$env{'user.author'}; my $crs=''; - if ($ENV{'request.course.id'}) { - $crs='/'.$ENV{'request.course.id'}; - if ($ENV{'request.course.sec'}) { - $crs.='_'.$ENV{'request.course.sec'}; + my $crstype=''; + if ($env{'request.course.id'}) { + $crs='/'.$env{'request.course.id'}; + if ($env{'request.course.sec'}) { + $crs.='_'.$env{'request.course.sec'}; } $crs=~s/\_/\//g; + $crstype = &Apache::loncommon::course_type(); } - my $pub=($ENV{'request.state'} eq 'published'); - my $con=($ENV{'request.state'} eq 'construct'); - my $rol=$ENV{'request.role'}; - my $requested_domain = $ENV{'request.role.domain'}; - foreach (@desklines) { - my ($row,$col,$pro,$prt,$img,$top,$bot,$act)=split(/\:/,$_); + my $pub=($env{'request.state'} eq 'published'); + my $con=($env{'request.state'} eq 'construct'); + my $rol=$env{'request.role'}; + my $requested_domain = $env{'request.role.domain'}; + foreach my $line (@desklines) { + my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line); $prt=~s/\$uname/$uname/g; $prt=~s/\$udom/$udom/g; - $prt=~s/\$crs/$crs/g; + if ($prt =~ /\$crs/) { + next unless ($env{'request.course.id'}); + next if ($crstype eq 'Community'); + $prt=~s/\$crs/$crs/g; + } elsif ($prt =~ /\$cmty/) { + next unless ($env{'request.course.id'}); + next if ($crstype ne 'Community'); + $prt=~s/\$cmty/$crs/g; + } $prt=~s/\$requested_domain/$requested_domain/g; + if ($category_names{$cat}!~/\w/) { $cat='oth'; } if ($pro eq 'clear') { $output.=&clear($row,$col); } elsif ($pro eq 'any') { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } elsif ($pro eq 'smp') { unless ($adv) { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } } elsif ($pro eq 'adv') { if ($adv) { $output.=&secondlevel( - $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act); + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro eq 'shc') { + if ($show_course) { + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro eq 'nsc') { + if (!$show_course) { + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); + } + } elsif (($pro=~/^p(\w+)/) && ($prt)) { + my $priv = $1; + if ($priv =~ /^mdc(Course|Community)/) { + if ($crstype eq $1) { + $priv = 'mdc'; + } else { + next; + } } - } elsif (($pro=~/p(\w+)/) && ($prt)) { - if (&Apache::lonnet::allowed($1,$prt)) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act); - } - } elsif ($pro eq 'course') { - if ($ENV{'request.course.fn'}) { - $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act); + if (&Apache::lonnet::allowed($priv,$prt)) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro eq 'course') { + if (($env{'request.course.fn'}) && ($crstype ne 'Community')) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); } + } elsif ($pro eq 'community') { + if (($env{'request.course.fn'}) && ($crstype eq 'Community')) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro =~ /^courseenv_(.*)$/) { + my $key = $1; + if (($env{'course.'.$env{'request.course.id'}.'.'.$key}) && + ($crstype ne 'Community')) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro =~ /^communityenv_(.*)$/) { + my $key = $1; + if (($env{'course.'.$env{'request.course.id'}.'.'.$key}) && + ($crstype eq 'Community')) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro =~ /^course_(.*)$/) { + # Check for permissions inside of a course + if (($env{'request.course.id'}) && ($crstype ne 'Community') && + (&Apache::lonnet::allowed($1,$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) + )) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); + } + } elsif ($pro =~ /^community_(.*)$/) { + # Check for permissions inside of a community + if (($env{'request.course.id'}) && ($crstype eq 'Community') && + (&Apache::lonnet::allowed($1,$env{'request.course.id'}. + ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) + )) { + $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat); + } } elsif ($pro eq 'author') { if ($author) { - if (($prt eq 'rca') && ($ENV{'request.role'}=~/^ca/)) { + if ((($prt eq 'rca') && ($env{'request.role'}=~/^ca/)) || + (($prt eq 'raa') && ($env{'request.role'}=~/^aa/)) || + (($prt eq 'rau') && ($env{'request.role'}=~/^au/))) { # Check that we are on the correct machine - my ($cadom,$caname)= - ($ENV{'request.role'}=~/(\w+)\/(\w+)$/); + my $cadom=$requested_domain; + my $caname=$env{'user.name'}; + if (($prt eq 'rca') || ($prt eq 'raa')) { + ($cadom,$caname)= + ($env{'request.role'}=~/($match_domain)\/($match_username)$/); + } + $act =~ s/\$caname/$caname/g; my $home = &Apache::lonnet::homeserver($caname,$cadom); - if ($home eq $r->dir_config('lonHostID')) { - $output.=switch($caname,$cadom, - $row,$col,$img,$top,$bot,$act); - } - } elsif ($prt eq 'any') { - my $home = &Apache::lonnet::homeserver - ($ENV{'user.name'},$ENV{'user.domain'}); - if ($home eq $r->dir_config('lonHostID')) { - $output.=switch - ($ENV{'user.name'},$ENV{'user.domain'}, - $row,$col,$img,$top,$bot,$act); + my $allowed=0; + my @ids=&Apache::lonnet::current_machine_ids(); + foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } + if ($allowed) { + $output.=&switch($caname,$cadom, + $row,$col,$img,$top,$bot,$act,$desc,$cat); } } } + } elsif ($pro eq 'tools') { + my @tools = ('aboutme','blog','portfolio'); + if (grep(/^\Q$prt\E$/,@tools)) { + if (!&Apache::lonnet::usertools_access($env{'user.name'}, + $env{'user.domain'}, + $prt,undef,'tools')) { + $output.=&clear($row,$col); + next; + } + } elsif (($prt eq 'reqcrsnsc') || ($prt eq 'reqcrsshc')) { + if (($prt eq 'reqcrsnsc') && ($show_course)) { + next; + } + if (($prt eq 'reqcrsshc') && (!$show_course)) { + next; + } + my $showreqcrs = &check_for_rcrs(); + if (!$showreqcrs) { + $output.=&clear($row,$col); + next; + } + } + $prt='any'; + $output.=&secondlevel( + $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat); } } - $output.="swmenu.syncclock(1000*".time.");"; + unless ($env{'environment.remote'} eq 'off') { + $output.="\nwindow.status='Synchronizing Time';swmenu.syncclock(1000*".time.");\nwindow.status='Remote Control Configured.';"; + if (&Apache::lonmsg::newmail()) { + $output.='swmenu.setstatus("you have","messages");'; + } + } + return $output; } +sub check_for_rcrs { + my $showreqcrs = 0; + my @reqtypes = ('official','unofficial','community'); + foreach my $type (@reqtypes) { + if (&Apache::lonnet::usertools_access($env{'user.name'}, + $env{'user.domain'}, + $type,undef,'requestcourses')) { + $showreqcrs = 1; + last; + } + } + if (!$showreqcrs) { + foreach my $type (@reqtypes) { + if ($env{'environment.reqcrsotherdom.'.$type} ne '') { + $showreqcrs = 1; + last; + } + } + } + return $showreqcrs; +} + # ======================================================================= Close sub close { + if ($env{'environment.remote'} eq 'off') { return ''; } + my $menuname = &get_menu_name(); return(< -menu=window.open("/adm/rat/empty.html","LONCAPAmenu", + ENDCLOSE } @@ -204,31 +1534,552 @@ sub footer { } -# ================================================================ Main Program +sub nav_control_js { + my $nav=($env{'environment.remotenavmap'} eq 'on'); + return (<new($Apache::lonnet::perlvar{'lonTabDir'}. - '/mydesk.tab'); - while (my $configline=<$config>) { - $configline=(split(/\#/,$configline))[0]; - $configline=~s/^\s+//; - chomp($configline); - if ($configline) { - $desklines[$#desklines+1]=$configline; - } + +function gonav(url) { + if (w_loncapanav_flag != 1) { + gopost(url,''); + } else { + navwindow=window.open(url, + "loncapanav","height=600,width=400,scrollbars=1"); + } +} +NAVCONTROL +} + +sub utilityfunctions { + my $caller = shift; + unless ($env{'environment.remote'} eq 'off' || + $caller eq '/adm/menu') { + return ''; } + + my $currenturl=&Apache::lonnet::clutter(&Apache::lonnet::fixversion((split(/\?/,$env{'request.noversionuri'}))[0])); + if ($currenturl =~ m{^/adm/wrapper/ext/}) { + if ($env{'request.external.querystring'}) { + $currenturl .= ($currenturl=~/\?/)?'&':'?'.$env{'request.external.querystring'}; + } } + $currenturl=&Apache::lonenc::check_encrypt(&unescape($currenturl)); + + my $currentsymb=&Apache::lonenc::check_encrypt($env{'request.symb'}); + my $nav_control=&nav_control_js(); + + my $start_page_annotate = + &Apache::loncommon::start_page('Annotator',undef, + {'only_body' => 1, + 'js_ready' => 1, + 'bgcolor' => '#BBBBBB', + 'add_entries' => { + 'onload' => 'javascript:document.goannotate.submit();'}}); + + my $end_page_annotate = + &Apache::loncommon::end_page({'js_ready' => 1}); + + my $start_page_bookmark = + &Apache::loncommon::start_page('Bookmarks',undef, + {'only_body' => 1, + 'js_ready' => 1, + 'bgcolor' => '#BBBBBB',}); + + my $end_page_bookmark = + &Apache::loncommon::end_page({'js_ready' => 1}); + +return (<" + +"" + +"<\\/form>" + +'$end_page_annotate'); + annotator.document.close(); +} + +function set_bookmark() { + go(''); + clienttitle=document.title; + clienthref=location.pathname; + w_bmquery_flag=1; + bmquery=window.open('','bmquery','width=365,height=165,scrollbars=0'); + bmquery.document.write( + '$start_page_bookmark' + +'
    ' + +'
    Link Name:
    ' + +'
    Address:

    ' + +'$end_page_bookmark' ); + bmquery.document.close(); +} + +ENDUTILITY +} + +sub serverform { + return(< + + + + + +ENDSERVERFORM +} + +sub constspaceform { + return(< + + +
    + + +
    +
    + + + +
    + +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 { + my $hidden; + if ($env{'request.course.id'} eq '') { + return; + } + if ($env{'request.role.adv'}) { + return; + } + my $buttonshide = &Apache::lonnet::EXT('resource.0.buttonshide'); + return $buttonshide; +} +sub roles_selector { + my ($cdom,$cnum) = @_; + my $crstype = &Apache::loncommon::course_type(); + my $now = time; + my (%courseroles,%seccount); + my $is_cc; + my $role_selector; + my $ccrole; + if ($crstype eq 'Community') { + $ccrole = 'co'; + } else { + $ccrole = 'cc'; + } + if ($env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}) { + my ($start,$end) = split(/\./,$env{'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum}); + + if ((($start) && ($start<0)) || + (($end) && ($end<$now)) || + (($start) && ($now<$start))) { + $is_cc = 0; + } else { + $is_cc = 1; + } + } + if ($is_cc) { + &get_all_courseroles($cdom,$cnum,\%courseroles,\%seccount); + } else { + my %gotnosection; + foreach my $item (keys(%env)) { + if ($item =~ m-^user\.role\.([^.]+)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) { + my $role = $1; + my $sec = $2; + next if ($role eq 'gr'); + my ($start,$end) = split(/\./,$env{$item}); + next if (($start && $start > $now) || ($end && $end < $now)); + if ($sec eq '') { + if (!$gotnosection{$role}) { + $seccount{$role} ++; + $gotnosection{$role} = 1; + } + } + if (ref($courseroles{$role}) eq 'ARRAY') { + if ($sec ne '') { + if (!grep(/^\Q$sec\E$/,@{$courseroles{$role}})) { + push(@{$courseroles{$role}},$sec); + $seccount{$role} ++; + } + } + } else { + @{$courseroles{$role}} = (); + if ($sec ne '') { + $seccount{$role} ++; + push(@{$courseroles{$role}},$sec); + } + } + } + } + } + my $switchtext; + if ($crstype eq 'Community') { + $switchtext = &mt('Switch community role to...') + } else { + $switchtext = &mt('Switch course role to...') + } + my @roles_order = ($ccrole,'in','ta','ep','ad','st'); + if (keys(%courseroles) > 1) { + $role_selector = &jump_to_role($cdom,$cnum,\%seccount,\%courseroles); + $role_selector .= '
    + '."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + '
    '; + } + return $role_selector; +} +sub get_all_courseroles { + my ($cdom,$cnum,$courseroles,$seccount) = @_; + unless ((ref($courseroles) eq 'HASH') && (ref($seccount) eq 'HASH')) { + return; + } + my ($result,$cached) = + &Apache::lonnet::is_cached_new('getcourseroles',$cdom.'_'.$cnum); + if (defined($cached)) { + if (ref($result) eq 'HASH') { + if ((ref($result->{'roles'}) eq 'HASH') && + (ref($result->{'seccount'}) eq 'HASH')) { + %{$courseroles} = %{$result->{'roles'}}; + %{$seccount} = %{$result->{'seccount'}}; + return; + } + } + } + my %gotnosection; + my %adv_roles = + &Apache::lonnet::get_course_adv_roles($env{'request.course.id'},1); + foreach my $role (keys(%adv_roles)) { + my ($urole,$usec) = split(/:/,$role); + if (!$gotnosection{$urole}) { + $seccount->{$urole} ++; + $gotnosection{$urole} = 1; + } + if (ref($courseroles->{$urole}) eq 'ARRAY') { + if ($usec ne '') { + if (!grep(/^Q$usec\E$/,@{$courseroles->{$urole}})) { + push(@{$courseroles->{$urole}},$usec); + $seccount->{$urole} ++; + } + } + } else { + @{$courseroles->{$urole}} = (); + if ($usec ne '') { + $seccount->{$urole} ++; + push(@{$courseroles->{$urole}},$usec); + } + } + } + my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum,['st']); + @{$courseroles->{'st'}} = (); + if (keys(%sections_count) > 0) { + push(@{$courseroles->{'st'}},keys(%sections_count)); + $seccount->{'st'} = scalar(keys(%sections_count)); + } + my $rolehash = { + 'roles' => $courseroles, + 'seccount' => $seccount, + }; + &Apache::lonnet::do_cache_new('getcourseroles',$cdom.'_'.$cnum,$rolehash); + return; +} + +sub jump_to_role { + my ($cdom,$cnum,$seccount,$courseroles) = @_; + my %lt = &Apache::lonlocal::texthash( + this => 'This role has section(s) associated with it.', + ente => 'Enter a specific section.', + orlb => 'Enter a specific section, or leave blank for no section.', + avai => 'Available sections are:', + youe => 'You entered an invalid section choice:', + plst => 'Please try again', + ); + my $js; + if (ref($courseroles) eq 'HASH') { + $js = ' var secpick = new Array("'.$lt{'ente'}.'","'.$lt{'orlb'}.'");'."\n". + ' var numsec = new Array();'."\n". + ' var rolesections = new Array();'."\n". + ' var rolenames = new Array();'."\n". + ' var roleseclist = new Array();'."\n"; + my @items = keys(%{$courseroles}); + for (my $i=0; $i<@items; $i++) { + $js .= ' rolenames['.$i.'] = "'.$items[$i].'";'."\n"; + my ($secs,$secstr); + if (ref($courseroles->{$items[$i]}) eq 'ARRAY') { + my @sections = sort { $a <=> $b } @{$courseroles->{$items[$i]}}; + $secs = join('","',@sections); + $secstr = join(', ',@sections); + } + $js .= ' rolesections['.$i.'] = new Array("'.$secs.'");'."\n". + ' roleseclist['.$i.'] = "'.$secstr.'";'."\n". + ' numsec['.$i.'] = "'.$seccount->{$items[$i]}.'";'."\n"; + } + } + return <<"END"; + +END +} + + +# ================================================================ Main Program + +BEGIN { + if (! defined($readdesk)) { + { + my $tabfile = $Apache::lonnet::perlvar{'lonTabDir'}.'/mydesk.tab'; + if ( CORE::open( my $config,"<$tabfile") ) { + while (my $configline=<$config>) { + $configline=(split(/\#/,$configline))[0]; + $configline=~s/^\s+//; + chomp($configline); + if ($configline=~/^cat\:/) { + my @entries=split(/\:/,$configline); + $category_positions{$entries[2]}=$entries[1]; + $category_names{$entries[2]}=$entries[3]; + } elsif ($configline=~/^prim\:/) { + my @entries = (split(/\:/, $configline))[1..5]; + push @primary_menu, \@entries; + } elsif ($configline=~/^scnd\:/) { + my @entries = (split(/\:/, $configline))[1..5]; + push @secondary_menu, \@entries; + } elsif ($configline) { + push(@desklines,$configline); + } + } + CORE::close($config); + } + } + $readdesk='done'; + } +} + +1; +__END__