[LON-CAPA-cvs] cvs: loncom /interface lonpickcourse.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Sun, 05 Nov 2006 20:59:18 -0000


This is a MIME encoded message

--raeburn1162760358
Content-Type: text/plain

raeburn		Sun Nov  5 15:59:18 2006 EDT

  Modified files:              
    /loncom/interface	lonpickcourse.pm 
  Log:
  Start on subdividing monolithic handler() into subroutines.  When pickcourse is called from portfolio form (to choose a course to set conditional course-based access controls) now only courses in which user has an active role are offered as choices, if user does not have $env{'user.adv'} = 1.  
  
  
--raeburn1162760358
Content-Type: text/plain
Content-Disposition: attachment; filename="raeburn-20061105155918.txt"

Index: loncom/interface/lonpickcourse.pm
diff -u loncom/interface/lonpickcourse.pm:1.53 loncom/interface/lonpickcourse.pm:1.54
--- loncom/interface/lonpickcourse.pm:1.53	Fri Nov  3 13:42:11 2006
+++ loncom/interface/lonpickcourse.pm	Sun Nov  5 15:59:17 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Pick a course
 #
-# $Id: lonpickcourse.pm,v 1.53 2006/11/03 18:42:11 raeburn Exp $
+# $Id: lonpickcourse.pm,v 1.54 2006/11/05 20:59:17 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -54,56 +54,52 @@
                                'pickedcourse','instcodefilter',
                                'ownerfilter','coursefilter','multiple',
                                'type','ownerdomfilter']);
-# domain filter and selection
-    my $domainfilter=$env{'form.domainfilter'};
-    $domainfilter=~s/\W//g;
-    unless ($domainfilter) { $domainfilter=''; }
-    my $domainselectform=&Apache::loncommon::select_dom_form($domainfilter,
-                                                          'domainfilter',1);
-# description filter
-    my $descriptfilter=$env{'form.descriptfilter'};
-    unless ($descriptfilter) { $descriptfilter=''; }
-    my $listdescript=&HTML::Entities::encode($descriptfilter,'<>&"');
-# institutional code filter
-    my $instcodefilter=$env{'form.instcodefilter'};
-    unless ($instcodefilter) { $instcodefilter=''; }
-    my $listinstcode=&HTML::Entities::encode($instcodefilter,'<>&"');
-# course owner filter
-    my $ownerfilter=$env{'form.ownerfilter'};
-    $ownerfilter=~s/\W//g;
-    my $listowner=&HTML::Entities::encode($ownerfilter,'<>&"');
-# course ownerdomain filter
-    my $ownerdomfilter=$env{'form.ownerdomfilter'};
-    $ownerdomfilter=~s/\W//g;
-    my $ownerdomselectform=
-       &Apache::loncommon::select_dom_form($ownerdomfilter,'ownerdomfilter',1);
-# course ID filter for DCs only
-    my ($courseidtag,$coursefilter);
-    if ($env{'user.adv'} && $domainfilter && exists($env{'user.role.dc./'.
-                        $domainfilter.'/'})) {
-        $coursefilter=$env{'form.coursefilter'};
-        unless ($coursefilter) { $coursefilter=''; }
-        my $listcourseid=&HTML::Entities::encode($coursefilter,'<>&"');
-        $courseidtag = &mt('LON-CAPA course ID');
-        $courseidtag .= qq|: <input type="text" name="coursefilter" size="25" value="$listcourseid" />
-        <br />
-        |;
-    }
-# last course activity filter and selection
-    my $sincefilter=$env{'form.sincefilter'};
-    $sincefilter=~s/[^\d-]//g;
-    unless ($sincefilter) { $sincefilter=-1; }
-    my $sincefilterform=&Apache::loncommon::select_form($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 ($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 ='<input type="hidden" name="cnameelement" value="'.
+                     $env{'form.cnameelement'}.'" />';
+    }
+
+    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 = '<input type="hidden" name="roleelement" value="'.$roledom.'" />';
+        $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);
@@ -117,10 +113,6 @@
     if ($env{'form.pickedcourse'}) {
         ($cdom,$cnum) = split/_/,$env{'form.pickedcourse'};
     }
