--- loncom/auth/lonroles.pm 2009/06/12 09:19:21 1.227 +++ loncom/auth/lonroles.pm 2010/06/02 16:26:21 1.251 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.227 2009/06/12 09:19:21 bisitz Exp $ +# $Id: lonroles.pm,v 1.251 2010/06/02 16:26:21 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -57,8 +57,7 @@ course they should act on, etc. Both in handler determines via C's C<&allowed> function that a certain action is not allowed, C is used as error handler. This allows the user to select another role which may have permission to do -what they were trying to do. C can also be accessed via the -B button in the Remote Control. +what they were trying to do. =begin latex @@ -138,27 +137,25 @@ use Apache::lonannounce; use Apache::lonlocal; use Apache::lonpageflip(); use Apache::lonnavdisplay(); +use Apache::loncoursequeueadmin; use GDBM_File; use LONCAPA qw(:DEFAULT :match); use HTML::Entities; sub redirect_user { - my ($r,$title,$url,$msg,$launch_nav) = @_; + my ($r,$title,$url,$msg) = @_; $msg = $title if (! defined($msg)); &Apache::loncommon::content_type($r,'text/html'); &Apache::loncommon::no_cache($r); $r->send_http_header; - my $swinfo=&Apache::lonmenu::rawconfig(); - my $navwindow; - if ($launch_nav eq 'on') { - $navwindow.=&Apache::lonnavdisplay::launch_win('now',undef,undef, - ($url =~ m-^/adm/whatsnew-)); - } else { - $navwindow.=&Apache::lonnavmaps::close(); - } + + # Breadcrumbs + my $brcrum = [{'href' => $url, + 'text' => 'Switching Role'},]; my $start_page = &Apache::loncommon::start_page('Switching Role',undef, - {'redirect' => [1,$url],}); + {'redirect' => [1,$url], + 'bread_crumbs' => $brcrum,}); my $end_page = &Apache::loncommon::end_page(); # Note to style police: @@ -166,12 +163,6 @@ sub redirect_user { $url=~s/ /\%20/g; $r->print(< -// - -$navwindow

$msg

