--- loncom/interface/lonmenu.pm 2003/02/14 19:35:54 1.38
+++ loncom/interface/lonmenu.pm 2025/02/21 04:29:26 1.561
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Routines to control the menu
#
-# $Id: lonmenu.pm,v 1.38 2003/02/14 19:35:54 www Exp $
+# $Id: lonmenu.pm,v 1.561 2025/02/21 04:29:26 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,557 +25,3776 @@
#
# http://www.lon-capa.org/
#
-# (TeX Conversion Module
#
-# 05/29/00,05/30 Gerd Kortemeyer)
-#
-# 10/05,05/28,05/30,06/01,06/08,06/09,07/04,08/07 Gerd Kortemeyer
-# 02/15/02 Matthew Hall
+
+=head1 NAME
+
+Apache::lonmenu
+
+=head1 SYNOPSIS
+
+Loads contents of /home/httpd/lonTabs/mydesk.tab,
+used to generate inline menu, and Main Menu page.
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 GLOBAL VARIABLES
+
+=over
+
+=item @desklines
+
+Each element of this array contains a line of mydesk.tab that doesn't start with
+cat, prim or scnd.
+It gets filled in the BEGIN block of this module.
+
+=item %category_names
+
+The keys of this hash are the abbreviations used in mydesk.tab in those lines that
+start with cat, the values are strings representing titles.
+It gets filled in the BEGIN block of this module.
+
+=item %category_members
+
+TODO
+
+=item %category_positions
+
+The keys of this hash are the abbreviations used in mydesk.tab in those lines that
+start with cat, its values are position vectors (column, row).
+It gets filled in the BEGIN block of this module.
+
+=item $readdesk
+
+Indicates that mydesk.tab has been read.
+It is set to 'done' in the BEGIN block of this module.
+
+=item @primary_menu
+
+The elements of this array reference arrays that are made up of the components
+of those lines of mydesk.tab that start with prim:.
+It is used by primary_menu() to generate the corresponding menu.
+It gets filled in the BEGIN block of this module.
+
+=item %primary_sub_menu
+
+The keys of this hash reference are the names of items in the primary_menu array
+which have sub-menus. For each key, the corresponding value is a reference to
+an array containing components extracted from lines in mydesk.tab which begin
+with primsub:.
+This hash, which is used by primary_menu to generate sub-menus, is populated in
+the BEGIN block.
+
+=item @secondary_menu
+
+The elements of this array reference arrays that are made up of the components
+of those lines of mydesk.tab that start with scnd.
+It is used by secondary_menu() to generate the corresponding menu.
+It gets filled in the BEGIN block of this module.
+
+=back
+
+=head1 SUBROUTINES
+
+=over
+
+=item prep_menuitems(\@menuitem,$target,$listclass,$linkattr)
+
+This routine wraps a menuitem in proper HTML. It is used by primary_menu() and
+secondary_menu().
+
+=item primary_menu()
+
+This routine evaluates @primary_menu and returns a two item array,
+with the array elements containing XHTML for the left and right sides of
+the menu that contains the following links: About, Message, Roles, Help, Logout
+@primary_menu is filled within the BEGIN block of this module with
+entries from mydesk.tab
+
+=item secondary_menu()
+
+Same as primary_menu() but operates on @secondary_menu.
+
+=item create_submenu()
+
+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
+dropdown list when mouse hovers over top-level item. Support for IE6
+(no hover psuedo class) via LC_hoverable class for
tag for top-
+level item, which employs jQuery to handle behavior on mouseover.
+
+Inputs: 6 - (a) link and (b) target for anchor href in top level item,
+ (c) title for text wrapped by anchor tag in top level item,
+ (d) reference to array of arrays of sub-menu items,
+ (e) boolean to indicate whether to call &mt() to translate
+ name of menu item,
+ (f) optional class for element in primary menu, for which
+ sub menu is being generated.
+
+ The underlying datastructure used in (d) contains data from mydesk.tab.
+ It consists of an array which has an array for each item appearing in
+ the menu (e.g. [["link", "title", "condition"]] for a single-item menu).
+ create_submenu() supports also the creation of XHTML for nested dropdown
+ menus represented by unordered lists. This is done by replacing the
+ scalar used for the link with an arrayreference containing the menuitems
+ for the nested menu. This can be done recursively so that the next menu
+ may also contain nested submenus.
+
+ Example:
+ [ # begin of datastructure
+ ["/home/", "Home", "condition1"], # 1st item of the 1st layer menu
+ [ # 2nd item of the 1st layer menu
+ [ # anon. array for nested menu
+ ["/path1", "Path1", undef], # 1st item of the 2nd layer menu
+ ["/path2", "Path2", undef], # 2nd item of the 2nd layer menu
+ [ # 3rd item of the 2nd layer menu
+ [[...], [...], ..., [...]], # containing another menu layer
+ "Sub-Sub-Menu", # title for this container
+ undef
+ ]
+ ], # end of array/nested menu
+ "Sub-Menu", # title for the container item
+ undef
+ ] # end of 2nd item of the 1st layer menu
+]
+
+=item innerregister()
+
+This gets called in order to register a URL in the body of the document
+
+=item clear()
+
+=item switch()
+
+Switch a button or create a link
+Switch acts on the javascript that is executed when a button is clicked.
+The javascript is usually similar to "go('/adm/roles')" or "cstrgo(..)".
+
+=item secondlevel()
+
+=item openmenu()
+
+=item inlinemenu()
+
+=item rawconfig()
+
+=item utilityfunctions()
+
+Output from this routine is a number of javascript functions called by
+items in the inline menu, and in some cases items in the Main Menu page.
+
+=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::Constants qw(:common);
-use Apache::loncommon;
-use Apache::File;
-use vars qw(@desklines $readdesk);
+use Apache::lonhtmlcommon();
+use Apache::loncommon();
+use Apache::lonenc();
+use Apache::lonlocal;
+use Apache::lonmsg();
+use LONCAPA qw(:DEFAULT :match);
+use HTML::Entities();
+use Apache::lonwishlist();
+
+use vars qw(@desklines %category_names %category_members %category_positions
+ $readdesk @primary_menu %primary_submenu @secondary_menu %secondary_submenu);
+
+my @inlineremote;
+
+sub prep_menuitem {
+ my ($menuitem,$target,$listclass,$linkattr) = @_;
+ return '' unless(ref($menuitem) eq 'ARRAY');
+ my ($link,$targetattr);
+ if ($$menuitem[1]) { # graphical Link
+ $link = " ";
+ } else { # textual Link
+ $link = &mt($$menuitem[3]);
+ }
+ if ($target ne '') {
+ $targetattr = ' target="'.$target.'"';
+ }
+ return ($listclass?' ':' ').'$link |;
+}
+
+# primary_menu() evaluates @primary_menu and returns a two item array,
+# with the array elements containing XHTML for the left and right sides of
+# the menu that contains the following links:
+# Personal, 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 ($crstype,$ltimenu,$menucoll,$menuref,$links_disabled,$links_target,$collapsible) = @_;
+ my (%menu,%ltiexc,%menuopts);
+ # each element of @primary contains following array:
+ # (link url, icon path, alt text, link text, condition, position)
+ my $public;
+ if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public'))
+ || (($env{'user.name'} eq '') && ($env{'user.domain'} eq ''))) {
+ $public = 1;
+ }
+ my $rolecount;
+ if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) {
+ my $update=$env{'user.update.time'};
+ if (!$update) {
+ $update = $env{'user.login.time'};
+ }
+ my %roles_in_env;
+ $rolecount = &Apache::lonroles::roles_from_env(\%roles_in_env,$update);
+ }
+ my $lti;
+ if ($env{'request.lti.login'}) {
+ $lti = 1;
+ if (ref($ltimenu) eq 'HASH') {
+ foreach my $item ('fullname','logout') {
+ unless ($ltimenu->{$item}) {
+ $ltiexc{$item} = 1;
+ }
+ }
+ }
+ }
+ my ($listclass,$linkattr,$target);
+ if ($links_disabled) {
+ $listclass = 'LCisDisabled';
+ $linkattr = 'aria-disabled="true"';
+ }
+ if ($links_target ne '') {
+ $target = $links_target;
+ } else {
+ my ($ltitarget,$deeplinktarget);
+ if ($env{'request.lti.login'}) {
+ $ltitarget = $env{'request.lti.target'};
+ }
+ if ($env{'request.deeplink.login'}) {
+ $deeplinktarget = $env{'request.deeplink.target'};
+ }
+ if (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) {
+ $target = '_self';
+ } else {
+ $target = '_top';
+ }
+ }
+ if (($menucoll) && (ref($menuref) eq 'HASH')) {
+ %menuopts = %{$menuref};
+ }
+ foreach my $menuitem (@primary_menu) {
+ # evaluate conditions
+ next if ref($menuitem) ne 'ARRAY'; #
+ next if $$menuitem[4] eq 'nonewmsg' # show links depending on
+ && &Apache::lonmsg::mynewmail(); # whether a new msg
+ next if $$menuitem[4] eq 'newmsg' # arrived or not
+ && !&Apache::lonmsg::mynewmail(); #
+ next if $$menuitem[4] !~ /public/ ##we've a public user,
+ && $public; ##who should not see all
+ ##links
+ next if $$menuitem[4] eq 'onlypublic'# hide links which are
+ && !$public; # only visible to public
+ # users
+ next if $$menuitem[4] eq 'roles' ##show links depending on
+ && (&Apache::loncommon::show_course() ##term 'Courses' or
+ || $lti); ##'Roles' wanted
+ next if $$menuitem[4] eq 'courses' ##and not LTI access
+ && (!&Apache::loncommon::show_course()
+ || $lti);
+ next if $$menuitem[4] eq 'notlti'
+ && $lti;
+ next if $$menuitem[4] eq 'ltiexc'
+ && exists($ltiexc{lc($menuitem->[3])});
+ my $title = $menuitem->[3];
+ if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) {
+ if ($menuitem->[4] eq 'courses') {
+ next unless ($rolecount>1);
+ } else {
+ next unless (($title eq 'Personal') || ($title eq 'Logout'));
+ }
+ }
+ my $position = $menuitem->[5];
+ if ($position eq '') {
+ $position = 'right';
+ }
+ if ($env{'request.course.id'} && $menucoll) {
+ if (($menuitem->[6]) && (!$menuopts{$menuitem->[6]})) {
+ if ($menuitem->[6] eq 'pers') {
+ if ($menuopts{'name'} && !$ltiexc{'fullname'} &&
+ $env{'user.name'} && $env{'user.domain'}) {
+ $menu{$position} .= ''.
+ &Apache::loncommon::plainname($env{'user.name'},
+ $env{'user.domain'}).' ';
+ next;
+ } else {
+ next;
+ }
+ } else {
+ next;
+ }
+ }
+ }
+ if (defined($primary_submenu{$title})) {
+ my $link;
+ if ($menuitem->[0] ne '') {
+ $link = $menuitem->[0];
+ } else {
+ $link = '#';
+ }
+ my @primsub;
+ if (ref($primary_submenu{$title}) eq 'ARRAY') {
+ foreach my $item (@{$primary_submenu{$title}}) {
+ next if (($crstype eq 'Placement') && (!$env{'request.role.adv'}));
+ next if (($item->[2] eq 'wishlist') && (!$env{'user.adv'}));
+ next if ((($item->[2] eq 'portfolio') ||
+ ($item->[2] eq 'blog')) &&
+ (!&Apache::lonnet::usertools_access('','',$item->[2],
+ undef,'tools')));
+ if (($item->[2] eq 'browsepub') && ($item->[0] eq '/res/')) {
+ if ($env{'request.role'} =~ /^au\./) {
+ $item->[0] .= $env{'request.role.domain'}.'/?launch=1';
+ } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) {
+ $item->[0] .= $1.'/'.$2.'/?launch=1';
+ } elsif (&Apache::lonnet::allowed('bre',$env{'user.domain'})) {
+ $item->[0] .= $env{'user.domain'}.'/?launch=1';
+ } elsif (&Apache::lonnet::allowed('bro','/res/')) {
+ $item->[0] .= '?launch=1';
+ } else {
+ next;
+ }
+ }
+ if ($env{'request.course.id'} && $menucoll) {
+ next if ($item->[3]) && (!$menuopts{$item->[3]});
+ }
+ push(@primsub,$item);
+ }
+ if ($title eq 'Personal') {
+ if ($env{'user.name'} && $env{'user.domain'} && !$ltiexc{'fullname'}) {
+ unless (($env{'request.course.id'}) && ($menucoll) && (!$menuopts{'name'})) {
+ $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
+ }
+ }
+ next if (($env{'request.course.id'}) && ($menucoll) && ($title eq 'Personal') &&
+ (!@primsub));
+ if ($title eq 'Personal') {
+ $title = &mt($title);
+ }
+ } else {
+ $title = &mt($title);
+ }
+ if (@primsub > 0) {
+ $menu{$position} .= &create_submenu($link,$target,$title,\@primsub,1,undef,$listclass,$linkattr);
+ } elsif ($link) {
+ $menu{$position} .= ($listclass?'':' ').
+ ''.$title.' ';
+ }
+ }
+ } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink
+ next if ($crstype eq 'Placement');
+ if ($public) {
+ my $origmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
+ my $defdom = &Apache::lonnet::default_login_domain();
+ my $to = &Apache::loncommon::build_recipient_list(undef,
+ 'helpdeskmail',
+ $defdom,$origmail);
+ if ($to ne '') {
+ $menu{$position} .= &prep_menuitem($menuitem,$target,$listclass,$linkattr);
+ }
+ } else {
+ $menu{$position} .= ($listclass?'':' ').
+ &Apache::loncommon::top_nav_help('Help',$linkattr).
+ ' ';
+ }
+ } elsif ($$menuitem[3] eq 'Log In') {
+ if ($public) {
+ if (&Apache::lonnet::get_saml_landing()) {
+ $$menuitem[0] = '/adm/login';
+ }
+ }
+ $menu{$position} .= prep_menuitem($menuitem,$target,$listclass,$linkattr);
+ } else {
+ $menu{$position} .= prep_menuitem($menuitem,$target,$listclass,$linkattr);
+ }
+ }
+ my @output = ('','');
+ if ($menu{'left'} ne '') {
+ if ($collapsible) {
+ $menu{'left'} = ($listclass?'':' ').
+ ' '.$menu{'left'};
+ }
+ $output[0] = "";
+ }
+ if ($menu{'right'} ne '') {
+ $output[1] = "";
+ }
+ return @output;
+}
-# ======================================================= Make the menu buttons
+#returns hashref {user=>'',dom=>''} containing:
+# own name, domain if user is au
+# name, domain of parent author if user is ca or aa
+#empty return if user is not an author or not on homeserver
+#
+#TODO this should probably be moved somewhere more central
+#since it can be used by different parts of the system
+sub getauthor {
+ return unless $env{'request.role'}=~/^(ca|aa|au)/; #nothing to do if user isn't some kind of author
+
+ #co- or assistant author?
+ my ($dom, $user) = ($env{'request.role'} =~ /^(?:ca|aa)\.\/($match_domain)\/($match_username)$/)
+ ? ($1, $2) #domain, username of the parent author
+ : @env{ ('request.role.domain', 'user.name') }; #own domain, username
+
+ # current server == home server?
+ my $home = &Apache::lonnet::homeserver($user,$dom);
+ foreach (&Apache::lonnet::current_machine_ids()){
+ return {user => $user, dom => $dom} if $_ eq $home;
+ }
-sub menubuttons {
- my $forcereg=shift;
- my $target =shift;
- unless ($ENV{'browser.interface'} eq 'textual') { return ''; }
- return "Menu here ";
+ # if wrong server
+ return;
}
-# ============================================== Register a URL with the remote
-
+sub secondary_menu {
+ my ($httphost,$ltiscope,$ltimenu,$noprimary,$menucoll,$menuref,
+ $links_disabled,$links_target) = @_;
+ my $menu;
+
+ my $crstype = &Apache::loncommon::course_type();
+ my $crs_sec = $env{'request.course.id'} . ($env{'request.course.sec'}
+ ? "/$env{'request.course.sec'}"
+ : '');
+ my $canedit = &Apache::lonnet::allowed('mdc', $env{'request.course.id'});
+ my $canvieweditor = &Apache::lonnet::allowed('cev', $env{'request.course.id'});
+ my $canviewroster = $env{'course.'.$env{'request.course.id'}.'.student_classlist_view'};
+ if ($canviewroster eq 'disabled') {
+ undef($canviewroster);
+ }
+ my $canviewgrps = &Apache::lonnet::allowed('vcg', $crs_sec);
+ my $canmodifyuser = &Apache::lonnet::allowed('cst', $crs_sec);
+ my $canviewusers = &Apache::lonnet::allowed('vcl', $crs_sec);
+ my $canviewwnew = &Apache::lonnet::allowed('whn', $crs_sec);
+ my $canviewpara = &Apache::lonnet::allowed('vpa', $crs_sec);
+ my $canmodpara = &Apache::lonnet::allowed('opa', $crs_sec);
+ my $canvgr = &Apache::lonnet::allowed('vgr', $crs_sec);
+ my $canmgr = &Apache::lonnet::allowed('mgr', $crs_sec);
+ my $canplc = &Apache::lonnet::allowed('plc', $crs_sec);
+ my $author = &getauthor();
+
+ my ($is_author,$is_coauthor);
+ if ($author) {
+ if ($env{'request.role'} =~ /^au\./) {
+ $is_author = 1;
+ } elsif ($env{'request.role'} =~ /^ca\./) {
+ $is_coauthor = 1;
+ }
+ }
-sub registerurl {
- my $forcereg=shift;
- my $target = shift;
- my $result = '';
-
- if ($target eq 'edit') {
- $result .="\n";
- }
- if (($ENV{'browser.interface'} eq 'textual') ||
- ((($ENV{'request.publicaccess'}) ||
- (!&Apache::lonnet::is_on_map($ENV{'REQUEST_URI'}))) &&
- (!$forcereg))) {
- return $result.
- '';
- }
- if ($Apache::lonxml::registered && !$forcereg) { return ''; }
- $Apache::lonxml::registered=1;
- my $reopen=&Apache::lonmenu::reopenmenu();
- my $newmail='';
- if (&Apache::lonmsg::newmail()) {
- $newmail='swmenu.setstatus("you have","messages");';
- }
- my $timesync='swmenu.syncclock(1000*'.time.');';
- if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
- my $hwkadd='';
- if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
- if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
- $hwkadd.=(<
-// BEGIN LON-CAPA Internal
-
- function LONCAPAreg() {
- swmenu=$reopen;
- swmenu.clearTimeout(swmenu.menucltim);
- $timesync
- $newmail
- swmenu.currentURL=window.location.pathname;
- swmenu.reloadURL=window.location.pathname;
- swmenu.currentSymb="$ENV{'request.symb'}";
- swmenu.reloadSymb="$ENV{'request.symb'}";
- swmenu.currentStale=0;
- swmenu.clearbut(3,1);
- swmenu.switchbutton
- (6,3,'catalog.gif','catalog','info','catalog_info()','Show catalog information');
- swmenu.switchbutton
- (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)','Provide my evaluation of this resource');
- swmenu.switchbutton
- (8,2,'fdbk.gif','feedback','discuss','gopost("/adm/feedback",currentURL)','Provide feedback messages or contribute to the course discussion about this resource');
- swmenu.switchbutton
- (8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)','Prepare a printable document');
- swmenu.switchbutton
- (2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)','Go to the previous resource in the course sequence');
- swmenu.switchbutton
- (2,3,'forw.gif','forward','','gopost("/adm/flip","forward:"+currentURL)','Go to the next resource in the course sequence');
- swmenu.switchbutton
- (9,1,'sbkm.gif','set','bookmark','set_bookmark()','Set a bookmark for this resource');
- swmenu.switchbutton
- (9,2,'vbkm.gif','view','bookmark','edit_bookmarks()','Use or edit my bookmark collection');
- swmenu.switchbutton
- (9,3,'anot.gif','anno-','tations','annotate()','Make notes and annotations about this resource');
- $hwkadd
- $editbutton
- }
-
- function LONCAPAstale() {
- swmenu=$reopen
- swmenu.currentStale=1;
- if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) {
- swmenu.switchbutton
- (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');
- }
- swmenu.clearbut(7,1);
- swmenu.clearbut(7,2);
- swmenu.clearbut(7,3);
- swmenu.menucltim=swmenu.setTimeout(
- 'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
- 'clearbut(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3);clearbut(6,1)',
- 2000);
-
- }
+ if ($env{'request.course.feeds'}) {
+ $showfeeds = 1;
+ }
+ }
+ unless ($canmgr || $canvgr) {
+ my %slots = &Apache::lonnet::get_course_slots($cnum,$cdom);
+ if (keys(%slots) > 0) {
+ $showresv = 1;
+ }
+ }
+ if ($env{'request.course.groups'} ne '') {
+ foreach my $group (split(/:/,$env{'request.course.groups'})) {
+ next unless ($group =~ /^\w+$/);
+ my @privs = split(/:/,$env{"user.priv.$env{'request.role'}./$cdom/$cnum/$group"});
+ shift(@privs);
+ if (@privs) {
+ $grouptools ++;
+ }
+ }
+ }
+ if ($env{'request.lti.login'}) {
+ $lti = 1;
+ if (ref($ltimenu) eq 'HASH') {
+ foreach my $item ('fullname','coursetitle','role','logout','grades') {
+ unless ($ltimenu->{$item}) {
+ $ltiexc{$item} = 1;
+ }
+ }
+ }
+ if (($ltiscope eq 'map') || ($ltiscope eq 'resource')) {
+ $ltimapres = 1;
+ }
+ }
+ }
+ if (($menucoll) && (ref($menuref) eq 'HASH')) {
+ %menuopts = %{$menuref};
+ }
-// END LON-CAPA Internal
-
-ENDREGTHIS
+ my ($listclass,$linkattr,$target);
+ if ($links_disabled) {
+ $listclass = 'LCisDisabled';
+ $linkattr = 'aria-disabled="true"';
+ }
+ my ($canlistcoauthors,$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;
+ }
+ } elsif ($env{'request.role'} =~ m{^(aa|ca)\./($match_domain/$match_username)$}) {
+ my ($role,$extent) = ($1,$2);
+ if (&Apache::lonnet::allowed('vca',$extent)) {
+ if ($env{"environment.internal.manager./$extent"}) {
+ $canmodifycoauthor = 1;
+ } else {
+ $canlistcoauthors = 1;
+ }
+ } elsif (&Apache::lonnet::allowed('vaa',$extent)) {
+ $canlistcoauthors = 1;
+ }
+ }
+ my ($roleswitcher_js,$roleswitcher_form);
+ if ($links_target ne '') {
+ $target = $links_target;
} else {
- $result = (<
-// BEGIN LON-CAPA Internal
+ my ($ltitarget,$deeplinktarget);
+ if ($env{'request.lti.login'}) {
+ $ltitarget = $env{'request.lti.target'};
+ }
+ if ($env{'request.deeplink.login'}) {
+ $deeplinktarget = $env{'request.deeplink.target'};
+ }
+ if (($ltitarget eq 'iframe') || ($deeplinktarget eq '_self')) {
+ $target = '_self';
+ } else {
+ $target = '_top';
+ }
+ }
- function LONCAPAreg() {
- swmenu=$reopen
- $timesync
- swmenu.currentStale=1;
- swmenu.clearbut(2,1);
- swmenu.clearbut(2,3);
- swmenu.clearbut(8,1);
- swmenu.clearbut(8,2);
- swmenu.clearbut(8,3);
- if (swmenu.currentURL) {
- swmenu.switchbutton
- (3,1,'reload.gif','return','location','go(currentURL)');
- } else {
- swmenu.clearbut(3,1);
- }
+ foreach my $menuitem (@secondary_menu) {
+ # evaluate conditions
+ next if ref($menuitem) ne 'ARRAY';
+ next if (($crstype eq 'Placement') && ($$menuitem[3] ne 'Roles') && (!$env{'request.role.adv'}));
+ next if $$menuitem[4] ne 'always'
+ && $$menuitem[4] ne 'coauthor'
+ && $$menuitem[4] ne 'author'
+ && $$menuitem[4] ne 'authorspace'
+ && $$menuitem[4] ne 'vca'
+ && $$menuitem[4] ne 'mca'
+ && !$env{'request.course.id'};
+ next if $$menuitem[4] =~ /^crsedit/
+ && (!$canedit && !$canvieweditor);
+ next if $$menuitem[4] eq 'crseditCourse'
+ && ($crstype eq 'Community');
+ next if $$menuitem[4] eq 'crseditCommunity'
+ && ($crstype ne 'Community');
+ next if $$menuitem[4] eq 'nvgr'
+ && ($canvgr || $ltiexc{'grades'});
+ next if $$menuitem[4] eq 'vgr'
+ && !$canvgr;
+ next if $$menuitem[4] eq 'viewusers'
+ && !$canmodifyuser && !$canviewusers;
+ next if $$menuitem[4] eq 'noviewusers'
+ && ($canmodifyuser || $canviewusers || !$canviewroster);
+ next if $$menuitem[4] eq 'mgr'
+ && !$canmgr;
+ next if $$menuitem[4] eq 'showresv'
+ && !$showresv;
+ next if $$menuitem[4] eq 'whn'
+ && !$canviewwnew;
+ next if $$menuitem[4] eq 'params'
+ && (!$canmodpara && !$canviewpara);
+ next if $$menuitem[4] eq 'showgroups'
+ && ($canviewgrps || !$grouptools);
+ next if $$menuitem[4] eq 'showsyllabus'
+ && !$showsyllabus;
+ next if $$menuitem[4] eq 'showfeeds'
+ && !$showfeeds;
+ next if $$menuitem[4] eq 'plc'
+ && !$canplc;
+ next if $$menuitem[4] eq 'authorspace'
+ && !$author;
+ next if $$menuitem[4] eq 'author'
+ && !$is_author;
+ next if $$menuitem[4] eq 'coauthor'
+ && !$is_coauthor;
+ next if $$menuitem[4] eq 'vca'
+ && (!$canlistcoauthors || $canmodifycoauthor);
+ next if $$menuitem[4] eq 'vaa'
+ && (!$canlistcoauthors || $canmodifycoauthor);
+ next if $$menuitem[4] eq 'mca'
+ && !$canmodifycoauthor;
+ next if $$menuitem[4] eq 'notltimapres'
+ && $ltimapres;
+ next if $$menuitem[4] eq 'notlti'
+ && $lti;
+ next if $$menuitem[4] eq 'lti'
+ && (!$lti || !$noprimary);
+ next if $$menuitem[3] eq 'Logout'
+ && $ltiexc{'logout'};
+
+ my $title = $menuitem->[3];
+ if ($env{'request.course.id'} && $menucoll) {
+ unless ($$menuitem[5] eq 'roles') {
+ next if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]}));
+ }
+ }
+ if (defined($secondary_submenu{$title})) {
+ my $link;
+ if ($menuitem->[0] ne '') {
+ $link = $menuitem->[0];
+ } 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 'vpa' && !$canviewpara);
+ next if ($item->[2] eq 'viewusers' && !($canmodifyuser || $canviewusers));
+ next if ($item->[2] eq 'mgr' && !$canmgr);
+ next if ($item->[2] eq 'vcg' && !$canviewgrps);
+ next if ($item->[2] eq 'crsedit' && !$canedit && !$canvieweditor);
+ next if ($item->[2] eq 'params' && !$canmodpara && !$canviewpara);
+ next if ($item->[2] eq 'author' && !$is_author);
+ next if ($item->[2] eq 'vca' && !$canlistcoauthors);
+ next if ($item->[2] eq 'lti' && !$lti);
+ if ($item->[2] =~ /^lti(portfolio|wishlist|blog)$/) {
+ my $tool = $1;
+ next if !$lti;
+ next if (!&Apache::lonnet::usertools_access('','',$tool,
+ undef,'tools'));
+ }
+ push(@scndsub,$item);
+ }
+ }
+ if ($title eq 'Personal' && $env{'user.name'} && $env{'user.domain'}) {
+ unless ($ltiexc{'fullname'}) {
+ $title = &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'});
+ }
+ }
+ if (@scndsub > 0) {
+ $menu .= &create_submenu($link,$target,&mt($title),\@scndsub,1,undef,
+ $listclass,$linkattr);
+ } elsif ($link ne '#') {
+ $menu .= ($listclass?'':' ').
+ ''.
+ &mt($title).' ';
+ }
+ }
+ } elsif ($$menuitem[3] eq 'Roles' && $env{'request.course.id'}) {
+ # special treatment for role selector
+ my ($switcher,$has_opa_priv);
+ ($roleswitcher_js,$roleswitcher_form,$switcher,$has_opa_priv) =
+ &roles_selector(
+ $env{'course.' . $env{'request.course.id'} . '.domain'},
+ $env{'course.' . $env{'request.course.id'} . '.num'},
+ $httphost,$target,$menucoll,$menuref
+ );
+ if (($$menuitem[5]) && (!$menuopts{$$menuitem[5]})) {
+ next unless ($has_opa_priv);
+ }
+ $menu .= $switcher;
+ } elsif ($$menuitem[3] eq 'Help') { # special treatment for helplink
+ next if ($crstype eq 'Placement');
+ $menu .= ''.&Apache::loncommon::top_nav_help('Help').' ';
+ } 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] .= (($$menuitem[0]=~/\?/)? '&' : '?').'register=1';
+ }
+ } else {
+ $$menuitem[0] =~ s{\&?register=1}{};
+ }
+ if ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://}) {
+ if (($ENV{'SERVER_PORT'} == 443) || ($env{'request.use_absolute'} =~ m{^https://})) {
+ unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) {
+ unless ($$menuitem[0] =~ m{^https?://}) {
+ $$menuitem[0] = 'http://'.$ENV{'SERVER_NAME'}.$$menuitem[0];
+ }
+ unless ($$menuitem[0] =~ /(\&|\?)usehttp=1/) {
+ $$menuitem[0] .= (($$menuitem[0]=~/\?/) ? '&' : '?').'usehttp=1';
+ }
+ }
+ }
+ }
+ $$menuitem[0] = &HTML::Entities::encode($$menuitem[0],'&<>"');
+ }
+ $menu .= &prep_menuitem(\@$menuitem,$target,$listclass,$linkattr);
+ }
+ }
+ 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'})))
+ {
+ my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
+ ($escurl = $env{'request.filename'}) =~ s{^\Q$londocroot\E}{};
+ $escurl = &escape($escurl);
+ }
+ $menu =~ s/\[url\]/$escurl/g;
+ $menu =~ s/\[symb\]/$escsymb/g;
+ } elsif (($menu =~ m{/adm/preferences\?}) && ($menu =~ /\[returnurl\]/)) {
+ my $returnurl = $ENV{'REQUEST_URI'};
+ if ($ENV{'REQUEST_URI'} =~ m{/adm/preferences\?action=authorsettings\&returnurl=([^\&]+)$}) {
+ $returnurl = $1;
+ }
+ if (($returnurl =~ m{^/adm/createuser($|\?action=)}) ||
+ ($returnurl =~ m{^/priv/$match_domain/$match_username}) ||
+ ($returnurl =~ m{^/res(/?$|/$match_domain/$match_username)})) {
+ $returnurl =~ s{\?.*$}{};
+ $returnurl = '&returnurl='.&HTML::Entities::encode($returnurl,'"<>&\'');
+ } else {
+ undef($returnurl);
+ }
+ $menu =~ s/\[returnurl\]/$returnurl/;
}
+ $menu =~ s/\[uname\]/$$author{user}/g;
+ $menu =~ s/\[udom\]/$$author{dom}/g;
+ $menu =~ s/\[javascript\]/javascript:/g;
+ if ($env{'request.course.id'}) {
+ $menu =~ s/\[cnum\]/$cnum/g;
+ $menu =~ s/\[cdom\]/$cdom/g;
+ }
+ if ($menu) {
+ $menu = "";
+ }
+ if ($roleswitcher_form) {
+ $menu .= "\n$roleswitcher_js\n$roleswitcher_form";
+ }
+ return $menu;
+}
- function LONCAPAstale() {
+sub create_submenu {
+ my ($link,$target,$title,$submenu,$translate,$addclass,$listclass,$linkattr) = @_;
+ return unless (ref($submenu) eq 'ARRAY');
+ my $targetattr;
+ if (($target ne '') && ($link ne '#')) {
+ $targetattr = ' target="'.$target.'"';
+ }
+ my $menu = ''.
+ ''.
+ ''.$title.
+ ''.
+ ' ▼ '.
+ '';
+
+ # $link and $title are only used in the initial string written in $menu
+ # as seen above, not needed for nested submenus
+ $menu .= &build_submenu($target, $submenu, $translate, '1', $listclass, $linkattr);
+ $menu .= ' ';
+
+ return $menu;
+}
+
+# helper routine for create_submenu
+# build the dropdown (and nested submenus) recursively
+# see perldoc create_submenu documentation for further information
+sub build_submenu {
+ my ($target, $submenu, $translate, $first_level, $listclass, $linkattr) = @_;
+ unless (@{$submenu}) {
+ return '';
}
-// END LON-CAPA Internal
-
-ENDDONOTREGTHIS
+ my $menu = '';
+ my $count = 0;
+ my $numsub = scalar(@{$submenu});
+ foreach my $item (@{$submenu}) {
+ $count ++;
+ if (ref($item) eq 'ARRAY') {
+ my $href = $item->[0];
+ my $bordertop;
+ my $borderbot;
+ my $title;
+
+ if ($translate) {
+ $title = &mt($item->[1]);
+ } else {
+ $title = $item->[1];
+ }
+
+ if ($count == 1 && !$first_level) {
+ $bordertop = 'border-top: 1px solid black;';
+ }
+ if ($count == $numsub) {
+ $borderbot = 'border-bottom: 1px solid black;';
+ }
+
+ # href is a reference to another submenu
+ if (ref($href) eq 'ARRAY') {
+ $menu .= '';
+ $menu .= '
';
+ $menu .= '';
+ $menu .= &build_submenu($target, $href, $translate);
+ $menu .= ' ';
+ $menu .= ' ';
+ } else { # href is the actual hyperlink and does not represent another submenu
+ # for the current menu title
+ 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;
+ } elsif (($href =~ m{^/adm/preferences\?}) && ($href =~ /\[returnurl\]/)) {
+ my $returnurl = $ENV{'REQUEST_URI'};
+ if ($ENV{'REQUEST_URI'} =~ m{/adm/preferences\?action=(?:changedomcoord|authorsettings)\&returnurl=([^\&]+)$}) {
+ $returnurl = $1;
+ }
+ if (($returnurl =~ m{^/adm/createuser($|\?action=)}) ||
+ ($returnurl =~ m{^/priv/$match_domain/$match_username}) ||
+ ($returnurl =~ m{^/res(/?$|/$match_domain/$match_username)})) {
+ $returnurl =~ s{\?.*$}{};
+ $returnurl = '&returnurl='.&HTML::Entities::encode($returnurl,'"<>&\'');
+ } else {
+ undef($returnurl);
+ }
+ $href =~ s/\[returnurl\]/$returnurl/;
+ }
+ my $targetattr;
+ unless (($href eq '') || ($href =~ /^\#/)) {
+ if ($target ne '') {
+ $targetattr = ' target="'.$target.'"';
+ }
+ }
+
+ $menu .= '';
+ $menu .= '' . $title . ' ';
+ $menu .= ' ';
+ }
+ }
}
- return $result;
+ return $menu;
}
-sub loadevents() {
- return 'LONCAPAreg();';
-}
+sub innerregister {
+ my ($forcereg,$bread_crumbs,$group,$pagebuttonshide,$hostname,
+ $ltiscope,$ltiuri,$showncrumbsref) = @_;
+ my $const_space = ($env{'request.state'} eq 'construct');
+ my $in_daxe = 0;
-sub unloadevents() {
- return 'LONCAPAstale();';
-}
+ if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { return ''; }
+
+ $env{'request.registered'} = 1;
-# ============================================================= Start up remote
+ undef(@inlineremote);
-sub startupremote {
- my ($lowerurl)=@_;
- if ($ENV{'browser.interface'} eq 'textual') {
- return (' ');
+ my ($mapurl,$resurl,$crstype,$navmap);
+
+ if ($env{'request.course.id'}) {
+#
+#course_type: Course, Community, or Placement
+#
+ $crstype = &Apache::loncommon::course_type();
+ if ($env{'request.symb'}) {
+ my $ignorenull;
+ unless ($env{'request.noversionuri'} eq '/adm/navmaps') {
+ $ignorenull = 1;
+ }
+ my $symb = &Apache::lonnet::symbread('','',$ignorenull);
+ ($mapurl, my $rid, $resurl) = &Apache::lonnet::decode_symb($symb);
+ my $coursetitle = $env{'course.'.$env{'request.course.id'}.'.description'};
+
+ my $maptitle = &Apache::lonnet::gettitle($mapurl);
+ my $restitle = &Apache::lonnet::gettitle($symb);
+ my (@crumbs,@mapcrumbs);
+ if (($env{'request.noversionuri'} ne '/adm/navmaps') && ($mapurl ne '') &&
+ (!(($crstype eq 'Placement') && !$env{'request.role.adv'}))) {
+ unless ($ltiscope eq 'resource') {
+ if (($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) &&
+ !(($ltiscope eq 'map') && (&Apache::lonnet::clutter($resurl) eq $ltiuri))) {
+ $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ @mapcrumbs = $navmap->recursed_crumbs($mapurl,$restitle);
+ }
+ }
+ }
+ }
+ unless ((($crstype eq 'Placement') && (!$env{'request.role.adv'})) ||
+ ($ltiscope eq 'map') || ($ltiscope eq 'resource')) {
+ @crumbs = ({text => $crstype.' Contents',
+ href => "Javascript:gopost('/adm/navmaps','')"});
+ }
+ if ($mapurl ne $env{'course.'.$env{'request.course.id'}.'.url'}) {
+ if (@mapcrumbs) {
+ push(@crumbs,@mapcrumbs);
+ } elsif (!(($crstype eq 'Placement') && (!$env{'request.role.adv'})) &&
+ ($ltiscope ne 'map') && ($ltiscope ne 'resource')) {
+ push(@crumbs, {text => '...',
+ no_mt => 1});
+ }
+ }
+
+ unless ((($crstype eq 'Placement') && (!$env{'request.role.adv'})) || (@mapcrumbs) ||
+ (!$maptitle) || ($maptitle eq 'default.sequence') ||
+ ($mapurl eq $env{'course.'.$env{'request.course.id'}.'.url'}) ||
+ ($ltiscope eq 'resource')) {
+ push @crumbs, {text => $maptitle, no_mt => 1,
+ href => &Apache::lonnet::clutter($mapurl).'?navmap=1'};
+ }
+ if ($restitle && !@mapcrumbs) {
+ push(@crumbs,{text => $restitle, no_mt => 1});
+ }
+ my @tools;
+ if ($env{'request.filename'} =~ /\.page$/) {
+ my %breadcrumb_tools = &Apache::lonhtmlcommon::current_breadcrumb_tools();
+ if (ref($breadcrumb_tools{'tools'}) eq 'ARRAY') {
+ @tools = @{$breadcrumb_tools{'tools'}};
+ }
+ }
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ &Apache::lonhtmlcommon::add_breadcrumb(@crumbs);
+ if (@tools) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',@tools);
+ }
+ } else {
+ $resurl = $env{'request.noversionuri'};
+ my $courseurl = &Apache::lonnet::courseid_to_courseurl($env{'request.course.id'});
+ 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,$cnum,$cdom);
+ if ($env{'form.folderpath'}) {
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ &Apache::loncommon::validate_folderpath(1,'',$cnum,$cdom);
+ }
+ if ($env{'form.folderpath'}) {
+ &prepare_functions($resurl,$forcereg,$group,undef,undef,1,$hostname);
+ $title = &HTML::Entities::encode($title,'\'"<>&');
+ ($trail) =
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,1);
+ } else {
+ &Apache::lonhtmlcommon::add_breadcrumb(
+ {text => "Supplemental $crstype Content",
+ href => "javascript:gopost('/adm/supplemental','')"});
+ $title = &HTML::Entities::encode(&mt('View Resource'),'\'"<>&');
+ ($trail) =
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,1);
+ }
+ if (ref($showncrumbsref)) {
+ $$showncrumbsref = 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,$hostname);
+ $title = &HTML::Entities::encode(&mt('Syllabus File'),'\'"<>&');
+ my ($trail) =
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,1);
+ if (ref($showncrumbsref)) {
+ $$showncrumbsref = 1;
+ }
+ return $trail;
+ } elsif (($resurl eq '/public'.$courseurl.'/syllabus') &&
+ ($env{'form.folderpath'})) {
+ if ($env{'form.title'}) {
+ $title = $env{'form.title'};
+ } else {
+ $title = 'Syllabus';
+ }
+ &prepare_functions($resurl,$forcereg,$group,undef,undef,1,$hostname);
+ $title = &HTML::Entities::encode($title,'\'"<>&');
+ my ($trail) =
+ &Apache::lonhtmlcommon::docs_breadcrumbs(undef,$crstype,undef,$title,1,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
+ #course or construction space (e.g. with cumulative rights)
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ unless ($env{'request.noversionuri'} =~ m{^/adm/$match_domain/$match_username/aboutme$}) {
+ &Apache::lonhtmlcommon::add_breadcrumb({text => 'View Resource'});
+ }
+ }
+# =============================================================================
+# ============================ This is for URLs that actually can be registered
+ return '' unless ( ($env{'request.noversionuri'}!~m{^/(res/)*adm/})
+ || $forcereg );
+ my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,
+ $forceview,$editbutton);
+ if (($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) ||
+ ($env{'request.role'} !~/^(aa|ca|au)/)) {
+ $editbutton = &prepare_functions($resurl,$forcereg,$group,'','','',$hostname);
+ }
+ if ($editbutton eq '') {
+ $editbutton = &clear(6,1);
}
- my $configmenu=&rawconfig();
- return(<
-function wheelswitch() {
- if (window.status=='|') {
- window.status='/';
- } else {
- if (window.status=='/') {
- window.status='-';
- } else {
- if (window.status=='-') {
- window.status='\\\\';
- } else {
- if (window.status=='\\\\') { window.status='|'; }
- }
- }
- }
-}
+#
+# This applies in course context
+#
+ if ($env{'request.course.id'}) {
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+ $perms{'cev'} = &Apache::lonnet::allowed('cev',$env{'request.course.id'});
+ my @privs;
+ my $gradable_exttool;
+ if ($env{'request.symb'} ne '') {
+ if ($env{'request.noversionuri'} =~ m{^/adm/$cdom/$cnum/(\d+)/ext\.tool$}) {
+ if (&Apache::lonnet::EXT('resource.0.gradable') =~ /^yes$/i) {
+ $gradable_exttool = 1;
+ push(@privs,('mgr','vgr'));
+ }
+ } elsif ($env{'request.filename'}=~/$LONCAPA::assess_re/) {
+ push(@privs,('mgr','vgr'));
+ }
+ push(@privs,('opa','vpa'));
+ }
+ 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
+#
+ if (($env{'request.symb'} ne '') &&
+ (($env{'request.filename'}=~/$LONCAPA::assess_re/) || ($gradable_exttool))) {
+ if ($perms{'mgr'}) {
+ &switch('','',7,2,'pgrd.png','Content Grades','grades[_4]',
+ "gocmd('/adm/grades','gradingmenu')",
+ 'Grading for Resource/Folder');
+ } elsif ($perms{'vgr'}) {
+ &switch('','',7,2,'subm.png','Content Submissions','missions[_1]',
+ "gocmd('/adm/grades','submission')",
+ 'Submissions for Resource/Folder');
+ }
+ }
+ if (($env{'request.symb'} ne '') && (($perms{'opa'}) || ($perms{'vpa'}))) {
+ &switch('','',7,3,'pparm.png','Content Settings','parms[_2]',
+ "gocmd('/adm/parmset','set')",
+ 'Content Settings for Resource/Folder');
+ }
+# End grades/submissions check
-// ---------------------------------------------------------- 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 {
- alert("Remote Control timed out. It is possible that it was blocked by pop-up window filters.");
- }
- } else {
- wheelswitch();
- setTimeout('wait();',200);
- }
-}
+#
+# This applies to items inside a folder/page modifiable in the course.
+#
+ if (($env{'request.symb'}=~/^uploaded/) && (($perms{'mdc'}) || ($perms{'cev'}))) {
+ my $text = 'Edit Folder';
+ if (($mapurl =~ /\.page$/) ||
+ ($env{'request.symb'}=~
+ m{uploaded/$cdom/$cnum/default_\d+\.page$})) {
+ $text = 'Edit Page';
+ }
+ &switch('','',7,4,'docs-22x22.png',$text,'parms[_2]',
+ "gocmd('/adm/coursedocs','direct')",
+ 'Folder/Page Content');
+ }
+# End modifiable folder/page container check
-function main() {
- canceltim=setTimeout('tim=1;',60000);
- window.status='-';
- wait();
-}
+#
+# Determine whether to show View As button for shortcut to display problem, answer, and submissions
+#
-
-ENDREMOTESTARTUP
-}
+ if (($env{'request.symb'} ne '') &&
+ ($env{'request.filename'}=~/$LONCAPA::assess_re/) &&
+ (($perms{'mgr'}) || ($perms{'vgr'}))) {
+ my ($viewas,$text,$change,$visibility,$vuname,$vudom,$vid,$leftvis,$rightvis,
+ $defdom,$domselector,$righticon);
+ my %lt = &Apache::lonlocal::texthash(
+ view => 'View',
+ upda => 'Update',
+ user => 'View as user',
+ choo => 'Choose user',
+ );
+ my $possdomstr = $env{'course.'.$env{'request.course.id'}.'.internal.userdomains'};
+ if ($possdomstr =~ /,/) {
+ my @possdoms = split(/,/,$possdomstr);
+ if ($env{'request.user_in_effect'} =~ /^$match_username:($match_domain)$/) {
+ $defdom = $1;
+ } elsif (grep(/^\Q$cdom\E$/,@possdoms)) {
+ $defdom = $cdom;
+ } elsif (&Apache::lonnet::domain($possdoms[0]) ne '') {
+ $defdom = $possdoms[0];
+ }
+ $domselector = &Apache::loncommon::select_dom_form($defdom,'vudom','','','',
+ \@possdoms,'','','vudom').
+ ''.
+ &mt("user's domain").' ';
+ } elsif (($possdomstr ne '') && (&Apache::lonnet::domain($possdomstr) ne '')) {
+ if ($env{'request.user_in_effect'} =~ /^$match_username:($match_domain)$/) {
+ $defdom = $1;
+ } else {
+ $defdom = $possdomstr;
+ }
+ }
+ if ($env{'request.user_in_effect'} =~ /^($match_username):($match_domain)$/) {
+ ($vuname,$vudom) = ($1,$2);
+ unless (&Apache::lonnet::is_advanced_user($vudom,$vuname)) {
+ $vid = (&Apache::lonnet::idrget($vudom,$vuname))[1];
+ }
+ $viewas = $env{'request.user_in_effect'};
+ $text = $lt{'upda'};
+ $change = 'off';
+ $visibility = 'inline';
+ $leftvis = 'none';
+ $rightvis = 'inline';
+ $defdom = $vudom;
+ $righticon = '✖';
+ } else {
+ $text = $lt{'view'};
+ $change = 'on';
+ $visibility = 'none';
+ $leftvis = 'inline';
+ $rightvis = 'none';
+ $righticon = '◄';
+ if ($defdom eq '') {
+ $defdom = $cdom;
+ }
+ }
+ my $sellink = &Apache::loncommon::selectstudent_link('userview','vuname','vudom','','','vuidentifier');
+ my $selscript=&Apache::loncommon::studentbrowser_javascript();
+ my $shownsymb = &HTML::Entities::encode(&Apache::lonenc::check_encrypt($env{'request.symb'}),'<>&"');
+ my $input;
+ my @items = (
+ ' ',
+ ' ',
+ ' ',
+ ' '
+ );
+ if ($domselector) {
+ push(@items,$domselector);
+ $input = &mt('[_1]User:[_2] or [_3]ID:[_4] at [_5] | ',@items);
+ } else {
+ $input = &mt('[_1]Username:[_2] or [_3]ID:[_4] | ',@items).
+ ' ';
+ }
+ $input .= ' ',
+ ' ';
+ my $chooser = <
+$lt{'user'}
+
+$selscript
+
+
+
+$lt{'choo'}
+
+
+
+END
+ &switch('','',7,5,'viewuser.png','View As','user[_1]',
+ 'toggleViewAsUser('."'$change'".')',
+ 'View resource as user','','',$chooser);
+ }
+# End view as user check
-sub setflags() {
- return(<
- menuloaded=0;
- tim=0;
-
-ENDSETFLAGS
+ }
+# End course context
+
+# Prepare the rest of the buttons
+ my ($menuitems,$got_prt,$got_wishlist,$crsauthor,$toplevel_cstr,$crsauthor_cstr);
+ if ($const_space) {
+#
+# We are in construction space
+#
+
+ my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
+ my ($udom,$uname,$thisdisfn) =
+ ($env{'request.filename'}=~m{^\Q$londocroot/priv/\E([^/]+)/([^/]+)/(.*)$});
+ if (($env{'request.course.id'}) &&
+ ($env{'course.'.$env{'request.course.id'}.'.num'} eq $uname) &&
+ ($env{'course.'.$env{'request.course.id'}.'.domain'} eq $udom)) {
+ $crsauthor_cstr = 1;
+ }
+ my $currdir = '/priv/'.$udom.'/'.$uname.'/'.$thisdisfn;
+ if ($currdir =~ m-/$-) {
+ if ($thisdisfn eq '') {
+ $toplevel_cstr = 1;
+ }
+ my $esc_currdir = &Apache::loncommon::escape_single($currdir);
+ $menuitems=(<new();
+ if (ref($navmap)) {
+ my $mapres = $navmap->getResourceByUrl($ltiuri);
+ if (ref($mapres)) {
+ if ($navmap->isLastResource($mapres,$env{'request.symb'})) {
+ $showforw = 0;
+ }
+ if ($navmap->isFirstResource($mapres,$env{'request.symb'})) {
+ $showback = 0;
+ }
+ }
+ }
+ if ($showback) {
+ $menuitems.="
+s&2&1&back.png&&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1";
+ }
+ if ($showforw) {
+ $menuitems.="
+s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3";
+ }
+ } elsif (($crstype ne 'Placement') || ($env{'request.role.adv'})) {
+ $menuitems.="
+s&2&1&back.png&&&gopost('/adm/flip','back:'+currentURL)&Previous content resource&&1
+s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3";
+ } else {
+# Suppress display of backward arrow for Placement Tests
+# Suppress display of forward arrow for Placement Tests if this is the last resource.
+ my $showforw = 1;
+ if ($env{'request.symb'}) {
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ if (&Apache::lonplacementtest::is_lastres($env{'request.symb'},$navmap)) {
+ $showforw = 0;
+ }
+ }
+ }
+ if ($showforw) {
+ $menuitems.="
+s&2&3&forw.png&&&gopost('/adm/flip','forward:'+currentURL)&Next content resource&&3";
+ }
+ }
+ $menuitems .= (< 0){
+ $menuitems.="anot2.png";
+}else{
+ $menuitems.="anot.png";
+}
+$menuitems.="&Notes&&annotate()&";
+$menuitems.="Make notes and annotations about this resource&&1\n";
+my $is_mobile;
+if ($env{'browser.mobile'}) {
+ $is_mobile = 1;
+}
+
+ 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/|default_\d+\.page$)}) &&
+ ($env{'request.noversionuri'} !~ m{^/adm/.+/ext\.tool$})) {
+ $menuitems.=(<[0];
+ }
+ $buttonshide = $pagebuttonshide;
+ } else {
+ $countdown = &countdown_timer();
+ $buttonshide = &hidden_button_check();
+ }
+ &Apache::lonhtmlcommon::clear_breadcrumb_tools();
+
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'navigation', @inlineremote[21,23]);
+
+ if ($buttonshide eq 'yes') {
+ if ($countdown) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$countdown);
+ }
+ if ($linkprotout) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$linkprotout);
+ }
+ if ($showprogress) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$showprogress);
+ }
+ } else {
+ my @tools = @inlineremote[93,91,81,82,83];
+ if ($countdown) {
+ unshift(@tools,$countdown);
+ }
+ if ($linkprotout) {
+ unshift(@tools,$linkprotout);
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'tools',@tools);
+
+ #exit editing link/icon when using daxe in construction space
+ #publish button in construction space
+ if ($env{'request.state'} eq 'construct'){
+ if ($in_daxe) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'advtools', $inlineremote[76]);
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'advtools', $inlineremote[63]);
+ } else {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'tools', $inlineremote[63]);
+ }
+ &advtools_crumbs(@inlineremote);
+ #options link/icon in constructions space viewed with course role
+ if (($env{'request.state'} eq 'construct') &&
+ ($env{'request.role'} !~/^(aa|ca|au)/)) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'advtools', $inlineremote[75]);
+ }
+ }
+ } else {
+ if ($showprogress) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$showprogress);
+ }
+ if ($linkprotout) {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool('tools',$linkprotout);
+ }
+ }
+ my ($topic_help,$topic_help_text);
+ if ($toplevel_cstr && !$crsauthor_cstr) {
+ if ((($ENV{'SERVER_PORT'} == 443) ||
+ ($Apache::lonnet::protocol{$Apache::lonnet::perlvar{'lonHostID'}} eq 'https')) &&
+ (&Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'},'webdav'))) {
+ $topic_help = 'Authoring_WebDAV,Authoring_WebDAV_Mac_10v6,Authoring_WebDAV_Mac_10v10,'.
+ 'Authoring_WebDAV_Windows_v7,Authoring_WebDAV_Linux_Centos';
+ $topic_help_text = 'About WebDAV access';
+ }
+ }
+ if (ref($showncrumbsref)) {
+ $$showncrumbsref = 1;
+ }
+ return &Apache::lonhtmlcommon::scripttag('', 'start')
+ . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'','','','',$topic_help,$topic_help_text)
+ . &Apache::lonhtmlcommon::scripttag('', 'end');
}
-sub maincall() {
- if ($ENV{'browser.interface'} eq 'textual') { return ''; }
- return(<
- main();
-
-ENDMAINCALL
+sub get_editbutton {
+ my ($cfile,$home,$switchserver,$forceedit,$forceview,$forcereg,$hostname) = @_;
+ my $jscall;
+ if (($forceview) && ($env{'form.todocs'})) {
+ my ($folderpath,$command,$navmap);
+ if ($env{'request.symb'}) {
+ $folderpath = &Apache::loncommon::symb_to_docspath($env{'request.symb'},\$navmap);
+ } 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 {
+ my $suppanchor;
+ if ($env{'form.folderpath'}) {
+ $suppanchor = $env{'form.anchor'};
+ }
+ my $shownsymb;
+ if ($env{'request.symb'}) {
+ $shownsymb = &Apache::lonenc::check_encrypt($env{'request.symb'});
+ }
+ $jscall = &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,$switchserver,
+ $forceedit,$forcereg,$env{'request.symb'},$shownsymb,
+ &escape($env{'form.folderpath'}),
+ &escape($env{'form.title'}),$hostname,
+ $env{'form.idx'},&escape($env{'form.suppurl'}),
+ $env{'form.todocs'},$suppanchor);
+ }
+ if ($jscall) {
+ my $icon = 'pcstr.png';
+ my $label = 'Edit';
+ if ($forceview) {
+ $icon = 'tolastloc.png';
+ $label = 'Exit Editing';
+ }
+ &switch('','',6,1,$icon,$label,'resource[_2]',
+ $jscall,"Edit this resource");
+ return 1;
+ }
+ return;
}
-# ================================================================= Reopen menu
-sub reopenmenu {
- my $nothing='';
- if ($ENV{'browser.interface'} eq 'textual') { return ''; }
- my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
- if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; }
- return('window.open("'.$nothing.'","'.$menuname.'","",false);');
-}
-
-# =============================================================== Open the menu
-
-sub open {
- my $returnval='';
- if ($ENV{'browser.interface'} eq 'textual') { return ''; }
- my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
- unless (shift eq 'unix') {
-# resizing does not work on linux because of virtual desktop sizes
- $returnval.=(<'.$returnval.'';
+sub prepare_functions {
+ my ($resurl,$forcereg,$group,$bread_crumbs,$advtools,$docscrumbs,$hostname) = @_;
+ unless ($env{'request.registered'}) {
+ undef(@inlineremote);
+ }
+ my ($cdom,$cnum,%perms,$cfile,$switchserver,$home,$forceedit,
+ $forceview);
+
+ if ($env{'request.course.id'}) {
+ $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ $perms{'mdc'} = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
+ }
+
+ my $editbutton = '';
+ my $viewsrcbutton = '';
+ my $clientip = &Apache::lonnet::get_requestor_ip();
+#
+# Determine whether or not to display 'Edit' or 'View Source' icon/button
+#
+ if ($resurl =~ m{^/?adm/($match_domain)/($match_username)/aboutme$}) {
+ my $blocked = &Apache::loncommon::blocking_status('about',$clientip,$2,$1);
+ 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') && (!$blocked)) {
+ $editbutton = &get_editbutton($cfile,$home,$switchserver,
+ $forceedit,$forceview,$forcereg);
+ }
+ } elsif (!$env{'request.course.id'}) {
+ if (($env{'user.author'}) && ($resurl eq '/adm/viewcoauthors')) {
+ if ($env{'request.role'} =~/^(ca|au)/) {
+ my ($audom,$auname);
+ if ($env{'request.role'} eq "au./$env{'user.domain'}/") {
+ ($audom,$auname) = ($env{'user.domain'},$env{'user.name'});
+ } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)}) {
+ ($audom,$auname) = ($1,$2);
+ }
+ if (($audom ne '') && ($auname ne '')) {
+ my $file=&Apache::lonnet::declutter($env{'request.filename'});
+ ($cfile,$home,$switchserver,$forceedit,$forceview) =
+ &Apache::lonnet::can_edit_resource($file,$auname,$audom,
+ $resurl);
+ if ($cfile) {
+ $editbutton = &get_editbutton($resurl,'','',$forceedit,
+ $forceview);
+ }
+ }
+ }
+ } elsif (($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 =~ m{^/?public/$cdom/$cnum/syllabus}) ||
+ ($resurl =~ m{^/?uploaded/$cdom/$cnum/portfolio/syllabus/}) ||
+ (($resurl =~ m{^/?uploaded/$cdom/$cnum/default_\d+\.sequence$}) && ($env{'form.navmap'})))) {
+ if ($resurl =~ m{^/}) {
+ $cfile = $resurl;
+ } else {
+ $cfile = "/$resurl";
+ }
+ $home = &Apache::lonnet::homeserver($cnum,$cdom);
+ if ($env{'form.forceedit'}) {
+ $forceview = 1;
+ } else {
+ $forceedit = 1;
+ }
+ if ($cfile =~ m{^/uploaded/$cdom/$cnum/default_\d+\.sequence$}) {
+ my $text = 'Edit Folder';
+ &switch('','',7,4,'docs-22x22.png','Edit Folder','parms[_2]',
+ "gocmd('/adm/coursedocs','direct')",
+ 'Folder/Page Content');
+ $editbutton = 1;
+ } else {
+ $editbutton = &get_editbutton($cfile,$home,$switchserver,
+ $forceedit,$forceview,$forcereg,
+ $hostname);
+ }
+ } 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);
+ }
+ } 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;
+ my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
+ if ($env{'request.filename'} =~ m{^\Q$londocroot\E/priv/}) {
+ $file = $env{'request.filename'};
+ $file =~ s{^\Q$londocroot\E/}{};
+ } else {
+ $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,
+ $hostname);
+ }
+ if ((($cfile eq '') || (!$editbutton)) &&
+ ($resurl =~ /$LONCAPA::assess_re/)) {
+ my $showurl = &Apache::lonnet::clutter($resurl);
+ my $crs_sec = $env{'request.course.id'} . (($env{'request.course.sec'} ne '')
+ ? "/$env{'request.course.sec'}"
+ : '');
+ if ((&Apache::lonnet::allowed('cre','/')) &&
+ (&Apache::lonnet::metadata($resurl,'sourceavail') eq 'open')) {
+ $viewsrcbutton = 1;
+ } elsif (&Apache::lonnet::allowed('vxc',$crs_sec)) {
+ if ($showurl =~ m{^\Q/res/$cdom/\E($match_username)/}) {
+ my $auname = $1;
+ if (($env{'request.course.adhocsrcaccess'} ne '') &&
+ (grep(/^\Q$auname\E$/,split(/,/,$env{'request.course.adhocsrcaccess'})))) {
+ $viewsrcbutton = 1;
+ } elsif ((&Apache::lonnet::metadata($resurl,'sourceavail') eq 'open') &&
+ (&Apache::lonnet::allowed('bre',$crs_sec))) {
+ $viewsrcbutton = 1;
+ }
+ }
+ }
+ if ($viewsrcbutton) {
+ &switch('','',6,1,'pcstr.png','View Source','resource[_2]','open_source()',
+ 'View source code');
+ }
+ }
+ }
+ }
+ }
+# 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)) {
+ my $blocked = &Apache::loncommon::blocking_status('about',$clientip,$sname,$sdom);
+ unless ($blocked) {
+ &switch('','',6,4,'mail-message-new-22x22.png','Message to user',
+ '',
+ "go('/adm/email?compose=individual&recname=$sname&recdom=$sdom')",
+ 'Send message to specific user');
+ }
+ }
+ 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');
+ }
+ if ($perms{'vgr'}) {
+ &switch('','',6,6,'rsrv-22x22.png','Reservations',
+ '',
+ "go('/adm/slotrequest?command=showresv&origin=aboutme&uname=$sname&udom=$sdom')",
+ 'Slot reservation history');
+ }
+ if ($perms{'srm'}) {
+ &switch('','',6,7,'contact-new-22x22.png','Records',
+ '',
+ "go('/adm/email?recordftf=retrieve&recname=$sname&recdom=$sdom')",
+ 'Add records');
+ }
+ }
+ }
+ if (($env{'form.folderpath'} =~ /^supplemental/) &&
+ (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) &&
+ (($resurl =~ m{^/adm/wrapper/ext/}) ||
+ ($resurl =~ m{^/adm/$cdom/$cnum/\d+/ext\.tool$}) ||
+ ($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 $suppanchor;
+ if ($resurl =~ m{^/adm/wrapper/ext/}) {
+ $suppanchor = $env{'form.anchor'};
+ }
+ my $esc_path=&escape(&HTML::Entities::encode(&escape($env{'form.folderpath'}),'<>&"'));
+ my $link = '/adm/coursedocs?command=direct&forcesupplement=1&supppath='.
+ "$esc_path&anchor=$suppanchor";
+ if ($env{'request.use_absolute'} ne '') {
+ $link = $env{'request.use_absolute'}.$link;
+ }
+ &switch('','',7,4,'docs-22x22.png','Edit Folder','parms[_2]',
+ "location.href='$link'",'Folder/Page Content');
+ }
+ }
+ }
+
+# 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'}) {
+ return $editbutton || $viewsrcbutton;
+ } 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);
+ return &Apache::lonhtmlcommon::scripttag('', 'start')
+ . &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0)
+ . &Apache::lonhtmlcommon::scripttag('', 'end');
+ }
+ }
}
+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)(\?|$)}) {
+ if ($env{'request.state'} eq 'construct') {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'advtools', @funcs[61,73,74,71,72,77]);
+ } else {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'advtools', @funcs[61,71,72,73,74,75,92]);
+ }
+ } elsif ($env{'request.noversionuri'} eq '/adm/viewclasslist') {
+ &Apache::lonhtmlcommon::add_breadcrumb_tool(
+ 'advtools', $funcs[61]);
+ }
+ return;
+}
# ================================================================== Raw Config
sub clear {
my ($row,$col)=@_;
- unless ($ENV{'browser.interface'} eq 'textual') {
- return "\n".qq(window.status+='.';swmenu.clearbut($row,$col););
- } else { return ''; }
+ $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,$desc)=@_;
+ my ($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat,$nobreak,$form)=@_;
$act=~s/\$uname/$uname/g;
$act=~s/\$udom/$udom/g;
- unless ($ENV{'browser.interface'} eq 'textual') {
- return "\n".
- qq(window.status+='.';swmenu.switchbutton($row,$col,"$img","$top","$bot","$act","$desc"););
- } else {
- my $text=$top.' '.$bot;
- $text=~s/\- //;
- return ''.$text.' '.$desc;
- }
+ $desc=&mt($desc);
+ my $idx=10*$row+$col;
+ $category_members{$cat}.=':'.$idx;
+
+# Inline Menu
+ if ($nobreak==2) { return ''; }
+ my ($text,$alttext);
+ $text=&mt($top).' '.&mt($bot);
+ $text=~s/\s*\-\s*//gs;
+ if ($top) {
+ $alttext = &mt("$top icon");
+ } elsif ($bot) {
+ $alttext = &mt("$bot icon");
+ } elsif ($nobreak == 3) {
+ $alttext = &mt('Go forward icon');
+ } elsif ($nobreak) {
+ $alttext = &mt('Go back icon');
+ } else {
+ $alttext = &mt('icon');
+ }
+
+ my $pic=
+ ' ';
+ if ($env{'browser.interface'} eq 'faketextual') {
+# Main Menu
+ if ($nobreak==3) {
+ $inlineremote[$idx]="\n".
+ ''.
+ ''.$pic.' ';
+ } elsif ($nobreak) {
+ $inlineremote[$idx]="\n".
+ ''.
+ ''.$pic.'
+ ';
+ } else {
+ $inlineremote[$idx]="\n ".
+ ''.
+ ''.$pic.
+ ' ';
+ }
+ } else {
+# Inline Menu
+ my @tools = (93,91,81,82,83);
+ unless ($env{'request.state'} eq 'construct') {
+ push(@tools,63);
+ }
+ if ((($env{'environment.icons'} eq 'iconsonly') ||
+ ($env{'environment.icons'} eq '') && ($env{'request.lti.login'})) &&
+ (grep(/^$idx$/,@tools))) {
+ $inlineremote[$idx] =
+ '';
+ } else {
+ my $linktext = &mt($top);
+ $inlineremote[$idx] =
+ ''.$form;
+ }
+ }
+ return '';
}
sub secondlevel {
my $output='';
my
- ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc)=@_;
+ ($uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat)=@_;
if ($prt eq 'any') {
- $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
+ $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
} elsif ($prt=~/^r(\w+)/) {
if ($rol eq $1) {
- $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
+ $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
}
}
return $output;
}
-sub openmenu {
- my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
- if ($ENV{'browser.interface'} eq 'textual') { return ''; }
- if ($ENV{'browser.type'} eq 'explorer') {
- return "window.open('javascript:void(0);','".$menuname."');";
- } else {
- return "window.open('','".$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=''."\n";
+ for (my $col=1; $col<=2; $col++) {
+ $output .= '
'."\n";
+ 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.='
';
+ 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.="";
+ }
+ $output .= '
'."\n";
+ return $output;
}
sub rawconfig {
+#
+# 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{'browser.interface'} eq 'textual') {
- $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 $author=$ENV{'user.author'};
+ return '' unless $textualoverride;
+ 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;
+ if ($rol) {
+ $requested_domain = $env{'request.role.domain'};
}
- 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,$desc)=split(/\:/,$_);
+ foreach my $line (@desklines) {
+ my ($row,$col,$pro,$prt,$img,$top,$bot,$act,$desc,$cat)=split(/\:/,$line);
$prt=~s/\$uname/$uname/g;
$prt=~s/\$udom/$udom/g;
- $prt=~s/\$crs/$crs/g;
- $prt=~s/\$requested_domain/$requested_domain/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;
+ }
+ if ($prt =~ m/\$requested_domain/) {
+ if ((!$requested_domain) && ($pro eq 'pbre') && ($env{'user.adv'})) {
+ $prt=~s/\$requested_domain/$env{'user.domain'}/g;
+ } else {
+ $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,$desc);
+ $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,$desc);
+ $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,$desc);
+ $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
}
- } elsif (($pro=~/p(\w+)/) && ($prt)) {
- if (&Apache::lonnet::allowed($1,$prt)) {
- $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
- }
- } elsif ($pro eq 'course') {
- if ($ENV{'request.course.fn'}) {
- $output.=switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc);
+ } 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 ($priv eq 'cca') {
+ next if ($rol eq 'cm');
+ }
+ if ((($priv eq 'bre') && (&Apache::lonnet::allowed($priv,$prt) eq 'F')) ||
+ (($priv ne 'bre') && (&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 ($crstype ne 'Community') {
+ my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
+ if ($key eq 'canuse_pdfforms') {
+ if ($env{'request.course.id'} && $coursepref eq '') {
+ my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+ $coursepref = $domdefs{'canuse_pdfforms'};
+ }
+ }
+ if ($coursepref) {
+ $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
+ }
+ }
+ } elsif ($pro =~ /^communityenv_(.*)$/) {
+ my $key = $1;
+ if ($crstype eq 'Community') {
+ my $coursepref = $env{'course.'.$env{'request.course.id'}.'.'.$key};
+ if ($key eq 'canuse_pdfforms') {
+ if ($env{'request.course.id'} && $coursepref eq '') {
+ my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+ $coursepref = $domdefs{'canuse_pdfforms'};
+ }
+ }
+ if ($coursepref) {
+ $output.=&switch($uname,$udom,$row,$col,$img,$top,$bot,$act,$desc,$cat);
+ }
+ }
+ } elsif ($pro =~ /^course_(.*)$/) {
+ # 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/)) ||
- (($prt eq 'rau') && ($ENV{'request.role'}=~/^au/))) {
+ 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=$requested_domain;
- my $caname=$ENV{'user.name'};
- if ($prt eq 'rca') {
+ my $caname=$env{'user.name'};
+ if (($prt eq 'rca') || ($prt eq 'raa')) {
($cadom,$caname)=
- ($ENV{'request.role'}=~/(\w+)\/(\w+)$/);
+ ($env{'request.role'}=~/($match_domain)\/($match_username)$/);
}
$act =~ s/\$caname/$caname/g;
+ $act =~ s/\$cadom/$cadom/g;
my $home = &Apache::lonnet::homeserver($caname,$cadom);
- if ($home eq $Apache::lonnet::perlvar{'lonHostID'}) {
- $output.=switch($caname,$cadom,
- $row,$col,$img,$top,$bot,$act,$desc);
+ 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 'coauthor') {
+ if ($env{'request.role'}=~ m{^(ca|aa)\./($match_domain)/($match_username)$}) {
+ my ($role,$audom,$auname) = ($1,$2,$3);
+ if ((($prt eq 'raa') && ($role eq 'aa')) ||
+ (($prt eq 'rca') && ($role eq 'ca') &&
+ (!$env{"environment.internal.manager./$audom/$auname"}))) {
+ $output.=&switch($auname,$audom,
+ $row,$col,$img,$top,$bot,$act,$desc,$cat);
+ }
+ }
+ } elsif ($pro eq 'coauthorenv_manager') {
+ if ($env{'request.role'}=~ m{^ca\./($match_domain)/($match_username)$}) {
+ my ($audom,$auname) = ($1,$2);
+ if ($env{"environment.internal.manager./$audom/$auname"}) {
+ $output.=&switch($auname,$audom,
+ $row,$col,$img,$top,$bot,$act,$desc,$cat);
+ }
+ }
+ } elsif ($pro eq 'tools') {
+ my @tools = ('aboutme','blog','portfolio');
+ if (grep(/^\Q$prt\E$/,@tools)) {
+ if (!&Apache::lonnet::usertools_access($env{'user.name'},
+ $env{'user.domain'},
+ $prt,undef,'tools')) {
+ $output.=&clear($row,$col);
+ next;
+ }
+ } elsif (($prt eq 'reqcrsnsc') || ($prt eq 'reqcrsshc')) {
+ if (($prt eq 'reqcrsnsc') && ($show_course)) {
+ next;
+ }
+ if (($prt eq 'reqcrsshc') && (!$show_course)) {
+ next;
+ }
+ my $showreqcrs = &check_for_rcrs();
+ if (!$showreqcrs) {
+ $output.=&clear($row,$col);
+ next;
+ }
+ }
+ $prt='any';
+ $output.=&secondlevel(
+ $uname,$udom,$rol,$crs,$pub,$con,$row,$col,$prt,$img,$top,$bot,$act,$desc,$cat);
}
}
- unless ($ENV{'browser.interface'} eq 'textual') {
- $output.="\nwindow.status='Synchronizing Time';swmenu.syncclock(1000*".time.");\nwindow.status='Remote Control Configured.';";
- }
return $output;
}
-# ======================================================================= Close
-
-sub close {
- if ($ENV{'browser.interface'} eq 'textual') { return ''; }
- my $menuname='LCmenu'.$Apache::lonnet::perlvar{'lonHostID'};
- return(<
-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.';
-
-ENDCLOSE
+sub check_for_rcrs {
+ my $showreqcrs = 0;
+ my @reqtypes = ('official','unofficial','community','textbook','placement');
+ 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 '') {
+ my @domains = split(',',$env{'environment.reqcrsotherdom.'.$type});
+ foreach my $entry (@domains) {
+ my ($extdom,$extopt) = split(':',$entry);
+ if (&Apache::lonnet::will_trust('reqcrs',$env{'user.domain'},$extdom)) {
+ $showreqcrs = 1;
+ last;
+ }
+ }
+ if ($showreqcrs) {
+ last;
+ }
+ }
+ }
+ }
+ return $showreqcrs;
}
-# ====================================================================== Footer
+sub dc_popup_js {
+ my %lt = &Apache::lonlocal::texthash(
+ more => '(More ...)',
+ less => '(Less ...)',
+ );
+ return <<"END";
-sub footer {
+function showCourseID() {
+ document.getElementById('dccid').style.display='block';
+ document.getElementById('dccid').style.textAlign='left';
+ document.getElementById('dccid').style.textFace='normal';
+ document.getElementById('dccidtext').innerHTML ='';
+ return;
+}
+function hideCourseID() {
+ document.getElementById('dccid').style.display='none';
+ document.getElementById('dccidtext').innerHTML ='';
+ return;
}
-# ================================================ Handler when called directly
+END
+}
-sub handler {
- my $r = shift;
- $r->content_type('text/html');
- $r->send_http_header;
- return OK if $r->header_only;
+sub countdown_toggle_js {
+ return <<"END";
- my $bodytag=&Apache::loncommon::bodytag('Main Menu');
-# ------------------------------------------------------------ Print the screen
- $r->print(<
-LON-CAPA Main Menu
-
-
-$bodytag
-ENDHEADER
- $r->print(&rawconfig(1));
- $r->print('