# The LearningOnline Network with CAPA # displays the main menu # # $Id: lonmainmenu.pm,v 1.8.4.3 2009/12/07 22:33:26 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # # # There are two parameters controlling the action of this module: # # browser.interface - if this is 'textual', it overrides the second parameter # and goes to screen reader PDA mode # # environment.remote - if this is 'on', the routines controll the remote # control, otherwise they render the main window controls; ignored it # browser.interface is 'textual' # package Apache::lonmainmenu; use strict; use Apache::Constants qw(:common); use Apache::loncommon(); use Apache::lonnet; use Apache::lonmenu(); use Apache::lonlocal; use LONCAPA qw(:DEFAULT :match); sub handler { my $r = shift; &Apache::loncommon::no_cache($r); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; my $form; if ($env{'environment.remote'} ne 'off') { $form=&Apache::lonmenu::serverform(); } my $custommenu = &Apache::loncommon::needs_gci_custom(); my ($script_tag,$switcher); if ($env{'environment.remote'} ne 'off') { my $utility=&Apache::lonmenu::utilityfunctions('/adm/menu'); $script_tag=(< $utility ENDSCRIPT } elsif ($custommenu) { my $switcher_js; my %courses = &Apache::loncommon::existing_gcitest_courses(); my $numcourses = keys(%courses); if ($numcourses > 0) { $switcher = &gcitest_switcher(%courses); my $current; if ($env{'request.course.id'}) { $current = 'cc./'.$env{'course.'.$env{'request.course.id'}.'.domain'}. '/'.$env{'course.'.$env{'request.course.id'}.'.num'}; } $switcher_js = &gcitest_switcher_js($current,$numcourses); $script_tag= <<"ENDSCRIPT"; ENDSCRIPT } } # ---- Print the screen, pretend to be in text mode to generate text-based menu # temporarily set interface to "faketextual" and remote to "off", which renders # the main menu $env{'browser.interface'}='faketextual'; $env{'environment.remote'}='off'; $r->print(&Apache::loncommon::start_page( 'Main Menu', $script_tag, {'bread_crumbs' => 1})); if ($custommenu) { $r->print(&Apache::lonmenu::inlinemenu('gcicustom',$switcher).$form); } else { $r->print(&Apache::lonmenu::inlinemenu().$form); } $r->print(&Apache::loncommon::end_page()); return OK; } sub gcitest_switcher { my (%courses) = @_; my $output; my %Sortby; foreach my $course (sort(keys(%courses))) { next unless (ref($courses{$course}) eq 'HASH'); my $clean_title = $courses{$course}{'description'}; $clean_title =~ s/\W+//g; if ($clean_title eq '') { $clean_title = $courses{$course}{'description'}; } push(@{$Sortby{$clean_title}},$course); } my @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby)); my $default; if (@sorted_courses > 1) { if (($env{'request.course.id'}) && ($courses{$env{'request.course.id'}})) { $default = &mt('Switch concept test ...'); } else { $default = &mt('Select a concept test ...'); } } else { unless (($env{'request.course.id'}) && ($courses{$env{'request.course.id'}})) { $default = &mt('Select concept test ...'); } } if ($default) { $output = '
'. '
'; } return $output; } sub gcitest_switcher_js { my ($current,$numcourses) = @_; my $output = <<"ENDJS"; function courseswitcher(caller) { var numcourses = $numcourses; var current = '$current'; var choice = document.pickrole.newrole.options[document.pickrole.newrole.selectedIndex].value; if (choice == '') { if (caller == 'icon') { alert('No Concept Test selected'); } document.pickrole.selectrole.value = ''; return; } if (choice == current) { if ((caller != 'icon') && (numcourses > 1)) { alert('You have selected the current course.\\nPlease select a different Concept Test course'); } document.pickrole.newrole.selectedIndex = 0; document.pickrole.selectrole.value = ''; return; } document.pickrole.selectrole.value = '1'; document.pickrole.submit(); return; } ENDJS return $output; } 1; __END__