# The LearningOnline Network
# Pick a course
#
# $Id: lonpickcourse.pm,v 1.54 2006/11/05 20:59:17 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/
#
package Apache::lonpickcourse;
use strict;
use Apache::Constants qw(:common);
use Apache::loncommon;
use Apache::loncoursedata;
use Apache::lonnet;
use Apache::lonlocal;
use Apache::longroup;
use lib '/home/httpd/lib/perl/';
use LONCAPA;
sub handler {
my $r = shift;
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
return OK if $r->header_only;
# ------------------------------------------------------------ Print the screen
# Get parameters from query string
&Apache::loncommon::get_unprocessed_cgi
($ENV{'QUERY_STRING'},['domainfilter','descriptfilter',
'sincefilter','form','cnumelement',
'cdomelement','cnameelement','roleelement',
'pickedcourse','instcodefilter',
'ownerfilter','coursefilter','multiple',
'type','ownerdomfilter']);
my ($type,$title,$jscript,$multelement,$multiple,$name_code,$name_input,
$roleelement);
$type = $env{'form.type'};
if (!defined($env{'form.type'})) {
$type = 'Course';
}
$title = &mt('Selecting a [_1]',$type);
# Setup for multiple course selections, if flag for multiples set.
($title,$jscript,$multelement,$multiple) = &multiples_tag($type,$title);
if (defined($env{'form.cnameelement'}) && $env{'form.cnameelement'} ne '') {
$name_code = "opener.document.$env{'form.form'}.$env{'form.cnameelement'}.".
"value=cdesc;";
$name_input ='';
}
my $submitopener = '';
my $autosubmit = '';
my $lastaction = 'self.close()';
if ($env{'form.form'} eq 'cu') {
$lastaction = 'document.courselist.pickedcourse.value = cdom+"_"+cname;'."\n".
'document.courselist.submit();';
}
if ($env{'form.form'} eq 'portform') {
$lastaction = 'document.courselist.pickedcourse.value = cdom+"_"+cname;'."\n".
'document.courselist.submit();';
}
my $roledom = $env{'form.roleelement'};
if ($roledom) {
$roleelement = '';
$submitopener = &Apache::lonroles::processpick();
$autosubmit = 'process_pick("'.$roledom.'")';
}
my (%filter,%list);
my $filterdisplay;
my $onlyown = 0;
if ((($env{'form.form'} eq 'portform') && ($env{'user.adv'}))) {
$onlyown = 1;
} else {
$filterdisplay = &build_filters($type,$name_input,$roleelement,
$multelement, \%filter,\%list);
}
# if called from loncreateuser, report sections, then close
my (%loaditem,$seclist,$groupslist,$roleslist,$rolesnameslist,
$accesslist,$accessnameslist);
my $sec_element = 'currsec';
my $grplist_element = 'groups';
my $num_sections = 0;
my $num_groups = 0;
my $num_roles = 0;
my $num_access = 0;
my ($cdom,$cnum);
if ($env{'form.pickedcourse'}) {
($cdom,$cnum) = split/_/,$env{'form.pickedcourse'};
}
if ($env{'form.form'} eq 'cu' && $env{'form.pickedcourse'}) {
$loaditem{'onload'} ="setSections()";
($seclist,$num_sections,$groupslist,$num_groups) =
&build_selection_lists($cdom,$cnum,$type,undef,undef,
$env{'form.form'});
}
# if called from portfolio, report roles, sections, groups and close
my ($roles_element,$groups_element,$status_element,$setitems_function);
if ($env{'form.form'} eq 'portform' && $env{'form.pickedcourse'}) {
$loaditem{'onload'} ="setItems()";
($seclist,$num_sections,$groupslist,$num_groups,$roleslist,$num_roles,
$rolesnameslist,$accesslist,$num_access,$accessnameslist) =
&build_selection_lists($cdom,$cnum,$type,1,1,$env{'form.form'});
($sec_element,$grplist_element,$setitems_function) =
&setitems_javascript($seclist,$num_sections,$groupslist,$num_groups,
$roleslist,$num_roles,$rolesnameslist,
$accesslist,$num_access,$accessnameslist);
}
$r->print(&Apache::loncommon::start_page($title,undef,
{'add_entries' => \%loaditem,
'no_nav_bar' => 1, }));
my %elements = (
'Course' => {
name => 'coursepick',
total => 'coursetotal',
list => 'courselist',
},
'Non-standard course' => {
name => 'grouppick',
total => 'grouptotal',
list => 'grouplist',
},
);
my $setsec_func = &setsec_javascript($seclist,$sec_element,$grplist_element,
$groupslist,$num_sections);
$r->print(<
function gochoose(cname,cdom,cdesc,multiple,caller) {
var openerForm = "$env{'form.form'}";
courseCount = 0;
var courses = '';
if (multiple) {
if (typeof(document.courselist.course_id.length) == 'undefined') {
// only 1 course checkbox was created
if (document.courselist.course_id.checked) {
courses = courses + document.courselist.course_id.value + "&&";
courseCount ++;
}
} else {
for (var j=0; j 0) {
courses = courses.substr(0,courses.length-2);
opener.document.$env{'form.form'}.$elements{$type}{'list'}.value = courses;
}
} else {
$name_code
opener.document.$env{'form.form'}.$env{'form.cnumelement'}.value=cname;
var slct=opener.document.$env{'form.form'}.$env{'form.cdomelement'};
if (slct.options == undefined) {
opener.document.$env{'form.form'}.$env{'form.cdomelement'}.value=cdom;
}
else {
var i;
for (i=0;i
$submitopener
ENDSCRIPT
$r->print($filterdisplay);
# ---------------------------------------------------------------- Get the data
if ($env{'form.gosearch'} || $onlyown) {
my %courses = &search_courses($r,$type,$onlyown,\%filter);
&display_matched_courses($r,$type,$multiple,%courses);
}
$r->print(&Apache::loncommon::end_page());
return OK;
}
sub display_matched_courses {
my ($r,$type,$multiple,%courses) = @_;
$r->print('\n");
return;
}
sub multiples_tag {
my ($type,$title) = @_;
my ($jscript,$multelement,$multiple);
$multiple = $env{'form.multiple'};
if ($multiple) {
$title = &mt('Selecting [_1](s)',lc($type));
$jscript = &Apache::loncommon::check_uncheck_jscript();
$multelement = '';
}
return ($title,$jscript,$multelement,$multiple);
}
sub build_filters {
my ($type,$name_input,$roleelement,$multelement,$filter,$list) = @_;
my @filters = ('domainfilter','descriptfilter','instcodefilter','ownerfilter','ownerdomfilter');
# course ID filter for DCs only
my ($courseidtag,$domainselectform,$sincefilterform,$ownerdomselectform,
$instcodeform,$typeselectform);
if ($env{'user.adv'} && $env{'form.domainfilter'} &&
exists($env{'user.role.dc./'.$env{'form.domainfilter'}})) {
push(@filters,'coursefilter');
$courseidtag=&mt('LON-CAPA course ID').
' ';
}
foreach my $item (@filters) {
$filter->{$item} = $env{'form.'.$item};
if ($item ne 'descriptfilter' && $item ne 'instcodefilter') {
$filter->{$item} =~ s/\W//g;
if (!$filter->{$item}) {
$filter->{$item} = '';
}
}
if ($item eq 'domainfilter') {
$domainselectform =
&Apache::loncommon::select_dom_form($filter->{$item},'domainfilter',1);
} elsif ($item eq 'ownerdomfilter') {
$ownerdomselectform =
&Apache::loncommon::select_dom_form($filter->{$item},'ownerdomfilter',1);
} else {
$list->{$item} = &HTML::Entities::encode($filter->{$item},'<>&"');
}
}
# last course activity filter and selection
$filter->{'sincefilter'} = $env{'form.sincefilter'};
$filter->{'sincefilter'} =~ s/[^\d-]//g;
if (!$filter->{'sincefilter'}) { $filter->{'sincefilter'}=-1; }
$sincefilterform=&Apache::loncommon::select_form($filter->{'sincefilter'},
'sincefilter',('-1'=>'',
'86400' => 'today',
'604800' => 'last week',
'2592000' => 'last month',
'7776000' => 'last three months',
'15552000' => 'last six months',
'31104000' => 'last year',
'select_form_order' =>
['-1','86400','604800','2592000','7776000',
'15552000','31104000']));
my %lt = (
'cac' => &mt('[_1] Activity',$type),
'cde' => &mt('[_1] Description',$type),
'cdo' => &mt('[_1] Domain',$type),
'cin' => &mt('Course Institutional Code'),
'cow' => &mt("[_1] Owner's Username",$type),
'cod' => &mt("[_1] Owner's Domain", $type),
'cog' => &mt('Course Type')
);
$typeselectform = ' ';
}
foreach my $posstype ('Course','Non-standard course') {
$typeselectform.='\n";
}
$typeselectform.="";
my $output = <<"END";
END
return $output;
}
sub search_courses {
my ($r,$type,$onlyown,$filter) = @_;
my %courses;
if (!$onlyown) {
$r->print(&mt('Searching').' ...
');
$r->rflush();
if (($filter->{'ownerfilter'} ne '') ||
($filter->{'ownerdomfilter'} ne '')) {
$filter->{'combownerfilter'} = $filter->{'ownerfilter'}.':'.
$filter->{'ownerdomfilter'};
}
foreach my $item ('descriptfilter','instcodefilter','coursefilter',
'combownerfilter') {
if (!$filter->{$item}) {
$filter->{$item}='.';
}
}
if ($type eq '') { $type = '.'; }
my $timefilter =
($filter->{'sincefilter'}==-1?1:time-$filter->{'sincefilter'});
%courses =
&Apache::lonnet::courseiddump($filter->{'domainfilter'},
$filter->{'descriptfilter'},
$timefilter,
$filter->{'instcodefilter'},
$filter->{'combownerfilter'},
$filter->{'coursefilter'},
undef,undef,$type);
} else {
$r->print(' ');
foreach my $cid (sort(&Apache::loncommon::findallcourses())) {
$courses{$cid} = $env{'course.'.$cid.'.description'};
}
}
return %courses;
}
sub course_chooser {
my ($multiple,$cdom,$cnum,$cleandesc) = @_;
my $output;
if ($multiple) {
$output = '