$end_page ENDREDIR @@ -184,16 +175,25 @@ sub error_page { &Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; - $r->print(&Apache::loncommon::start_page('Problems during Course Initialization'). + # Breadcrumbs + my $brcrum = [{'href' => $dest, + 'text' => 'Problems during Course Initialization'},]; + $r->print(&Apache::loncommon::start_page('Problems during Course Initialization', + undef, + {'bread_crumbs' => $brcrum,}) + ); + $r->print( ''. '

'.&mt('The following problems occurred:'). + '
'. $error. - '


'.&mt('Continue').''. - &Apache::loncommon::end_page()); + '


'.&mt('Continue').'' + ); + $r->print(&Apache::loncommon::end_page()); } sub handler { @@ -224,7 +224,7 @@ sub handler { # Check if user is CC trying to select a course role if ($env{'form.switchrole'}) { if (!defined($env{'user.role.'.$env{'form.switchrole'}})) { - &adhoc_course_role($then); + &adhoc_course_role($refresh,$then); } } my %temp=('logout_'.$env{'request.course.id'} => time); @@ -241,12 +241,12 @@ sub handler { # Check if user is a DC trying to enter a course or author space and needs privs to be created if ($numdc > 0) { foreach my $envkey (keys %env) { -# Is this an ad-hoc CC-role? - if (my ($domain,$coursenum) = - ($envkey =~ m-^form\.cc\./($match_domain)/($match_courseid)$-)) { +# Is this an ad-hoc Coordinator role? + if (my ($ccrole,$domain,$coursenum) = + ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) { if ($dcroles{$domain}) { &Apache::lonnet::check_adhoc_privs($domain,$coursenum, - $then,$now,'cc'); + $then,$refresh,$now,$ccrole); } last; } @@ -259,7 +259,7 @@ sub handler { my ($server_status,$home) = &check_author_homeserver($user,$domain); if ($server_status eq 'switchserver') { my $trolecode = 'au./'.$domain.'/'; - my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; + my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; $r->internal_redirect($switchserver); } last; @@ -270,7 +270,7 @@ sub handler { my ($server_status,$home) = &check_author_homeserver($user,$domain); if ($server_status eq 'switchserver') { my $trolecode = 'ca./'.$domain.'/'.$user; - my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; + my $switchserver = '/adm/switchserver?otherserver='.$home.'&role='.$trolecode; $r->internal_redirect($switchserver); } last; @@ -287,11 +287,11 @@ sub handler { my ($server_status,$home) = &check_author_homeserver($user,$domain); if (($server_status eq 'ok') || ($server_status eq 'switchserver')) { &Apache::lonnet::check_adhoc_privs($domain,$user,$then, - $now,'ca'); + $refresh,$now,'ca'); if ($server_status eq 'switchserver') { my $trolecode = 'ca./'.$domain.'/'.$user; my $switchserver = '/adm/switchserver?' - .'otherserver='.$home.'&role='.$trolecode; + .'otherserver='.$home.'&role='.$trolecode; $r->internal_redirect($switchserver); } } else { @@ -477,8 +477,8 @@ ENDENTERKEY $courseid = substr($courseid, 1); } $courseid =~ s/\//_/; - if ($role eq 'cc' && $env{'course.' . $courseid . - '.course.helper.not.run'}) { + if ((($role eq 'cc') || ($role eq 'co')) + && ($env{'course.' . $courseid .'.course.helper.not.run'})) { $furl = "/adm/helper/course.initialization.helper"; # Send the user to the course they selected } elsif ($env{'request.course.id'}) { @@ -488,10 +488,9 @@ ENDENTERKEY my $esc_symb = &HTML::Entities::encode($env{'form.destsymb'},'"<>&'); $dest .= '?symb='.$esc_symb; } - &redirect_user($r,&mt('Entering [_1]', - $env{'course.'.$courseid.'.description'}), - $dest,$msg, - $env{'environment.remotenavmap'}); + &redirect_user($r, &mt('Entering [_1]', + $env{'course.'.$courseid.'.description'}), + $dest, $msg); return OK; } if (&Apache::lonnet::allowed('whn', @@ -504,9 +503,8 @@ ENDENTERKEY unless ($startpage eq 'firstres') { $msg = &mt('Entering [_1] ...', $env{'course.'.$courseid.'.description'}); - &redirect_user($r,&mt('New in course'), - '/adm/whatsnew?refpage=start',$msg, - $env{'environment.remotenavmap'}); + &redirect_user($r, &mt('New in course'), + '/adm/whatsnew?refpage=start', $msg); return OK; } } @@ -518,10 +516,9 @@ ENDENTERKEY } $msg = &mt('Entering [_1] ...', $env{'course.'.$courseid.'.description'}); - &redirect_user($r,&mt('Entering [_1]', - $env{'course.'.$courseid.'.description'}), - $furl,$msg, - $env{'environment.remotenavmap'}); + &redirect_user($r, &mt('Entering [_1]', + $env{'course.'.$courseid.'.description'}), + $furl, $msg); } return OK; } @@ -657,11 +654,12 @@ ENDHEADER if ($reinit) { $r->print( '

'. - &mt('As your session file for the course has expired, you will need to re-select the course.').'

'); + &mt('As your session file for the course or community has expired, you will need to re-select it.').''); } else { $r->print( '

'. - &mt('You need to choose another user role or enter a specific course for this function').'

'); + &mt('You need to choose another user role or enter a specific course or community for this function.'). + ''); } } } @@ -689,27 +687,41 @@ ENDHEADER $refresh = $now; &Apache::lonnet::appenv({'user.refresh.time' => $refresh}); if ($env{'user.adv'}) { - $r->print( - '

'); + $r->print(' />'.&mt('Show all roles').'' + .' ' + .'

'); } else { if ($countactive > 0) { - &queued_selfenrollment($r); + $r->print(&Apache::loncoursequeueadmin::queued_selfenrollment()); my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); - $r->print('

'.&mt('[_1]Visit the [_2]Course Catalog[_3] to view all [_4] LON-CAPA courses.','','','',$domdesc).'
'.&mt('If a course is [_1]not[_2] in your list of current courses below, you may be able to enroll if self-enrollment is permitted.','','').'

'); + $r->print( + '

' + .&mt('[_1]Visit the [_2]Course/Community Catalog[_3]' + .' to view all [_4] LON-CAPA courses and communities.' + ,'' + ,'' + ,'',$domdesc) + .'
' + .&mt('If a course or community is [_1]not[_2] in your list of current courses and communities below,' + .' you may be able to enroll if self-enrollment is permitted.' + ,'','') + .'

' + ); } } # No active roles if ($countactive==0) { if ($inrole) { - $r->print('

'.&mt('Currently no additional roles or courses').'

'); + $r->print('

'.&mt('Currently no additional roles, courses or communities').'

'); } else { - $r->print('

'.&mt('Currently no active roles or courses').'

'); + $r->print('

'.&mt('Currently no active roles, courses or communities').'

'); } &findcourse_advice($r); + &requestcourse_advice($r); $r->print(''); if ($countfuture) { $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture)); @@ -740,31 +752,55 @@ ENDHEADER return OK; } # ----------------------------------------------------------------------- Table + + if ($numdc > 0) { + $r->print(&coursepick_jscript()); + $r->print(&Apache::loncommon::coursebrowser_javascript(). + &Apache::loncommon::authorbrowser_javascript()); + } + unless ((!&Apache::loncommon::show_course()) || ($nochoose) || ($countactive==1)) { $r->print("

".&mt('Select a Course to Enter')."

\n"); } + if ($env{'form.destinationurl'}) { + $r->print(''); + if ($env{'form.destsymb'} ne '') { + $r->print(''); + } + } + my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,$nochoose); if ($env{'environment.recentroles'}) { my %recent_roles = &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'}); my $output=''; - foreach (sort(keys(%recent_roles))) { - if (ref($roletext{'user.role.'.$_}) eq 'ARRAY') { + foreach my $role (sort(keys(%recent_roles))) { + if (ref($roletext{'user.role.'.$role}) eq 'ARRAY') { $output.= &Apache::loncommon::start_data_table_row(). - $roletext{'user.role.'.$_}->[0]. - &Apache::loncommon::end_data_table_row(). - &Apache::loncommon::continue_data_table_row(). - $roletext{'user.role.'.$_}->[1]. + $roletext{'user.role.'.$role}->[0]. &Apache::loncommon::end_data_table_row(); - if ($_ =~ m-dc\./($match_domain)/- + if ($roletext{'user.role.'.$role}->[1] ne '') { + $output .= &Apache::loncommon::continue_data_table_row(). + $roletext{'user.role.'.$role}->[1]. + &Apache::loncommon::end_data_table_row(); + } + if ($role =~ m{dc\./($match_domain)/} && $dcroles{$1}) { $output .= &adhoc_roles_row($1,'recent'); } } elsif ($numdc > 0) { - unless ($_ =~/^error\:/) { - $output.=&display_cc_role('user.role.'.$_); + unless ($role =~/^error\:/) { + my ($roletext,$role_text_end) = &display_cc_role('user.role.'.$role); + $output.= &Apache::loncommon::start_data_table_row(). + $roletext. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::continue_data_table_row(). + $role_text_end. + &Apache::loncommon::end_data_table_row(); } - } + } } if ($output) { $r->print(&Apache::loncommon::start_data_table_empty_row() @@ -777,12 +813,6 @@ ENDHEADER $doheaders ++; } } - - if ($numdc > 0) { - $r->print(&coursepick_jscript()); - $r->print(&Apache::loncommon::coursebrowser_javascript(). - &Apache::loncommon::authorbrowser_javascript()); - } &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles,\%roletext); if ($countactive > 1) { my $tremark=''; @@ -821,12 +851,12 @@ ENDHEADER $r->print(&Apache::lonnet::getannounce()); if ($advanced) { my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); - $r->print('

' - .&mt('This is LON-CAPA [_1]',$r->dir_config('lonVersion')) - .'
' - .''.&mt('Logout').'  ' + $r->print('

' + .&mt('This LON-CAPA server is version [_1]',$r->dir_config('lonVersion')) + .'
' + .''.&mt('Logout').'  ' .'' - .&mt('Course Catalog') + .&mt('Course/Community Catalog') .'

'); } $r->print(&Apache::loncommon::end_page()); @@ -905,7 +935,7 @@ sub gather_roles { foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } if (!$allowed) { $button=0; - $switchserver='otherserver='.$home.'&role='.$trolecode; + $switchserver='otherserver='.$home.'&role='.$trolecode; } #next if ($home eq 'no_host'); $home = &Apache::lonnet::hostname($home); @@ -925,7 +955,7 @@ sub gather_roles { foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } if (!$allowed) { $button=0; - $switchserver='otherserver='.$home.'&role='.$trolecode; + $switchserver='otherserver='.$home.'&role='.$trolecode; } #next if ($home eq 'no_host'); $home = &Apache::lonnet::hostname($home); @@ -938,10 +968,11 @@ sub gather_roles { } elsif ($trest) { my $tcourseid=$tdom.'_'.$trest; $ttype = &Apache::loncommon::course_type($tcourseid); - $trole = &Apache::lonnet::plaintext($role,$ttype); + $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid); if ($env{'course.'.$tcourseid.'.description'}) { $twhere=$env{'course.'.$tcourseid.'.description'}; $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; + $twhere = &HTML::Entities::encode($twhere,'"<>&'); unless ($twhere eq &mt('Currently not available')) { $twhere.=' '. &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). @@ -952,12 +983,12 @@ sub gather_roles { if (%newhash) { $sortkey=$role."\0".$tdom."\0".$newhash{'description'}. "\0".$envkey; - $twhere=$newhash{'description'}. - ' '. - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). - ''; + $twhere=&HTML::Entities::encode($newhash{'description'},'"<>&'). + ' '. + &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). + ''; $ttype = $newhash{'type'}; - $trole = &Apache::lonnet::plaintext($role,$ttype); + $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid); } else { $twhere=&mt('Currently not available'); $env{'course.'.$tcourseid.'.description'}=$twhere; @@ -1073,7 +1104,7 @@ sub roletable_headers { } sub roletypes { - my @types = ('Domain','Construction Space','Course','Unavailable','System'); + my @types = ('Domain','Construction Space','Course','Community','Unavailable','System'); return @types; } @@ -1089,10 +1120,12 @@ sub print_rolerows { if (ref($roletext->{$sortrole->{$which}}) eq 'ARRAY') { $output.= &Apache::loncommon::start_data_table_row(). $roletext->{$sortrole->{$which}}->[0]. - &Apache::loncommon::end_data_table_row(). - &Apache::loncommon::continue_data_table_row(). - $roletext->{$sortrole->{$which}}->[1]. &Apache::loncommon::end_data_table_row(); + if ($roletext->{$sortrole->{$which}}->[1] ne '') { + $output .= &Apache::loncommon::continue_data_table_row(). + $roletext->{$sortrole->{$which}}->[1]. + &Apache::loncommon::end_data_table_row(); + } } if ($sortrole->{$which} =~ m-dc\./($match_domain)/-) { if (ref($dcroles) eq 'HASH') { @@ -1135,51 +1168,62 @@ sub findcourse_advice { } else { $r->print(&mt('If you were expecting to see an active role listed for a particular course, that course may not have been created yet.').'
'); } - $r->print('

'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','','',$domdesc).'
'); - $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'

'); - &queued_selfenrollment($r); + $r->print('

'.&mt('Self-Enrollment').'

'. + '

'.&mt('The [_1]Course/Community Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created, as well as any communities in the domain.','','',$domdesc).'
'); + $r->print(&mt('You can search for courses and communities which permit self-enrollment, if you would like to enroll in one.').'

'. + &Apache::loncoursequeueadmin::queued_selfenrollment()); return; } -sub queued_selfenrollment { +sub requestcourse_advice { my ($r) = @_; - my %selfenrollrequests = &Apache::lonnet::dump('selfenrollrequests'); - my %reqs_by_date; - foreach my $item (keys(%selfenrollrequests)) { - if (ref($selfenrollrequests{$item}) eq 'HASH') { - if ($selfenrollrequests{$item}{'status'} eq 'request') { - if ($selfenrollrequests{$item}{'timestamp'}) { - push(@{$reqs_by_date{$selfenrollrequests{$item}{'timestamp'}}},$item); - } - } - } - } - if (keys(%reqs_by_date)) { - my $rolename = &Apache::lonnet::plaintext('st'); - $r->print(''.&mt('Enrollment requests pending Course Coordinator approval').'
'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - ''.&mt('Date requested').''.&mt('Course title').''. - ''.&mt('User role').''.&mt('Section').''. - &Apache::loncommon::end_data_table_header_row()); - my @sorted = sort { $a <=> $b } (keys(%reqs_by_date)); - foreach my $item (@sorted) { - if (ref($reqs_by_date{$item}) eq 'ARRAY') { - foreach my $crs (@{$reqs_by_date{$item}}) { - my %courseinfo = &Apache::lonnet::coursedescription($crs); - my $usec = $selfenrollrequests{$crs}{'section'}; - if ($usec eq '') { - $usec = &mt('No section'); + my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); + my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); + my (%can_request,%request_doms); + &Apache::lonnet::check_can_request($env{'user.domain'},\%can_request,\%request_doms); + if (keys(%request_doms) > 0) { + my ($types,$typename) = &Apache::loncommon::course_types(); + if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) { + $r->print('

'.&mt('Request creation of a course or community').'

'. + '

'.&mt('You have rights to request the creation of courses and/or communities in the following domain(s):').'

    '); + my (@reqdoms,@reqtypes); + foreach my $type (sort(keys(%request_doms))) { + push(@reqtypes,$type); + if (ref($request_doms{$type}) eq 'ARRAY') { + my $domstr = join(', ',map { &Apache::lonnet::domain($_) } sort(@{$request_doms{$type}})); + $r->print( + '
  • ' + .&mt('[_1]'.$typename->{$type}.'[_2] in domain: [_3]', + '', + '', + ''.$domstr.'') + .'
  • ' + ); + foreach my $dom (@{$request_doms{$type}}) { + unless (grep(/^\Q$dom\E/,@reqdoms)) { + push(@reqdoms,$dom); + } } - $r->print(&Apache::loncommon::start_data_table_row(). - ''.&Apache::lonlocal::locallocaltime($item).''. - ''.$courseinfo{'description'}.''. - ''.$rolename.''.$usec.''. - &Apache::loncommon::end_data_table_row()); } } + my @showtypes; + foreach my $type (@{$types}) { + if (grep(/^\Q$type\E$/,@reqtypes)) { + push(@showtypes,$type); + } + } + my $requrl = '/adm/requestcourse'; + if (@reqdoms == 1) { + $requrl .= '?showdom='.$reqdoms[0]; + } + if (@showtypes > 0) { + $requrl.=(($requrl=~/\?/)?'&':'?').'crstype='.$showtypes[0]; + } + if (@reqdoms == 1 || @showtypes > 0) { + $requrl .= '&state=crstype&action=new'; + } + $r->print('
'.&mt('Use the [_1]request form[_2] to submit a request for creation of a new course or community.','','').'

'); } - $r->print(&Apache::loncommon::end_data_table()); } return; } @@ -1362,21 +1406,22 @@ sub check_fordc { } sub adhoc_course_role { - my ($then) = @_; - my ($cdom,$cnum); + my ($refresh,$then) = @_; + my ($cdom,$cnum,$crstype); $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - if (&check_forcc($cdom,$cnum,$then)) { + $crstype = &Apache::loncommon::course_type(); + if (&check_forcc($cdom,$cnum,$refresh,$then,$crstype)) { my $setprivs; if (!defined($env{'user.role.'.$env{'form.switchrole'}})) { $setprivs = 1; } else { my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.switchrole'}}); - if (($start && ($start>$then || $start == -1)) || + if (($start && ($start>$refresh || $start == -1)) || ($end && $end<$then)) { $setprivs = 1; } - } + } if ($setprivs) { if ($env{'form.switchrole'} =~ m-^(in|ta|ep|ad|st|cr)([\w/]*)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) { my $role = $1; @@ -1406,7 +1451,7 @@ sub adhoc_course_role { } &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area); &Apache::lonnet::set_userprivs(\%userroles,\%newrole,\%newgroups); - my $adhocstart = $then-1; + my $adhocstart = $refresh-1; $userroles{'user.role.'.$spec} = $adhocstart.'.'; &Apache::lonnet::appenv(\%userroles,[$role,'cm']); } @@ -1416,15 +1461,20 @@ sub adhoc_course_role { } sub check_forcc { - my ($cdom,$cnum,$then) = @_; - my $is_cc; + my ($cdom,$cnum,$refresh,$then,$crstype) = @_; + my ($is_cc,$ccrole); + if ($crstype eq 'Community') { + $ccrole = 'co'; + } else { + $ccrole = 'cc'; + } if ($cdom ne '' && $cnum ne '') { if (&Apache::lonnet::is_course($cdom,$cnum)) { - my $envkey = 'user.role.cc./'.$cdom.'/'.$cnum; + my $envkey = 'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum; if (defined($env{$envkey})) { $is_cc = 1; my ($tstart,$tend)=split(/\./,$env{$envkey}); - if ($tstart && $tstart>$then) { $is_cc = 0; } + if ($tstart && $tstart>$refresh) { $is_cc = 0; } if ($tend && $tend <$then) { $is_cc = 0; } } } @@ -1437,7 +1487,7 @@ sub courselink { my $courseform=&Apache::loncommon::selectcourse_link ('rolechoice','dccourse'.$rowtype.'_'.$dcdom, 'dcdomain'.$rowtype.'_'.$dcdom,'coursedesc'.$rowtype.'_'. - $dcdom,$dcdom,undef); + $dcdom,$dcdom,undef,'Course/Community'); my $hiddenitems = ''. ''. ''. @@ -1447,8 +1497,8 @@ sub courselink { sub coursepick_jscript { my %lt = &Apache::lonlocal::texthash( - plsu => "Please use the 'Select Course' link to open a separate pick course window where you may select the course you wish to enter.", - youc => 'You can only use this screen to select courses in the current domain.', + plsu => "Please use the 'Select Course/Community' link to open a separate pick course window where you may select the course or community you wish to enter.", + youc => 'You can only use this screen to select courses and communities in the current domain.', ); my $verify_script = <<"END";