--- loncom/interface/loncommon.pm 2009/08/06 04:05:38 1.880
+++ loncom/interface/loncommon.pm 2010/11/09 00:08:06 1.925.2.17
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.880 2009/08/06 04:05:38 raeburn Exp $
+# $Id: loncommon.pm,v 1.925.2.17 2010/11/09 00:08:06 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -482,8 +482,11 @@ ENDAUTHORBRW
}
sub coursebrowser_javascript {
- my ($domainfilter,$sec_element,$formname)=@_;
- my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Community - for which you wish to add/modify a user role');
+ my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_;
+ my $wintitle = &mt('Course Browser');
+ if ($crstype ne '') {
+ $wintitle = &mt($crstype);
+ }
my $id_functions = &javascript_index_functions();
my $output = '
END_MYBLOCK
+
+ $output = Apache::lonhtmlcommon::scripttag($output);
+
my $popupUrl = "/adm/blockingstatus/$querystring";
+ my $text = mt('Communication Blocked');
+
$output .= <<"END_BLOCK";
END_BLOCK
@@ -4032,7 +4127,7 @@ sub determinedomain {
my $domain=shift;
if (! $domain) {
# Determine domain if we have not been given one
- $domain = $Apache::lonnet::perlvar{'lonDefDomain'};
+ $domain = &Apache::lonnet::default_login_domain();
if ($env{'user.domain'}) { $domain=$env{'user.domain'}; }
if ($env{'request.role.domain'}) {
$domain=$env{'request.role.domain'};
@@ -4283,18 +4378,30 @@ sub CSTR_pageheader {
} else {
$lastitem = $thisdisfn;
}
- return
+
+ my $output =
'
'
.&Apache::loncommon::help_open_menu('','',3,'Authoring') #FIXME: Broken? Where is it?
.''.&mt('Construction Space:').' '
.''
.&Apache::lonmenu::constspaceform()
.'
';
+
+ return $output;
}
###############################################
@@ -4371,6 +4478,10 @@ sub bodytag {
'link' => &designparm($function.'.link',$domain),);
@design{keys(%$addentries)} = @$addentries{keys(%$addentries)};
+ my $custommenu;
+ if ($env{'environment.remote'} eq 'off') {
+ $custommenu = &needs_gci_custom();
+ }
# role and realm
my ($role,$realm) = split(/\./,$env{'request.role'},2);
if ($role eq 'ca') {
@@ -4380,11 +4491,26 @@ sub bodytag {
# realm
if ($env{'request.course.id'}) {
if ($env{'request.role'} !~ /^cr/) {
- $role = &Apache::lonnet::plaintext($role,&course_type());
+ if (($custommenu) && (($role eq 'cm') || ($env{'form.context'} eq 'requestcrs'))) {
+ undef($role);
+ } else {
+ $role = &Apache::lonnet::plaintext($role,&course_type());
+ }
+ }
+ if (defined($role) && $env{'request.course.sec'}) {
+ $role .= (' 'x2).'- '.&mt('section:').' '.$env{'request.course.sec'};
+ }
+ if ($env{'form.context'} eq 'requestcrs') {
+ undef($realm);
+ } else {
+ $realm = $env{'course.'.$env{'request.course.id'}.'.description'};
}
- $realm = $env{'course.'.$env{'request.course.id'}.'.description'};
} else {
- $role = &Apache::lonnet::plaintext($role);
+ if (($custommenu) && ($role eq 'cm')) {
+ undef($role);
+ } else {
+ $role = &Apache::lonnet::plaintext($role);
+ }
}
if (!$realm) { $realm=' '; }
@@ -4416,40 +4542,166 @@ sub bodytag {
$env{'course.'.$env{'request.course.id'}.
'.domain'}.'/'})) {
my $cid = $env{'request.course.id'};
- $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
+ $dc_info = $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
$dc_info =~ s/\s+$//;
- $dc_info = '('.$dc_info.')';
}
- $role = "($role)" if $role;
+ $role = '('.$role.')' if $role;
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);
if ($env{'environment.remote'} eq 'off') {
# No Remote
- if ($env{'request.state'} eq 'construct') {
- $forcereg=1;
- }
+ if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') {
+ return $bodytag;
+ }
-# if ($env{'request.state'} eq 'construct') {
-# $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
-# }
+ if ($env{'request.state'} eq 'construct') { $forcereg=1; }
- my $titletable = '
'
- ."
$titleinfo $dc_info
"
- .'
';
+ # if ($env{'request.state'} eq 'construct') {
+ # $titleinfo = &CSTR_pageheader(); #FIXME: Will be removed once all scripts have their own calls
+ # }
+
+ my $role_selector;
+ if (($custommenu) && !($env{'form.context'} eq 'requestcrs') &&
+ ($env{'request.course.id'}) &&
+ ($env{'course.'.$env{'request.course.id'}.'.domain'} eq 'gcitest')) {
+ $role_selector = &Apache::lonmenu::roles_selector(
+ $env{'course.' . $env{'request.course.id'} . '.domain'},
+ $env{'course.' . $env{'request.course.id'} . '.num'} );
+ if ($role_selector) {
+ $role_selector = ' '.$role_selector;
+ }
+ }
+ my $cid = $env{'request.course.id'};
+ my %gcicourses = (
+ gci_9615072b469884921gcil1 => 'review',
+ gci_1H96711d710194bfegcil1 => 'submit',
+ gci_5422913620b814c90gcil1 => 'tutorial',
+ );
+ if (($custommenu && $cid && !$gcicourses{$cid}) &&
+ !($env{'form.context'} eq 'requestcrs') ||
+ ($env{'user.domain'} eq 'gcitest')) {
+ my $role = 'st';
+ if ($custommenu) {
+ $role = 'cc';
+ }
+ my ($switcher_js,$switcher,$formname);
+ $formname = 'pickrole';
+ my %courses = &existing_gcitest_courses($role);
+ my $numcourses = keys(%courses);
+ my $reqdcount = 0;
+ if ($cid) {
+ if ($courses{$cid}) {
+ $reqdcount = 1;
+ }
+ }
+ if ($numcourses > $reqdcount) {
+ $switcher = &gcitest_switcher($role,$formname,%courses);
+ my $current;
+ if ($cid) {
+ $current = $role.'./'.$env{'course.'.$cid.'.domain'}.
+ '/'.$env{'course.'.$cid.'.num'};
+ }
+ $switcher_js = &Apache::loncommon::gcitest_switcher_js($current,$numcourses,$formname);
+ if ($switcher_js) {
+ $switcher_js= <<"ENDSCRIPT";
+
+ENDSCRIPT
+ }
+ }
+ if ($switcher) {
+ $switcher = $switcher_js.$switcher;
+ if ($role_selector) {
+ $role_selector .= ' '.$switcher;
+ } else {
+ $role_selector .= ' '.$switcher;
+ }
}
}
+
+ if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) {
+ if ($dc_info) {
+ $dc_info = qq|$dc_info|;
+ }
+ $bodytag .= qq|
'."\n";;
}
@@ -6760,6 +7129,11 @@ sub simple_error_page {
sub end_data_table_header_row {
return '
'."\n";;
}
+
+ sub data_table_caption {
+ my $caption = shift;
+ return "
$caption
";
+ }
}
=pod
@@ -6830,7 +7204,7 @@ sub get_users_function {
if ($env{'request.role'}=~/^(st)/) {
$function='student';
}
- if ($env{'request.role'}=~/^(cc|in|ta|ep)/) {
+ if ($env{'request.role'}=~/^(cc|co|in|ta|ep)/) {
$function='coordinator';
}
if ($env{'request.role'}=~/^(su|dc|ad|li)/) {
@@ -6901,7 +7275,7 @@ sub check_user_status {
my $active_chk = 'none';
my $now = time;
if (@uroles > 0) {
- if (($role eq 'cc') || ($sec eq '') || (!defined($sec))) {
+ if (($role eq 'cc') || ($role eq 'co') || ($sec eq '') || (!defined($sec))) {
$srchstr = '/'.$cdom.'/'.$crs.'_'.$role;
} else {
$srchstr = '/'.$cdom.'/'.$crs.'/'.$sec.'_'.$role;
@@ -7522,9 +7896,9 @@ sub user_picker {
'whse' => "When searching by last,first you must include at least one character in the first name.",
'thfo' => "The following need to be corrected before the search can be run:",
);
- my $domform = &select_dom_form($currdom,'srchdomain',1,1);
+ my $domform = &select_dom_form($currdom,'srchdomain',undef,1);
my $srchinsel = ' \n";
@@ -7583,9 +7958,9 @@ sub user_picker {
);
$new_user_create = '
'
.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.")
- .' '
- .&mt('Please contact the [_1]helpdesk[_2] for assistance.'
- ,'','')
+ .' '
+ .&mt('Enter a valid e-mail address as the username for the new user.').' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.'
+ ,'','')
.'
';
}
}
@@ -9281,10 +9656,11 @@ sub restore_settings {
=item * &build_recipient_list()
-Build recipient lists for four types of e-mail:
+Build recipient lists for five types of e-mail:
(a) Error Reports, (b) Package Updates, (c) lonstatus warnings/errors
-(d) Help requests, generated by
-lonerrorhandler.pm, CHECKRPMS, loncron, and lonsupportreq.pm respectively.
+(d) Help requests, (e) Course requests needing approval, generated by
+lonerrorhandler.pm, CHECKRPMS, loncron, lonsupportreq.pm and
+loncoursequeueadmin.pm respectively.
Inputs:
defmail (scalar - email address of default recipient),
@@ -9454,6 +9830,8 @@ sub extract_categories {
my $trailstr;
if ($name eq 'instcode') {
$trailstr = &mt('Official courses (with institutional codes)');
+ } elsif ($name eq 'communities') {
+ $trailstr = &mt('Communities');
} else {
$trailstr = $name;
}
@@ -9566,12 +9944,14 @@ cathash - reference to hash of categorie
currcat - scalar with an & separated list of categories assigned to a course.
+type - scalar contains course type (Course or Community).
+
Returns: $output (markup to be displayed)
=cut
sub assign_categories_table {
- my ($cathash,$currcat) = @_;
+ my ($cathash,$currcat,$type) = @_;
my $output;
if (ref($cathash) eq 'HASH') {
my (@cats,@trails,%allitems,%idx,@jsarray,@path,$maxdepth);
@@ -9580,15 +9960,20 @@ sub assign_categories_table {
if (@cats > 0) {
my $itemcount = 0;
if (ref($cats[0]) eq 'ARRAY') {
- $output = &Apache::loncommon::start_data_table();
my @currcategories;
if ($currcat ne '') {
@currcategories = split('&',$currcat);
}
+ my $table;
for (my $i=0; $i<@{$cats[0]}; $i++) {
my $parent = $cats[0][$i];
- my $css_class = $itemcount%2?' class="LC_odd_row"':'';
next if ($parent eq 'instcode');
+ if ($type eq 'Community') {
+ next unless ($parent eq 'communities');
+ } else {
+ next if ($parent eq 'communities');
+ }
+ my $css_class = $itemcount%2?' class="LC_odd_row"':'';
my $item = &escape($parent).'::0';
my $checked = '';
if (@currcategories > 0) {
@@ -9596,18 +9981,26 @@ sub assign_categories_table {
$checked = ' checked="checked"';
}
}
- $output .= '
';
$itemcount ++;
}
- $output .= &Apache::loncommon::end_data_table();
+ if ($itemcount) {
+ $output = &Apache::loncommon::start_data_table().
+ $table.
+ &Apache::loncommon::end_data_table();
+ }
}
}
}
@@ -9852,12 +10245,26 @@ sub check_clone {
my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);
my $clonemsg;
my $can_clone = 0;
-
+ my $lctype = lc($args->{'crstype'});
+ if ($lctype ne 'community') {
+ $lctype = 'course';
+ }
if ($clonehome eq 'no_host') {
- $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
+ if ($args->{'crstype'} eq 'Community') {
+ $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a non-existent community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
+ } else {
+ $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
+ }
} else {
my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});
- if ($env{'request.role.domain'} eq $args->{'clonedomain'}) {
+ if ($args->{'crstype'} eq 'Community') {
+ if ($clonedesc{'type'} ne 'Community') {
+ $clonemsg = &mt('No new community created.').$linefeed.&mt('A new community could not be cloned from the specified original - [_1] - because it is a course not a community.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});
+ return ($can_clone, $clonemsg, $cloneid, $clonehome);
+ }
+ }
+ if (($env{'request.role.domain'} eq $args->{'clonedomain'}) &&
+ (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) {
$can_clone = 1;
} else {
my %clonehash = &Apache::lonnet::get('environment',['cloners'],
@@ -9868,15 +10275,23 @@ sub check_clone {
} elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) {
$can_clone = 1;
} else {
+ my $ccrole = 'cc';
+ if ($args->{'crstype'} eq 'Community') {
+ $ccrole = 'co';
+ }
my %roleshash =
&Apache::lonnet::get_my_roles($args->{'ccuname'},
$args->{'ccdomain'},
- 'userroles',['active'],['cc'],
+ 'userroles',['active'],[$ccrole],
[$args->{'clonedomain'}]);
- if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
+ if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':'.$ccrole}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
$can_clone = 1;
} else {
- $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
+ if ($args->{'crstype'} eq 'Community') {
+ $clonemsg = &mt('No new community created.').$linefeed.&mt('The new community could not be cloned from the existing community because the new community owner ([_1]) does not have cloning rights in the existing community ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
+ } else {
+ $clonemsg = &mt('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
+ }
}
}
}
@@ -9885,7 +10300,7 @@ sub check_clone {
}
sub construct_course {
- my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context) = @_;
+ my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context,$cnum,$category) = @_;
my $outcome;
my $linefeed = ' '."\n";
if ($context eq 'auto') {
@@ -9923,7 +10338,8 @@ sub construct_course {
$args->{'crscode'},
$args->{'ccuname'}.':'.
$args->{'ccdomain'},
- $args->{'crstype'});
+ $args->{'crstype'},
+ $cnum,$context,$category);
# Note: The testing routines depend on this being output; see
# Utils::Course. This needs to at least be output as a comment
@@ -10210,6 +10626,21 @@ sub construct_course {
$outcome .= ($fatal?$errtext:'write ok').$linefeed;
}
+ if ($args->{'cloneroster'}) {
+ my ($numadded,$clisterror) = &Apache::lonclonecourse::copyroster($cloneid,$$courseid,$args->{'startaccess'},$args->{'endaccess'});
+ if ($clisterror) {
+ $outcome .= "\0".&mt('An error occurred when copying the student roster from the old course to the new course; the error was: [_1].',$clisterror).$linefeed;
+ if ($numadded) {
+ $outcome .= &mt('Although [quant,_1,student] have received roles in the new course the roster does not report this. It is ').$linefeed;
+ }
+ } else {
+ if ($numadded) {
+ $outcome .= "\0".&mt('[quant,_1,student] copied from roster for old course to roster for new course.',$numadded).$linefeed;
+ } else {
+ $outcome .= "\0".&mt('No students have been enrolled in the new Concept Test.').' '.&mt('This is because either (a) an error occurred, or (b) there were no students with either current access or access which ended on/after the current default end date set for access to the old course.').$linefeed;
+ }
+ }
+ }
return (1,$outcome);
}
@@ -10237,6 +10668,16 @@ sub group_term {
return $names{$crstype};
}
+sub course_types {
+ my @types = ('official','unofficial','community');
+ my %typename = (
+ official => 'Official course',
+ unofficial => 'Unofficial course',
+ community => 'Community',
+ );
+ return (\@types,\%typename);
+}
+
sub icon {
my ($file)=@_;
my $curfext = lc((split(/\./,$file))[-1]);
@@ -10466,6 +10907,60 @@ sub _add_to_env {
}
}
+sub new_roles_update {
+ my $rolecount = 0;
+ foreach my $envkey (keys(%env)) {
+ next unless ($envkey =~ /^user\.role\./);
+ $rolecount ++;
+ }
+ my $newrolecount = 0;
+ if (!$rolecount) {
+ my %userenv;
+ foreach my $crstype ('official','unofficial','community') {
+ $userenv{'canrequest.'.$crstype} =
+ &Apache::lonnet::usertools_access($env{'user.name'},
+ $env{'user.domain'},$crstype,'reload','requestcourses');
+ }
+ my $then=$env{'user.login.time'};
+ my $refresh=time;
+ my (%userroles,%allroles,%allgroups,@newroles);
+ my %roleshash =
+ &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'},'userroles',['active','future','previous'],undef,undef,1);
+ foreach my $item (keys(%roleshash)) {
+ my ($uname,$udom,$role,$section) = split(':',$item);
+ my $where = '/'.$udom.'/'.$uname;
+ my ($tstart,$tend) = split(':',$roleshash{$item});
+ if ($section ne '') {
+ $where .= '/'.$section;
+ }
+ my $spec = $role.'.'.$where;
+ &Apache::lonnet::set_arearole($role,$where,$tstart,$tend,
+ $env{'user.domain'},$env{'user.name'});
+ $userroles{'user.role.'.$spec} = $tstart.'.'.$tend;
+ $newrolecount ++;
+ unless (grep(/^\Q$role\E$/,@newroles)) {
+ push(@newroles,$role);
+ }
+ my $status =
+ &Apache::lonnet::curr_role_status($tstart,$tend,$refresh,$then);
+ if ($status eq 'active') {
+ &Apache::lonnet::gather_roleprivs(\%allroles,\%allgroups,\%userroles,
+ $where,$role,$tstart,$tend);
+ }
+ }
+ if (@newroles) {
+ my ($author,$adv) = &Apache::lonnet::set_userprivs(\%userroles,\%allroles,
+ \%allgroups);
+ &Apache::lonnet::appenv(\%userroles,[@newroles,'cm']);
+ $userenv{'user.adv'} = $adv;
+ $userenv{'user.author'} = $author;
+ $userenv{'user.refresh.time'} = $refresh;
+ }
+ &Apache::lonnet::appenv(\%userenv);
+ }
+ return $newrolecount;
+}
+
# --- Get the symbolic name of a problem and the url
sub get_symb {
my ($request,$silent) = @_;
@@ -10507,6 +11002,151 @@ sub clean_symb {
return ($symb,$enc);
}
+sub needs_gci_custom {
+ my $custommenu;
+ my $numdc = &check_for_gci_dc();
+ unless ($numdc) {
+ my $then=$env{'user.login.time'};
+ my $now = time;
+ my %cnums = (
+ review => '9615072b469884921gcil1',
+ submit => '1H96711d710194bfegcil1',
+ );
+ if ($env{'user.role.st./gci/'.$cnums{'review'}}) {
+ my ($start,$end) =
+ split('.',$env{'user.role.st./gci/'.$cnums{'review'}});
+ if (((!$start) || ($start && $start <= $now)) &&
+ ((!$end) || ($end > $now))) {
+ $custommenu = 1;
+ if ($env{'user.role.cc./gci/'.$cnums{'review'}}) {
+ my ($ccstart,$ccend) =
+ split('.',$env{'user.role.cc./gci/'.$cnums{'review'}});
+ if (((!$start) || ($start && $start <= $now)) &&
+ ((!$end) || ($end > $now))) {
+ $custommenu = '';
+ }
+ }
+ }
+ }
+ }
+ return $custommenu;
+}
+
+sub check_for_gci_dc {
+ my $then=$env{'user.login.time'};
+ my $numdc = 0;
+ foreach my $dom ('gci','gcitest') {
+ if ($env{'user.role.dc./'.$dom.'/'}) {
+ my $livedc = 1;
+ my ($tstart,$tend)=split(/\./,$env{'user.role.dc./'.$dom.'/'});
+ if ($tstart && $tstart>$then) { $livedc = 0; }
+ if ($tend && $tend <$then) { $livedc = 0; }
+ if ($livedc) {
+ $numdc++;
+ }
+ }
+ }
+ return $numdc;
+}
+
+sub existing_gcitest_courses {
+ my ($role) = @_;
+ my %courses;
+ my $cdom = 'gcitest';
+ my $now = time;
+ foreach my $envkey (keys(%env)) {
+ my $cnum;
+ if ($envkey =~ m{^user\.role\.\Q$role\E\./\Q$cdom\E/($match_courseid)$}) {
+ $cnum = $1;
+ } else {
+ next;
+ }
+ my ($tstart,$tend) = split(/\./,$env{$envkey});
+ if (((!$tstart) || ($tstart < $now)) && ((!$tend) || ($tend > $now))) {
+ my $descr = $env{'course.'.$cdom.'_'.$cnum.'.description'};
+ if ($descr ne '') {
+ $courses{$cdom.'_'.$cnum}{'description'} = $descr;
+ }
+ }
+ }
+ return %courses;
+}
+
+sub gcitest_switcher {
+ my ($role,$formname,%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,$formname) = @_;
+ my $output = <<"ENDJS";
+
+function courseswitcher(caller) {
+ var numcourses = $numcourses;
+ var current = '$current';
+ var choice = document.$formname.newrole.options[document.$formname.newrole.selectedIndex].value;
+ if (choice == '') {
+ if (caller == 'icon') {
+ alert('No Concept Test selected');
+ }
+ document.$formname.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.$formname.newrole.selectedIndex = 0;
+ document.$formname.selectrole.value = '';
+ return;
+ }
+ document.$formname.selectrole.value = '1';
+ document.$formname.submit();
+ return;
+}
+
+ENDJS
+ return $output;
+}
+
+
+
=pod
=back