-    my $type = $env{'form.type'};
-    if (!defined($env{'form.type'})) {
-        $type = 'Course';
-    }
     if ($env{'form.form'} eq 'cu' && $env{'form.pickedcourse'}) {
         $loaditem{'onload'} ="setSections()";
         ($seclist,$num_sections,$groupslist,$num_groups) = 
@@ -130,157 +122,18 @@
 # 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'}) {
-        my ($row_id) = ($env{'form.cnumelement'} =~ /^crsnum_(\d+)$/);
-        $roles_element = 'role_'.$row_id.'_1';
-        $groups_element = 'group_'.$row_id.'_1';
-        $sec_element = 'section_'.$row_id.'_1';
-        $status_element = 'access_'.$row_id.'_1';
-        $grplist_element = 'grplist_'.$row_id.'_1';
         $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'});
-        $setitems_function = qq|
-function setItems() {
-    opener.document.$env{"form.form"}.activate.checked = true;
-    setRoles();
-    setGroups();
-    setStatus();
-    setSections();
-}
-
-function setRoles() {
-    var numRoles = $num_roles
-    var rolesArray = new Array("$roleslist");
-    var roleNamesArray = new Array("$rolesnameslist");
-    opener.document.$env{"form.form"}.$roles_element.length = 0;
-    if (numRoles == 0) {
-        opener.document.$env{"form.form"}.$roles_element.multiple=false;
-        opener.document.$env{"form.form"}.$roles_element.size=1;
-        opener.document.$env{"form.form"}.$roles_element.options[0] = new Option('No existing roles','',false,false);
-    } else {
-        if (numRoles == 1) {
-            opener.document.$env{"form.form"}.$roles_element.multiple=false;
-            opener.document.$env{"form.form"}.$roles_element.size=1;
-            opener.document.$env{"form.form"}.$roles_element.options[0] = new Option('Select','',true,true);
-            opener.document.$env{"form.form"}.$roles_element.options[1] = new Option(roleNamesArray[0],rolesArray[0],false,false);
-        } else {
-            for (var i=0; i<numRoles; i++) {
-                opener.document.$env{"form.form"}.$roles_element.options[i] = new Option(roleNamesArray[i],rolesArray[i],false,false);
-            }
-            opener.document.$env{"form.form"}.$roles_element.multiple=true;
-            if (numRoles < 3) {
-                opener.document.$env{"form.form"}.$roles_element.size=numRoles;
-            } else {
-                opener.document.$env{"form.form"}.$roles_element.size=3;
-            }
-            opener.document.$env{"form.form"}.$roles_element.options[0].selected = false;
-        }
-    }
-}
-
-function setStatus() {
-    var numStatus = $num_access;
-    var statusArray = new Array("$accesslist");
-    var statusNamesArray = new Array("$accessnameslist");
-    opener.document.$env{"form.form"}.$status_element.multiple=true;
-    opener.document.$env{"form.form"}.$status_element.size=3;
-    for (var i=0; i<numStatus; i++) {
-        opener.document.$env{"form.form"}.$status_element.options[i] = new Option(statusNamesArray[i],statusArray[i],false,false);
-    }
-}
-
-function setGroups() {
-    var numGroups = $num_groups;
-    var groupsArray = new Array("$groupslist");
-    opener.document.$env{"form.form"}.$groups_element.length = 0;
-    if (numGroups == 0) {
-        opener.document.$env{"form.form"}.$groups_element.multiple=false;
-        opener.document.$env{"form.form"}.$groups_element.size=1;
-        opener.document.$env{"form.form"}.$groups_element.options[0] = new Option('No existing groups','',false,false);
-    } else {
-        if (numGroups == 1) {
-            opener.document.$env{"form.form"}.$groups_element.multiple=false;
-            opener.document.$env{"form.form"}.$groups_element.size=1;
-            opener.document.$env{"form.form"}.$groups_element.options[0] = new Option('Select','',true,true);
-            opener.document.$env{"form.form"}.$groups_element.options[1] = new Option('No group','',false,false);
-            opener.document.$env{"form.form"}.$groups_element.options[2] = new Option(groupsArray[0],groupsArray[0],false,false);
-        } else {
-            for (var i=0; i<numGroups; i++) {
-                opener.document.$env{"form.form"}.$groups_element.options[i] = new Option(groupsArray[i],groupsArray[i],false,false);
-            }
-            opener.document.$env{"form.form"}.$groups_element.multiple=true;
-            if (numGroups < 3) {
-                opener.document.$env{"form.form"}.$groups_element.size=numGroups;
-            } else {
-                opener.document.$env{"form.form"}.$groups_element.size=3;
-            }
-            opener.document.$env{"form.form"}.$groups_element.options[0].selected = false;
-        }
-    }
-}
-
-|;
-    }
-    my $jscript;
-    my $typeselectform =  '<select name="type" size="1"';
-    $typeselectform .= ">\n";
-    foreach my $posstype ('Course','Non-standard course') { 
-        $typeselectform.='<option value="'.$posstype.'" "'.
-            ($posstype eq $type ? 'selected="selected" ' : ''). ">$posstype</option>\n";
-    }
-    $typeselectform.="</select>";
-    my $title = &mt('Selecting a [_1]',$type);
-# Setup for multiple course selections, if flag for multiples set.
-    my $multiple = $env{'form.multiple'};
-    my $multelement;
-    if ($multiple) {
-        $title = &mt('Selecting [_1](s)',lc($type));
-        $jscript = &Apache::loncommon::check_uncheck_jscript();
-        $multelement = '<input type="hidden" name="multiple" value="'.$multiple.'" />';
+            &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 %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')
-             );
-   
-    my ($name_code,$name_input);
-    if (defined($env{'form.cnameelement'}) && $env{'form.cnameelement'} ne '') {
-	$name_code = "opener.document.$env{'form.form'}.$env{'form.cnameelement'}.value=cdesc;";
-	$name_input ='<input type="hidden" name="cnameelement" value="'.
-	    $env{'form.cnameelement'}.'" />';
-    }
-    my $submitopener = '';
-    my $autosubmit = '';
-    my $roleelement = '';
-    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 = '<input type="hidden" name="roleelement" value="'.$roledom.'" />';
-        $submitopener = &Apache::lonroles::processpick();
-        $autosubmit = 'process_pick("'.$roledom.'")';
-    }
-    my $instcodeform;
-    if ($type eq 'Course') {
-        $instcodeform = $lt{'cin'}.': <input type="text" name="instcodefilter" 
- size="10" value="'.$listinstcode.'" /><br />';
-    }
     my %elements = (
                      'Course' => {
                                  name  => 'coursepick',
@@ -293,7 +146,8 @@
                                  list  => 'grouplist',
                              },
                     );
