Diff for /loncom/interface/lonpickcourse.pm between versions 1.84 and 1.87

version 1.84, 2009/07/29 22:32:44 version 1.87, 2009/10/30 04:44:56
Line 36  use Apache::lonnet; Line 36  use Apache::lonnet;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::longroup;  use Apache::longroup;
 use Apache::courseclassifier;  use Apache::courseclassifier;
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
Line 50  sub handler { Line 50  sub handler {
     &Apache::loncommon::get_unprocessed_cgi      &Apache::loncommon::get_unprocessed_cgi
         ($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement',          ($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement',
        'cdomelement','cnameelement','roleelement',         'cdomelement','cnameelement','roleelement',
                                'multiple','type','setroles','fixeddom']);                                 'multiple','type','setroles','fixeddom','cloner']);
     my ($type,$title,$jscript,$multelement,$multiple,$roleelement,      my ($type,$title,$jscript,$multelement,$multiple,$roleelement,
         $lastaction,$autosubmit,$submitopener);          $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom);
   
     # Get course type - Course or Community.      # Get course type - Course or Community.
     $type = $env{'form.type'};      $type = $env{'form.type'};
Line 76  sub handler { Line 76  sub handler {
         $autosubmit = 'process_pick("'.$roledom.'")';          $autosubmit = 'process_pick("'.$roledom.'")';
     }      }
   
       # if called when a DC is creating a course
       if ($env{'form.form'} eq 'ccrs') {
           ($cloneruname,$clonerudom) = ($env{'form.cloner'} =~ /^($match_username):($match_domain)$/);
       }
   
       # if called when requesting a course
       if ($env{'form.form'} eq 'requestcrs') {
           $cloneruname = $env{'user.name'};
           $clonerudom =  $env{'user.domain'};
       }
   
     my $onlyown = 0;      my $onlyown = 0;
     # if called to assign course-based portfolio access control      # if called to assign course-based portfolio access control
     if ((($env{'form.form'} eq 'portform') && (!$env{'user.adv'}))) {      if ((($env{'form.form'} eq 'portform') && (!$env{'user.adv'}))) {
Line 91  sub handler { Line 102  sub handler {
   
     if ((($env{'form.form'} eq 'cu') || ($env{'form.form'} eq 'studentform')) &&       if ((($env{'form.form'} eq 'cu') || ($env{'form.form'} eq 'studentform')) && 
         ($env{'form.pickedcourse'})) {          ($env{'form.pickedcourse'})) {
             $loaditem{'onload'} .= 'setSections()';          if ($env{'form.form'} eq 'cu') {
               $loaditem{'onload'} .= 'setRoles();';
           }
           $loaditem{'onload'} .= 'setSections();';
     }      }
     $r->print(&Apache::loncommon::start_page($title,undef,      my $js = &js_changer();
       $r->print(&Apache::loncommon::start_page($title,$js,
      {'add_entries' => \%loaditem,       {'add_entries' => \%loaditem,
       'no_nav_bar'  => 1, }));        'no_nav_bar'  => 1, }));
   
Line 114  sub handler { Line 129  sub handler {
     }      }
   
     # print javascript functions for choosing a course       # print javascript functions for choosing a course 
     if (($env{'form.command'} eq 'gosearch') || $onlyown) {      if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) || 
           $onlyown) {
         $r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction));          $r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction));
     }      }
     $r->print('<script type="text/javascript" language="Javascript">'.$jscript.      $r->print('<script type="text/javascript" language="Javascript">'.$jscript.
Line 146  sub handler { Line 162  sub handler {
             exists($env{'user.role.dc./'.$env{'form.domainfilter'}.'/'})) {              exists($env{'user.role.dc./'.$env{'form.domainfilter'}.'/'})) {
             push(@{$filterlist},'coursefilter');              push(@{$filterlist},'coursefilter');
         }          }
           if ($cloneruname ne '' && $clonerudom ne '') {
               push(@{$filterlist},'cloneableonly');
           }
   
         $r->print(&build_filters($filterlist,$type,$roleelement,$multelement,          $r->print(&build_filters($filterlist,$type,$roleelement,$multelement,
                                  $filter,$action,\$numtitles));                                   $filter,$action,\$numtitles,undef,$cloneruname,
                                    $clonerudom));
     }      }
   
 # ---------------------------------------------------------------- Get the data  # ---------------------------------------------------------------- Get the data
     if (($env{'form.command'} eq 'gosearch') || $onlyown) {      if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) || 
         my %courses = &search_courses($r,$type,$onlyown,$filter,$numtitles);           $onlyown) {
           my %courses = &search_courses($r,$type,$onlyown,$filter,$numtitles,
                                         $cloneruname,$clonerudom);
         if ($nohost) {          if ($nohost) {
             $r->print ('<span class="LC_warning">'.              $r->print ('<span class="LC_warning">'.
                        &mt('User does not exist - username: [_1], domain: [_2].',                         &mt('User does not exist - username: [_1], domain: [_2].',
                            '<b>'.$filter->{'personfilter'}.'</b>',                             '<b>'.$filter->{'personfilter'}.'</b>',
                            '<b>'.$filter->{'persondomfilter'}.'</b>').'</span>');                             '<b>'.$filter->{'persondomfilter'}.'</b>').'</span>');
         } else {          } else {
             &display_matched_courses($r,$type,$multiple,$action,$showroles,%courses);              &display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname,
                                        $clonerudom,%courses);
         }          }
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
     return OK;      return OK;
 }  }
   
   sub js_changer {
       return <<"ENDJS";
   <script type="text/javascript">
   
   function updateFilters(caller) {
       if (typeof(caller) != "undefined") {
           document.filterpicker.updater.value = caller.name;
       }
       document.filterpicker.submit();
   }
   
   </script>
   
   ENDJS
   
   }
   
 sub processpick {  sub processpick {
     my $openerform = 'rolechoice';      my $openerform = 'rolechoice';
     if ($env{'form.form'} eq 'studentform') {      if ($env{'form.form'} eq 'studentform') {
Line 214  sub create_user_javascript { Line 255  sub create_user_javascript {
     my $output;      my $output;
     #javascript for reporting sections and groups then closing      #javascript for reporting sections and groups then closing
     if ($env{'form.pickedcourse'}) {      if ($env{'form.pickedcourse'}) {
         my ($cdom,$cnum) = split/_/,$env{'form.pickedcourse'};          my %coursedescription = 
               &Apache::lonnet::coursedescription($env{'form.pickedcourse'},
                                                  {'one_time' => '1'});
           my $cdom = $coursedescription{'domain'};
           my $cnum = $coursedescription{'num'};
           my $crstype = $coursedescription{'type'};
         my $sec_element = 'currsec';          my $sec_element = 'currsec';
         my $grplist_element = 'groups';          my $grplist_element = 'groups';
         my ($sections,$groups) =          my ($sections,$groups) =
Line 228  sub create_user_javascript { Line 274  sub create_user_javascript {
 function setSections() {  function setSections() {
     opener.document.$env{"form.form"}.$grplist_element.value='$groupslist';      opener.document.$env{"form.form"}.$grplist_element.value='$groupslist';
     window.opener.setSect('$seclist');      window.opener.setSect('$seclist');
     self.close()      self.close();
   }
   function setRoles() {
       window.opener.setRole('$crstype');
 }  }
 </script>  </script>
 |;  |;
Line 238  function setSections() { Line 287  function setSections() {
 }  }
   
 sub display_matched_courses {  sub display_matched_courses {
     my ($r,$type,$multiple,$action,$showroles,%courses) = @_;      my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,%courses) = @_;
     if ($env{'form.form'} eq 'portform') {      if ($env{'form.form'} eq 'portform') {
         $action = '/adm/portfolio';          $action = '/adm/portfolio';
     }      }
Line 315  sub display_matched_courses { Line 364  sub display_matched_courses {
             my $cleandesc=&HTML::Entities::encode($description,'<>&"');              my $cleandesc=&HTML::Entities::encode($description,'<>&"');
             $cleandesc=~s/'/\\'/g;              $cleandesc=~s/'/\\'/g;
             my ($cdom,$cnum)=split(/\_/,$course);              my ($cdom,$cnum)=split(/\_/,$course);
             my ($descr,$instcode,$ttype,@owners);              my ($descr,$instcode,$ttype,$canclone,@owners);
             if (ref($courses{$course}) eq 'HASH') {              if (ref($courses{$course}) eq 'HASH') {
                 $descr = $courses{$course}{'description'};                  $descr = $courses{$course}{'description'};
                 $instcode =  $courses{$course}{'inst_code'};                  $instcode = $courses{$course}{'inst_code'};
                 $ttype =  $courses{$course}{'type'};                  $ttype = $courses{$course}{'type'};
                   if (($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) {
                       my $cloners = $courses{$course}{'cloners'};
                       if ($cloners ne '') { 
                           my @cloneable = split(',',$cloners);
                           if (grep(/^\*$/,@cloneable)) {
                               $canclone = 1;
                           }
                           if (grep(/^\*:\Q$env{'form.clonerudom'}\E$/,@cloneable)) {
                               $canclone = 1;
                           }
                           if (grep(/^\Q$cloneruname\E:\Q$clonerudom\E$/,@cloneable)) {
                               $canclone = 1;
                           }
                       }
                   }
                 push(@owners,&unescape($courses{$course}{'owner'}));                  push(@owners,&unescape($courses{$course}{'owner'}));
                 if (ref($courses{$course}{'co-owners'}) eq 'ARRAY') {                  if (ref($courses{$course}{'co-owners'}) eq 'ARRAY') {
                     foreach my $item (@{$courses{$course}{'co-owners'}}) {                      foreach my $item (@{$courses{$course}{'co-owners'}}) {
Line 332  sub display_matched_courses { Line 396  sub display_matched_courses {
                 push(@owners,&unescape($singleowner));                  push(@owners,&unescape($singleowner));
             }              }
             my $ownerstr = join(', ',@owners);              my $ownerstr = join(', ',@owners);
             $r->print('<td>'.&course_chooser($multiple,$cdom,$cnum,$cleandesc).'</td>');              $r->print('<td>'.&course_chooser($multiple,$cdom,$cnum,$cleandesc,$canclone).'</td>');
             $r->print('<td>'.$description.'</td>');              $r->print('<td>'.$description.'</td>');
             $r->print('<td>');              $r->print('<td>');
             $r->print(&Apache::lonnet::domain($cdom,'description')?              $r->print(&Apache::lonnet::domain($cdom,'description')?
Line 397  sub display_matched_courses { Line 461  sub display_matched_courses {
         $r->print('<input type="hidden" name="setroles" value="'.$env{'form.setroles'}.'" />');          $r->print('<input type="hidden" name="setroles" value="'.$env{'form.setroles'}.'" />');
         $r->print('<input type="hidden" name="action" value="rolepicker" />');          $r->print('<input type="hidden" name="action" value="rolepicker" />');
     } elsif ($env{'form.form'} eq 'modifycourse') {      } elsif ($env{'form.form'} eq 'modifycourse') {
         $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','pickedcourse','type','form','numtitles','state','command']));          $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','pickedcourse','type','form','numtitles','state']));
     } else {      } else {
         $r->print('<input type="hidden" name="cnumelement" value="'.          $r->print('<input type="hidden" name="cnumelement" value="'.
                   $env{'form.cnumelement'}.'" />'."\n".                      $env{'form.cnumelement'}.'" />'."\n".  
Line 424  sub multiples_tag { Line 488  sub multiples_tag {
   
 sub build_filters {  sub build_filters {
     my ($filterlist,$type,$roleelement,$multelement,$filter,$action,      my ($filterlist,$type,$roleelement,$multelement,$filter,$action,
         $numtitlesref,$caller) = @_;          $numtitlesref,$caller,$cloneruname,$clonerudom) = @_;
     my $list;      my ($list,$formname,$fixeddom,$codedom,$jscript);
     my $formname;      $codedom = $env{'request.role.domain'};
     my ($fixeddom,$codedom,$jscript);  
     if (defined($env{'form.form'})) {      if (defined($env{'form.form'})) {
         $formname = $env{'form.form'};          $formname = $env{'form.form'};
     } else {      } else {
Line 435  sub build_filters { Line 498  sub build_filters {
     }      }
     my $onchange;      my $onchange;
     unless ($env{'form.interface'} eq 'textual') {      unless ($env{'form.interface'} eq 'textual') {
         $onchange = 1;          $onchange = 'javascript:updateFilters(this)';
     }      }
     my ($domainselectform,$sincefilterform,$ownerdomselectform,$persondomselectform,      my ($domainselectform,$sincefilterform,$ownerdomselectform,$persondomselectform,
         $instcodeform,$typeselectform,$instcodetitle);          $instcodeform,$typeselectform,$instcodetitle);
Line 456  sub build_filters { Line 519  sub build_filters {
             } elsif ($item eq 'personfilter') {              } elsif ($item eq 'personfilter') {
                 $filter->{$item} = &LONCAPA::clean_username($filter->{$item});                  $filter->{$item} = &LONCAPA::clean_username($filter->{$item});
                 if ($env{'form.persondomfilter'} eq '') {                  if ($env{'form.persondomfilter'} eq '') {
                     unless ($env{'form.command'} eq 'gosearch') {                      unless ($env{'form.gosearch'}) {
                         $filter->{'persondomfilter'} = $env{'request.role.domain'};                          $filter->{'persondomfilter'} = $env{'request.role.domain'};
                     }                      }
                 } else {                  } else {
Line 529  sub build_filters { Line 592  sub build_filters {
   
     $typeselectform =  '<select name="type" size="1"';      $typeselectform =  '<select name="type" size="1"';
     if ($onchange) {      if ($onchange) {
         $typeselectform .= 'onchange=" javascript:submit()"';          $typeselectform .= 'onchange="'.$onchange.'"';
     }      }
     $typeselectform .= '>'."\n";      $typeselectform .= '>'."\n";
     my $officialjs;      
     if ($type eq 'Course') {      my ($cloneableonlyform,$cloneabletitle);
         if (($env{'form.fixeddom'}) || ($env{'form.form'} eq 'requestcrs')) {      if (exists($filter->{'cloneableonly'})) {
             $officialjs = 1;          my $cloneableon = '';
             ($instcodeform,$jscript,$$numtitlesref) =           my $cloneableoff = ' checked="checked"';
                 &instcode_selectors($codedom,'filterpicker',$officialjs);          if ($filter->{'cloneableonly'}) {
         }              $cloneableon = $cloneableoff;
         if ($instcodeform eq '') {              $cloneableoff = '';
             $instcodeform =           }
                 '<input type="text" name="instcodefilter" size="10" value="'.          $cloneableonlyform = '<span class="LC_nobreak"><label><input type="radio" name="cloneableonly" value="1" '.$cloneableon.'/>&nbsp;'.&mt('Required').'</label>'.('&nbsp;'x3).'<label><input type="radio" name="cloneableonly" value="" '.$cloneableoff.' />&nbsp;'.&mt('No restriction').'</label></span>';
                 $list->{'instcodefilter'}.'" />';          if ($env{'form.form'} eq 'ccrs') {
             $instcodetitle = $lt{'ins'};              $cloneabletitle = &mt('Cloneable for').' '.$cloneruname.':'.$clonerudom;
         } else {          } else {
             $instcodetitle = $lt{'inc'};              $cloneabletitle = &mt('Cloneable by you');
         }          }
         if ($env{'form.fixeddom'}) {      }
             $instcodetitle .= '<br />('.$codedom.')';      my $officialjs;
       if ($type eq 'Course') {
           if (exists($filter->{'instcodefilter'})) {
               if (($env{'form.fixeddom'}) || ($formname eq 'requestcrs')
                   || ($formname eq 'modifycourse')) {
                   $officialjs = 1;
                   ($instcodeform,$jscript,$$numtitlesref) = 
                       &instcode_selectors($codedom,'filterpicker',$officialjs);
                   if ($jscript) {
                       $jscript = '<script type="text/javascript" language="Javascript">'.
                                  $jscript.'</script>'."\n";
                   }
               }
               if ($instcodeform eq '') {
                   $instcodeform = 
                       '<input type="text" name="instcodefilter" size="10" value="'.
                       $list->{'instcodefilter'}.'" />';
                   $instcodetitle = $lt{'ins'};
               } else {
                   $instcodetitle = $lt{'inc'};
               }
               if ($env{'form.fixeddom'}) {
                   $instcodetitle .= '<br />('.$codedom.')';
               }
         }          }
     }      }
     $jscript .= <<"END_JS";  
   
 function setCommand() {  
     document.filterpicker.command.value = 'gosearch';  
     return;  
 }  
   
 END_JS  
   
     $jscript = '<script type="text/javascript" language="Javascript">'.$jscript.  
                '</script>'."\n";  
   
     foreach my $posstype ('Course','Community') {      foreach my $posstype ('Course','Community') {
         $typeselectform.='<option value="'.$posstype.'"'.          $typeselectform.='<option value="'.$posstype.'"'.
Line 569  END_JS Line 644  END_JS
     }      }
     $typeselectform.="</select>";      $typeselectform.="</select>";
     my $output = qq|      my $output = qq|
 <form method="post" name="filterpicker" action="$action" onsubmit="setCommand()">  <form method="post" name="filterpicker" action="$action">
 <input type="hidden" name="form" value="$formname" />  <input type="hidden" name="form" value="$formname" />
 |;  |;
     if ($formname eq 'modifycourse') {      if ($formname eq 'modifycourse') {
Line 639  $multelement Line 714  $multelement
                   .$list->{'coursefilter'}.'" />'                    .$list->{'coursefilter'}.'" />'
                   .&Apache::lonhtmlcommon::row_closure();                    .&Apache::lonhtmlcommon::row_closure();
     }      }
       if ($cloneableonlyform) {
           $output .= &Apache::lonhtmlcommon::row_title($cloneabletitle).
                      $cloneableonlyform.&Apache::lonhtmlcommon::row_closure();
       }
     if (exists($filter->{'descriptfilter'})) {      if (exists($filter->{'descriptfilter'})) {
         $output .= &Apache::lonhtmlcommon::row_title($lt{'cde'})          $output .= &Apache::lonhtmlcommon::row_title($lt{'cde'})
                   .'<input type="text" name="descriptfilter" size="40" value="'                    .'<input type="text" name="descriptfilter" size="40" value="'
                   .$list->{'descriptfilter'}.'" />'                    .$list->{'descriptfilter'}.'" />'
                   .&Apache::lonhtmlcommon::row_closure(1);                    .&Apache::lonhtmlcommon::row_closure(1);
     }      }
     $output .= &Apache::lonhtmlcommon::end_pick_box();      $output .= &Apache::lonhtmlcommon::end_pick_box().'<p>';
     $output .= '<p><input type="hidden" name="command" value="">'."\n".      my $warning;
       if (($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) {
           my $cloneruhome=&Apache::lonnet::homeserver($cloneruname,$clonerudom);
           my $cc_clone;
           if ($cloneruhome eq 'no_host') {
               $warning = '<div class="LC_error">'.&mt('Intended course owner does not exist').
                          '</div>';
           } else {
               if ($env{'form.form'} eq 'ccrs') {
                   $output .= '<input type="hidden" name="cloner" value="'.$env{'form.cloner'}.'" />'."\n";
               }
               my %ccroles = &Apache::lonnet::get_my_roles($cloneruname,$clonerudom,
                                                           'userroles',['active'], ['cc']);
               foreach my $key (sort(keys(%ccroles))) {
                   my ($cnum,$cdom,$role) = split(':',$key);
                   $cc_clone .= $cdom.':'.$cnum.'&';
               }
               $cc_clone =~ s/\&$//;
           }
           if ($cc_clone ne '') {
               $output .= '<input type="hidden" name="cc_clone" value="'.$cc_clone.'" />';
           }
       }
       $output .= '<input type="hidden" name="updater" value="">'."\n".
                '<input type="submit" name="gosearch" value="'.                  '<input type="submit" name="gosearch" value="'. 
                &mt('Search').'" /></p>'."\n".'</form>'."\n".'<hr />'."\n";                 &mt('Search').'" /></p>'."\n".'</form>'."\n".'<hr />'."\n";
     return $jscript.$output;      return $jscript.$warning.$output;
 }  }
   
 sub instcode_selectors {  sub instcode_selectors {
Line 680  sub instcode_selectors { Line 782  sub instcode_selectors {
 }  }
   
 sub search_courses {  sub search_courses {
     my ($r,$type,$onlyown,$filter,$numtitles) = @_;      my ($r,$type,$onlyown,$filter,$numtitles,$cloneruname,$clonerudom) = @_;
     my (%courses,%showcourses);      my (%courses,%showcourses,$cloner);
     if (!$onlyown) {      if (!$onlyown) {
         $r->print(&mt('Searching ...').'<br />&nbsp;<br />');          $r->print(&mt('Searching ...').'<br />&nbsp;<br />');
         $r->rflush();          $r->rflush();
Line 714  sub search_courses { Line 816  sub search_courses {
         }          }
         if ($instcodefilter eq '') { $instcodefilter = '.'; }          if ($instcodefilter eq '') { $instcodefilter = '.'; }
         if ($type eq '') { $type = '.'; }          if ($type eq '') { $type = '.'; }
    
           if (($clonerudom ne '') && ($cloneruname ne '')) {
               $cloner = $cloneruname.':'.$clonerudom;  
           }
         %courses =           %courses = 
             &Apache::lonnet::courseiddump($filter->{'domainfilter'},              &Apache::lonnet::courseiddump($filter->{'domainfilter'},
                                           $filter->{'descriptfilter'},                                            $filter->{'descriptfilter'},
Line 721  sub search_courses { Line 827  sub search_courses {
                                           $instcodefilter,                                            $instcodefilter,
                                           $filter->{'combownerfilter'},                                            $filter->{'combownerfilter'},
                                           $filter->{'coursefilter'},                                            $filter->{'coursefilter'},
                                           undef,undef,$type,$regexpok);                                            undef,undef,$type,$regexpok,undef,undef,
                                             undef,undef,$cloner,$env{'form.cc_clone'},
                                             $filter->{'cloneableonly'});
         if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) {          if (($filter->{'personfilter'} ne '') && ($filter->{'persondomfilter'} ne '')) {
             my %rolehash = &Apache::lonnet::get_my_roles($filter->{'personfilter'},              my %rolehash = &Apache::lonnet::get_my_roles($filter->{'personfilter'},
                                                          $filter->{'persondomfilter'},                                                           $filter->{'persondomfilter'},
Line 757  sub search_courses { Line 865  sub search_courses {
 }  }
   
 sub course_chooser {  sub course_chooser {
     my ($multiple,$cdom,$cnum,$cleandesc) = @_;      my ($multiple,$cdom,$cnum,$cleandesc,$canclone) = @_;
     my $output;       my $output; 
     if ($multiple) {      if ($multiple) {
         $output = '<label><input type="checkbox" name="course_id" value="'.$cdom.'_'.$cnum.'" />'."\n";          $output = '<label><input type="checkbox" name="course_id" value="'.$cdom.'_'.$cnum.'" />'."\n";
       } elsif ((($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) && (!$canclone))  {
           if ($env{'form.form'} eq 'ccrs') {
               $output = &mt('No cloning for ').$env{'form.cloner'}."\n";
           } else {
               $output = &mt('No rights to clone')."\n";
           }
     } else {      } else {
         $output = '<input type="button" value="'.&mt('Select').'" onClick="gochoose('.          $output = '<input type="button" value="'.&mt('Select').'" onClick="gochoose('.
                   "'".$cnum."','".$cdom."','".$cleandesc."')".'" />'."\n";                    "'".$cnum."','".$cdom."','".$cleandesc."')".'" />'."\n";
Line 957  javascript code for reporting selected s Line 1071  javascript code for reporting selected s
   
 =item *  =item *
 X<display_matched_courses()>  X<display_matched_courses()>
 B<display_matched_courses($r,$type,$multiple,$action,$showroles,%courses)>:  B<display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,%courses)>:
   
 Input: 7 - request object, course type, multiple (0 or 1), form action, whether to show roles (for course personnel filter), hash of courses.  Input: 7 - request object, course type, multiple (0 or 1), form action, whether to show roles (for course personnel filter), username of new course owner, domain of new course owner, hash of courses.
   
 Output: 0  Output: 0
   
Line 978  Side Effects: None Line 1092  Side Effects: None
   
 =item *  =item *
 X<build_filters()>  X<build_filters()>
 B<build_filters($filterlist,$type,$roleelement,$multelement,$filter,$action,$numfiltersref,$caller)>:  B<build_filters($filterlist,$type,$roleelement,$multelement,$filter,$action,$numfiltersref,$caller,$cloneruname,$clonerudom)>:
   
   
 Input: 7 - anonymous array of search criteria; course type; $roleelement ; $multelement ; anonymous hash of criteria and their values; form action; ref to scalar (count of number of elements in institutional codes -- e.g., 4 for year, semester, department, and number); caller context (e.g., set to 'modifycourse' when routine is called from lonmodifycourse.pm).  Input: 7 - anonymous array of search criteria; course type; $roleelement ; $multelement ; anonymous hash of criteria and their values; form action; ref to scalar (count of number of elements in institutional codes -- e.g., 4 for year, semester, department, and number); caller context (e.g., set to 'modifycourse' when routine is called from lonmodifycourse.pm).
Line 989  Side Effects: None Line 1103  Side Effects: None
   
 =item *  =item *
 X<search_courses()>  X<search_courses()>
 B<search_courses($r,$type,$onlyown,$filter,$numtitles)>:  B<search_courses($r,$type,$onlyown,$filter,$numtitles,$cloneruname,$clonerudom)>:
   
   
 Input: 5 -  request object, course type, search scope: only courses in which user has active role (1), or any course (0); anonymous hash of criteria and their values; for institutional codes - number of categories).    Input: 7 -  request object, course type, search scope: only courses in which user has active role (1), or any course (0); anonymous hash of criteria and their values; for institutional codes - number of categories; optional username of new course owner, optional domain of new course owner). Last two needed when search is for courses to clone from course request form, or course creation form (DC).   
   
 Output: 1 - %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type.  Output: 1 - %courses - hash of courses satisfying search criteria, keys = course IDs, values are corresponding colon-separated escaped description, institutional code, owner and type.
   
Line 1001  Side Effects: None Line 1115  Side Effects: None
   
 =item *  =item *
 X<course_chooser()>  X<course_chooser()>
 B<course_chooser($multiple,$cdom,$cnum,$cleandesc)>:  B<course_chooser($multiple,$cdom,$cnum,$cleandesc,$canclone)>:
   
 Input: 4 - single (0) or multiple (1) courses; course domain, course number; course description.   Input: 5 - single (0) or multiple (1) courses; course domain, course number; course description; can clone course (1 if new course owner has cloning rights). 
   
 Output: 1 - HTML for either checkbox (multiple=1) or select button (multiple=0) for user yo indicate course selection.  Output: 1 - HTML for either checkbox (multiple=1) or select button (multiple=0) for user to indicate course selection.
   
 Side Effects: None  Side Effects: None
   

Removed from v.1.84  
changed lines
  Added in v.1.87


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>