-
+    my $setsec_func = &setsec_javascript($seclist,$sec_element,$grplist_element,
+                                         $groupslist,$num_sections);
     $r->print(<<ENDSCRIPT);
 <script>
 function gochoose(cname,cdom,cdesc,multiple,caller) {
@@ -354,43 +208,170 @@
     $lastaction
 }
 
-function setSections() {
-    var numSections = $num_sections
-    var sectionsArray = new Array("$seclist")
-    opener.document.$env{"form.form"}.$sec_element.length = 0
-    if (numSections == 0) {
-        opener.document.$env{"form.form"}.$sec_element.multiple=false
-        opener.document.$env{"form.form"}.$sec_element.size=1;
-        opener.document.$env{"form.form"}.$sec_element.options[0] = new Option('No existing sections','',false,false)
-    } else {
-        if (numSections == 1) {
-            opener.document.$env{"form.form"}.$sec_element.multiple=false;
-            opener.document.$env{"form.form"}.$sec_element.size=1;
-            opener.document.$env{"form.form"}.$sec_element.options[0] = new Option('Select','',true,true);
-            opener.document.$env{"form.form"}.$sec_element.options[1] = new Option('No section','',false,false) 
-            opener.document.$env{"form.form"}.$sec_element.options[2] = new Option(sectionsArray[0],sectionsArray[0],false,false);
+$setsec_func
+
+$setitems_function
+
+$jscript
+</script>
+$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('<form name="courselist" method="post" action="/adm/pickcourse">');
+    my %by_descrip;
+    my $numcourses = keys(%courses);
+    foreach my $course (keys(%courses)) {
+        my $descr;
+        if ($courses{$course} =~ m/^([^:]*):/i) {
+            $descr = &unescape($1);
         } else {
-            for (var i=0; i<numSections; i++) {
-                opener.document.$env{"form.form"}.$sec_element.options[i] = new Option(sectionsArray[i],sectionsArray[i],false,false)
+            $descr = &unescape($courses{$course});
+        }
+        my $description = $descr;
+        push (@{$by_descrip{$description}}, $course);
+    }
+    if ($numcourses > 1 && $multiple) {
+        $r->print('<input type="button" value="check all"
+                  onclick="javascript:checkAll(document.courselist.course_id)" />
+                  &nbsp;&nbsp;<input type="button" value="uncheck all"
+                  onclick="javascript:uncheckAll(document.courselist.course_id)" />
+                  <br /><br />');
+    }
+    foreach my $description (sort { lc($a) cmp lc($b) } (keys(%by_descrip))) {
+        foreach my $course (@{$by_descrip{$description}}) {
+            my $cleandesc=&HTML::Entities::encode($description,'<>&"');
+            $cleandesc=~s/'/\\'/g;
+            my ($cdom,$cnum)=split(/\_/,$course);
+            my ($descr,$instcode,$owner,$ttype) = split/:/,$courses{$course};
+            $r->print(&course_chooser($multiple,$cdom,$cnum,$cleandesc));
+            $r->print($description.'('.
+                      ($Apache::lonnet::domaindescription{$cdom}?
+                       $Apache::lonnet::domaindescription{$cdom}:$cdom).")");
+            unless ($instcode eq '') {
+                $r->print(" - ".&unescape($instcode));
             }
-            opener.document.$env{"form.form"}.$sec_element.multiple=true
-            if (numSections < 3) {
-                opener.document.$env{"form.form"}.$sec_element.size=numSections;
-            } else {
-                opener.document.$env{"form.form"}.$sec_element.size=3;
+            unless ($owner eq '') {
+                $r->print(", owner - ".&unescape($owner));
             }
-            opener.document.$env{"form.form"}.$sec_element.options[0].selected = false
+            unless ($ttype eq '') {
+                $r->print('('.&Apache::lonnet::unescape($ttype).')');
+            }
+            if ($multiple) { $r->print("</label>\n"); }
+            $r->print("<br />\n");
         }
     }
-    opener.document.$env{"form.form"}.$grplist_element.value='$groupslist';
-    self.close()
+    if (!%courses) {
+        $r->print(&mt('None found'));
+    } elsif ($multiple) {
+        $r->print('<input type="button" value="Submit" onClick="gochoose('."'','','',1)".'" />');
+    }
+    $r->print('<input type="hidden" name="form" value="'.$env{'form.form'}.'" />'.
+              "\n".'<input type="hidden" name="pickedcourse" value="" />'."\n".
+              '<input type="hidden" name="cnumelement" value="'.$env{'form.cnumelement'}.'" />'."\n".
+              '<input type="hidden" name="cdomelement" value="'.$env{'form.cdomelement'}.'" />'."\n".
+              '<input type="hidden" name="type" value="'.$type.'" />'."\n");
+    if ((exists($env{'form.roleelement'})) && ($env{'form.form'} eq 'rolechoice')) {
+        $r->print('<input type="hidden" name="roleelement" value="'.
+                  $env{'form.roleelement'}.'" />'."\n");
+    }
+    $r->print("</form>\n");
+    return;
 }
 
-$setitems_function
 
-$jscript
-</script>
-$submitopener
+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 = '<input type="hidden" name="multiple" value="'.$multiple.'" />';
+    }
+    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').
+                     '<input type="text" name="coursefilter" size="25" value="'.                     $list->{'coursefilter'}.'" /><br />';
+    }
+    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 =  '<select name="type" size="1"';
+    $typeselectform .= ">\n";
+    if ($type eq 'Course') {
+        $instcodeform = $lt{'cin'}.': <input type="text" name="instcodefilter"
+ size="10" value="'.$list->{'instcodefilter'}.'" /><br />';
+    }
+    foreach my $posstype ('Course','Non-standard course') {
+        $typeselectform.='<option value="'.$posstype.'" "'.
+            ($posstype eq $type ? 'selected="selected" ' : ''). ">$posstype</option>\n";
+    }
+    $typeselectform.="</select>";
+    my $output = <<"END";
 <form method="post" name="filterpicker" action="/adm/pickcourse">
 <input type="hidden" name="cnumelement" value="$env{'form.cnumelement'}" />
 <input type="hidden" name="cdomelement" value="$env{'form.cdomelement'}" />
@@ -406,94 +387,55 @@
 <br />
 $instcodeform
 $lt{'cow'}:
-<input type="text" name="ownerfilter" size="10" value="$listowner" />
+<input type="text" name="ownerfilter" size="10" value="$list->{'ownerfilter'}" />
 <br />
 $lt{'cod'}: $ownerdomselectform
 <br />
 $courseidtag
 $lt{'cde'}:
-<input type="text" name="descriptfilter" size="40" value="$listdescript" />
+<input type="text" name="descriptfilter" size="40" value="$list->{'descriptfilter'}" />
 <p><input type="submit" name="gosearch" value="Search" /></p>
 </form>
 <hr />
-ENDSCRIPT
-# ---------------------------------------------------------------- Get the data
-    if ($env{'form.gosearch'}) {
+END
+    return $output; 
+}
+
+sub search_courses {
+    my ($r,$type,$onlyown,$filter) = @_;
+    my %courses;
+    if (!$onlyown) {
         $r->print(&mt('Searching').' ...<br />&nbsp;<br />');
         $r->rflush();
-	unless ($descriptfilter) { $descriptfilter='.'; }
-        unless ($instcodefilter) { $instcodefilter='.'; }
-        my $combownerfilter;
-        if (($ownerfilter ne '') || ($ownerdomfilter ne '')) {
-            $combownerfilter = $ownerfilter.':'.$ownerdomfilter;
+        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 ($combownerfilter eq '') { $combownerfilter='.'; }
-        if ($coursefilter eq '') { $coursefilter='.'; }
         if ($type eq '') { $type = '.'; }
-        my $timefilter=($sincefilter==-1?1:time-$sincefilter);
-	my %courses = &Apache::lonnet::courseiddump($domainfilter,$descriptfilter,
-                                     $timefilter,$instcodefilter,$combownerfilter,
-                                     $coursefilter,undef,undef,$type);
-	$r->print('<form name="courselist" method="post" action="/adm/pickcourse">');
-	my %by_descrip;
-        my $numcourses = keys(%courses);
-	foreach my $course (keys(%courses)) {
-            my $descr;
-            if ($courses{$course} =~ m/^([^:]*):/i) {
-                $descr = &unescape($1);
-            } else {
-                $descr = &unescape($courses{$course});
-            }
-            my $description = $descr;
-            push (@{$by_descrip{$description}}, $course);
-	}
-        if ($numcourses > 1 && $multiple) {
-            $r->print('<input type="button" value="check all"
-                    onclick="javascript:checkAll(document.courselist.course_id)" />                    &nbsp;&nbsp;<input type="button" value="uncheck all"
-                    onclick="javascript:uncheckAll(document.courselist.course_id)" />
-                    <br /><br />');
-        }
-	foreach my $description (sort 
-				 { lc($a) cmp lc($b) } (keys(%by_descrip))) {
-            foreach my $course (@{$by_descrip{$description}}) {
-	        my $cleandesc=&HTML::Entities::encode($description,'<>&"');
-	        $cleandesc=~s/'/\\'/g;
-	        my ($cdom,$cnum)=split(/\_/,$course);
-                my ($descr,$instcode,$owner,$ttype) = split/:/,$courses{$course};
-                $r->print(&course_chooser($multiple,$cdom,$cnum,$cleandesc));
-	        $r->print($description.'('.
-		      ($Apache::lonnet::domaindescription{$cdom}?
-                       $Apache::lonnet::domaindescription{$cdom}:$cdom).")");
-                unless ($instcode eq '') {
-                    $r->print(" - ".&unescape($instcode));
-                }
-                unless ($owner eq '') {
-                    $r->print(", owner - ".&unescape($owner));
-                }
-                unless ($ttype eq '') {
-                    $r->print('('.&Apache::lonnet::unescape($ttype).')');
-                }
-		if ($multiple) { $r->print("</label>\n"); }
-                $r->print("<br />\n");
-            }
-	}
-	if (!%courses) { 
-            $r->print(&mt('None found'));
-        } elsif ($multiple) {
-            $r->print('<input type="button" value="Submit" onClick="gochoose('."'','','',1)".'" />');
-        }
-        $r->print('<input type="hidden" name="form" value="'.$env{'form.form'}.'" />'."\n".
-                   '<input type="hidden" name="pickedcourse" value="" />'."\n".
-                   '<input type="hidden" name="cnumelement" value="'.$env{'form.cnumelement'}.'" />'."\n".
-                   '<input type="hidden" name="cdomelement" value="'.$env{'form.cdomelement'}.'" />'."\n".
-                   '<input type="hidden" name="type" value="'.$type.'" />'."\n");
-        if ((exists($env{'form.roleelement'})) && ($env{'form.form'} eq 'rolechoice')) {
-           $r->print('<input type="hidden" name="roleelement" value="'.$env{'form.roleelement'}.'" />'."\n");
+        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('<br />');
+        foreach my $cid (sort(&Apache::loncommon::findallcourses())) {
+            $courses{$cid} = $env{'course.'.$cid.'.description'};
         }
-        $r->print("</form>\n");
     }
-    $r->print(&Apache::loncommon::end_page());
-    return OK;
+    return %courses;
 }
 
 sub course_chooser {
@@ -508,6 +450,136 @@
     return $output;
 }
 
+sub setsec_javascript {
+    my ($seclist,$sec_element,$grplist_element,$groupslist,$num_sections) = @_;
+    my $sectsections = qq|
+function setSections() {
+    var numSections = $num_sections
+    var sectionsArray = new Array("$seclist")
+    opener.document.$env{"form.form"}.$sec_element.length = 0
+    if (numSections == 0) {
+        opener.document.$env{"form.form"}.$sec_element.multiple=false
+        opener.document.$env{"form.form"}.$sec_element.size=1;
+        opener.document.$env{"form.form"}.$sec_element.options[0] = new Option('No existing sections','',false,false)
+    } else {
+        if (numSections == 1) {
+            opener.document.$env{"form.form"}.$sec_element.multiple=false;
+            opener.document.$env{"form.form"}.$sec_element.size=1;
+            opener.document.$env{"form.form"}.$sec_element.options[0] = new Option('Select','',true,true);
+            opener.document.$env{"form.form"}.$sec_element.options[1] = new Option('No section','',false,false)
+            opener.document.$env{"form.form"}.$sec_element.options[2] = new Option(sectionsArray[0],sectionsArray[0],false,false);
+        } else {
+            for (var i=0; i<numSections; i++) {
+                opener.document.$env{"form.form"}.$sec_element.options[i] = new Option(sectionsArray[i],sectionsArray[i],false,false)
+            }
+            opener.document.$env{"form.form"}.$sec_element.multiple=true
+            if (numSections < 3) {
+                opener.document.$env{"form.form"}.$sec_element.size=numSections;            } else {
+                opener.document.$env{"form.form"}.$sec_element.size=3;
+            }
+            opener.document.$env{"form.form"}.$sec_element.options[0].selected = false
+        }
+    }
+    opener.document.$env{"form.form"}.$grplist_element.value='$groupslist';
+    self.close()
+}
+|;
+}
+
+sub setitems_javascript {
+    my ($seclist,$num_sections,$groupslist,$num_groups,$roleslist,$num_roles,
+        $rolesnameslist,$accesslist,$num_access,$accessnameslist) = @_;
+    my ($row_id) = ($env{'form.cnumelement'} =~ /^crsnum_(\d+)$/);
+    my $roles_element = 'role_'.$row_id.'_1';
+    my $groups_element = 'group_'.$row_id.'_1';
+    my $sec_element = 'section_'.$row_id.'_1';
+    my $status_element = 'access_'.$row_id.'_1';
+    my $grplist_element = 'grplist_'.$row_id.'_1';
+    my $setitems_function = qq|
+function setItems() {
+    opener.document.$env{"form.form"}.activate.checked = true;
+    setRoles();
+    setGroups();
+    setStatus();
+    setSections();
+}
+
+function setRoles() {
+    var numRoles = $num_roles
+    var rolesArray = new Array("$roleslist");
+    var roleNamesArray = new Array("$rolesnameslist");
+    opener.document.$env{"form.form"}.$roles_element.length = 0;
+    if (numRoles == 0) {
+        opener.document.$env{"form.form"}.$roles_element.multiple=false;
+        opener.document.$env{"form.form"}.$roles_element.size=1;
+        opener.document.$env{"form.form"}.$roles_element.options[0] = new Option('No existing roles','',false,false);
+    } else {
+        if (numRoles == 1) {
+            opener.document.$env{"form.form"}.$roles_element.multiple=false;
+            opener.document.$env{"form.form"}.$roles_element.size=1;
+            opener.document.$env{"form.form"}.$roles_element.options[0] = new Option('Select','',true,true);
+            opener.document.$env{"form.form"}.$roles_element.options[1] = new Option(roleNamesArray[0],rolesArray[0],false,false);
+        } else {
+            for (var i=0; i<numRoles; i++) {
+                opener.document.$env{"form.form"}.$roles_element.options[i] = new Option(roleNamesArray[i],rolesArray[i],false,false);
+            }
+            opener.document.$env{"form.form"}.$roles_element.multiple=true;
+            if (numRoles < 3) {
+                opener.document.$env{"form.form"}.$roles_element.size=numRoles;
+            } else {
+                opener.document.$env{"form.form"}.$roles_element.size=3;
+            }
+            opener.document.$env{"form.form"}.$roles_element.options[0].selected = false;
+        }
+    }
+}
+
+function setStatus() {
+    var numStatus = $num_access;
+    var statusArray = new Array("$accesslist");
+    var statusNamesArray = new Array("$accessnameslist");
+    opener.document.$env{"form.form"}.$status_element.multiple=true;
+    opener.document.$env{"form.form"}.$status_element.size=3;
+    for (var i=0; i<numStatus; i++) {
+        opener.document.$env{"form.form"}.$status_element.options[i] = new Option(statusNamesArray[i],statusArray[i],false,false);
+    }
+}
+
+function setGroups() {
+    var numGroups = $num_groups;
+    var groupsArray = new Array("$groupslist");
+    opener.document.$env{"form.form"}.$groups_element.length = 0;
+    if (numGroups == 0) {
+        opener.document.$env{"form.form"}.$groups_element.multiple=false;
+        opener.document.$env{"form.form"}.$groups_element.size=1;
+        opener.document.$env{"form.form"}.$groups_element.options[0] = new Option('No existing groups','',false,false);
+    } else {
+        if (numGroups == 1) {
+            opener.document.$env{"form.form"}.$groups_element.multiple=false;
+            opener.document.$env{"form.form"}.$groups_element.size=1;
+            opener.document.$env{"form.form"}.$groups_element.options[0] = new Option('Select','',true,true);
+            opener.document.$env{"form.form"}.$groups_element.options[1] = new Option('No group','',false,false);
+            opener.document.$env{"form.form"}.$groups_element.options[2] = new Option(groupsArray[0],groupsArray[0],false,false);
+        } else {
+            for (var i=0; i<numGroups; i++) {
+                opener.document.$env{"form.form"}.$groups_element.options[i] = new Option(groupsArray[i],groupsArray[i],false,false);
+            }
+            opener.document.$env{"form.form"}.$groups_element.multiple=true;
+            if (numGroups < 3) {
+                opener.document.$env{"form.form"}.$groups_element.size=numGroups;
+            } else {
+                opener.document.$env{"form.form"}.$groups_element.size=3;
+            }
+            opener.document.$env{"form.form"}.$groups_element.options[0].selected = false;
+        }
+    }
+}
+
+|;
+    return ($sec_element,$grplist_element,$setitems_function);
+
+}
+
 sub build_selection_lists {
     my ($cdom,$cnum,$type,$needroles,$needaccess,$caller) = @_;
     my ($sections,$groups,$allroles,$roleshash,$accesshash) = 

--raeburn1162760358--