Annotation of loncom/interface/coursecatalog.pm, revision 1.6

1.1       raeburn     1: #
                      2: # Copyright Michigan State University Board of Trustees
                      3: #
                      4: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      5: #
                      6: # LON-CAPA is free software; you can redistribute it and/or modify
                      7: # it under the terms of the GNU General Public License as published by
                      8: # the Free Software Foundation; either version 2 of the License, or
                      9: # (at your option) any later version.
                     10: #
                     11: # LON-CAPA is distributed in the hope that it will be useful,
                     12: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: # GNU General Public License for more details.
                     15: #
                     16: # You should have received a copy of the GNU General Public License
                     17: # along with LON-CAPA; if not, write to the Free Software
                     18: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     19: #
                     20: # /home/httpd/html/adm/gpl.txt
                     21: #
                     22: # http://www.lon-capa.org/
                     23: #
                     24: 
                     25: package Apache::coursecatalog;
                     26: 
                     27: use strict;
                     28: use lib qw(/home/httpd/lib/perl);
                     29: use Apache::Constants qw(:common);
                     30: use Apache::loncommon;
                     31: use Apache::lonnet;
                     32: use Apache::lonlocal;
1.6     ! raeburn    33: use Apache::courseclassifier;
1.1       raeburn    34: use Apache::lonacc;
                     35: use lib '/home/httpd/lib/perl/';
                     36: use LONCAPA;
                     37: 
                     38: sub handler {
                     39:     my ($r) = @_;
                     40:     &Apache::loncommon::content_type($r,'text/html');
                     41:     $r->send_http_header;
                     42:     if ($r->header_only) {
                     43:         return OK;
                     44:     }
                     45:     &Apache::lonacc::get_posted_cgi($r);
                     46:     &Apache::lonlocal::get_language_handle($r);
                     47:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);
                     48:     my $codedom = $Apache::lonnet::perlvar{'lonDefDomain'};
                     49:     my %coursecodes = ();
                     50:     my %codes = ();
                     51:     my @codetitles = ();
                     52:     my %cat_titles = ();
                     53:     my %cat_order = ();
                     54:     my %idlist = ();
                     55:     my %idnums = ();
                     56:     my %idlist_titles = ();
1.6     ! raeburn    57:     my %by_year;
        !            58:     my %by_sem;
        !            59:     my %by_dept;
        !            60:     my %cat_items;
1.1       raeburn    61:     my $caller = 'global';
                     62:     my $format_reply;
                     63:     my $totcodes = 0;
                     64:     my $jscript = '';
1.6     ! raeburn    65:     my ($numtitles,$lasttitle);
1.1       raeburn    66:     my $formname = 'coursecatalog';
1.5       raeburn    67:     my $domdesc = $Apache::lonnet::domaindescription{$codedom};
1.6     ! raeburn    68:     $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
1.1       raeburn    69:     if ($totcodes > 0) {
1.6     ! raeburn    70:         $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order);
        !            71:         if ($format_reply eq 'ok') {
        !            72:             my $numtypes = @codetitles;
        !            73:             &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
        !            74:             my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles);
        !            75:             my $longtitles_str = join('","',@{$longtitles});
        !            76:             my $allidlist = $idlist{$codetitles[0]};
        !            77:             $numtitles = @codetitles;
        !            78:             $lasttitle = $numtitles;
        !            79:             if ($numtitles > 4) {
        !            80:                 $lasttitle = 4;
1.1       raeburn    81:             }
1.6     ! raeburn    82:             my @data = ('top');
        !            83:             for (my $k=0; $k<$lasttitle; $k++) {
        !            84:                 my $cat = $codetitles[$k];
        !            85:                 my $level = 1;
        !            86:                 $level = &recurse_options($codetitles[$k],$idlist{$codetitles[$k]},$level,$cat,\%cat_items,\@data,\%by_year,\%by_sem,\%by_dept);        }
        !            87:             $scripttext .= &build_javascript(\%by_year,\%by_sem,\%by_dept,\%cat_order,\@codetitles);
        !            88:             $jscript .= &javascript_select_filler($formname,$scripttext,\@codetitles,$longtitles_str,$allidlist);
1.1       raeburn    89:         }
                     90:         if ($env{'form.state'} eq 'listing') {
                     91:             $jscript .= '
                     92: function setElements() {
                     93: ';
1.6     ! raeburn    94:             for (my $i=0; $i<@codetitles-1; $i++) {
1.1       raeburn    95:                 if ($env{'form.'.$codetitles[$i]} != -1) {
                     96:                     $jscript .= '
                     97:     for (var j=0; j<document.'.$formname.'.'.$codetitles[$i].'.length; j++) {
                     98:         if (document.'.$formname.'.'.$codetitles[$i].'[j].value == "'.$env{'form.'.$codetitles[$i]}.'") {
                     99:             document.'.$formname.'.'.$codetitles[$i].'.selectedIndex = j;
                    100:         }
                    101:     }
                    102: ';
                    103:                 }
                    104:             }
1.6     ! raeburn   105:             $jscript .= '   courseSet()'."\n";
        !           106:             if ($env{'form.'.$codetitles[-1]} != -1) {
        !           107:                 $jscript .= '
        !           108:     for (var j=0; j<document.'.$formname.'.'.$codetitles[-1].'.length; j++) {
        !           109:         if (document.'.$formname.'.'.$codetitles[-1].'[j].value == "'.$env{'form.'.$codetitles[-1]}.'") {
        !           110:             document.'.$formname.'.'.$codetitles[-1].'.selectedIndex = j;
        !           111:         }
        !           112:     }
        !           113: ';
        !           114:             }
1.1       raeburn   115:             $jscript .= '}';
                    116:             $jscript .= qq|
                    117: function changeSort(caller) {
                    118:     document.coursecatalog.sortby.value = caller;
                    119:     document.coursecatalog.submit();
                    120: }\n|;
                    121:         }
                    122:         my $js = '<script type"text/javascript">'."\n$jscript\n".
                    123:                  '</script>';
                    124:         my %add_entries = (topmargin    => "0",
                    125:                            marginheight => "0",
                    126:                            onLoad       =>"setElements()",);
                    127:         my $start_page =
                    128:             &Apache::loncommon::start_page('Course Catalog',$js,
                    129:                                            { 
                    130:                                              'add_entries' => \%add_entries,
                    131:                                              'no_inline_link'   => 1,});
                    132:         $r->print($start_page);
                    133: 
1.2       raeburn   134:         $r->print('<h3>'.&mt('Display information about official [_1] classes for which LON-CAPA courses have been created:',$domdesc).'</h3>');
1.1       raeburn   135:         $r->print(&mt('<b>Choose which course(s) to list.</b><br />'));
                    136:         $r->print('<form name="coursecatalog" method="post">'); 
                    137:         if ($numtitles > 0) {
1.6     ! raeburn   138:             $r->print('<table><tr>');
        !           139:             for (my $k=0; $k<$lasttitle-1; $k++) {
        !           140:                 my @unsorted = @{$cat_items{$codetitles[$k]}};
        !           141:                 my @items;
        !           142:                 &Apache::courseclassifier::sort_cats($k,\%cat_order,\@codetitles,\@unsorted,\@items);
        !           143:                 my @longitems;
        !           144:                 if (defined($cat_titles{$codetitles[$k]})) {
        !           145:                     foreach my $item (@items) {
        !           146:                         push(@longitems,$cat_titles{$codetitles[$k]}{$item});
        !           147:                     }
1.1       raeburn   148:                 } else {
1.6     ! raeburn   149:                     @longitems = @items;
1.1       raeburn   150:                 }
1.6     ! raeburn   151:                 $r->print('<td align="center">'.$codetitles[$k].'<br />'."\n".
        !           152:                           '<select name="'.$codetitles[$k].'" onChange="courseSet()"');
        !           153:                 $r->print('>'."\n".'<option value="0" />All'."\n");
        !           154:                 for (my $i=0; $i<@items; $i++) {
1.1       raeburn   155:                     if ($longitems[$i] eq '') {
                    156:                         $longitems[$i] = $items[$i];
                    157:                     }
1.6     ! raeburn   158:                     $r->print(' <option value="'.$items[$i].'">'.$longitems[$i].'</option>');
1.1       raeburn   159:                 }
1.6     ! raeburn   160:                 $r->print('</select></td>');
1.1       raeburn   161:             }
1.6     ! raeburn   162:             $r->print('<td align="center">'.$codetitles[$lasttitle-1].'<br />'."\n".
        !           163:                       '<select name="'.$codetitles[$lasttitle-1].'">'."\n".
        !           164:                       '<option value="0">All'."\n".
        !           165:                       '</option>'."\n".'</select>'."\n".
1.1       raeburn   166:                  '</td>'
                    167:                 );
                    168:             $r->print('</tr></table>');
                    169:             if ($numtitles > 4) {
1.6     ! raeburn   170:                 $r->print('<br /><br />'.$codetitles[$numtitles-1].'<br />'."\n".
        !           171:                 '<input type="text" name="'.$codetitles[$numtitles-1].'" /><br />'."\n");
1.1       raeburn   172:             }
                    173:         }
                    174:         $r->print('<br /><input type="hidden" name="state" value="listing" /><input type="hidden" name="sortby" value="" /><input type="submit" name="catalogfilter" value="'.&mt('Display courses').'" /></form>');
1.5       raeburn   175:     } else {
                    176:         $r->print(&Apache::loncommon::start_page('Course Catalog','',
                    177:                   {
                    178:                    'no_inline_link'   => 1,}));
                    179:         $r->print('<br />'.&mt('No official courses to display for [_1].',$domdesc));
1.1       raeburn   180:     }
                    181:     if ($env{'form.state'} eq 'listing') {
1.6     ! raeburn   182:         $r->print('<br /><br />'.&print_course_listing($codedom).'<br />');
1.1       raeburn   183:     }
                    184:     $r->print(&Apache::loncommon::end_page());
1.5       raeburn   185:     return OK;
1.1       raeburn   186: }
                    187: 
1.6     ! raeburn   188: sub recurse_options {
        !           189:     my ($currkey,$currlist,$level,$cat,$cat_options,$data,$by_year,$by_sem,$by_dept) = @_;
        !           190:     if (ref($currlist) eq 'HASH') {
        !           191:         $level ++;
        !           192:         foreach my $key (sort(keys(%{$currlist}))) {
        !           193:             $$data[$level-1]= $key;
        !           194:             &recurse_options($key,$currlist->{$key},$level,$cat,$cat_options,$data,$by_year,$by_sem,$by_dept);
        !           195:         }
        !           196:     } else {
        !           197:         $level --;
        !           198:         my @contents = split(/","/,$currlist);
        !           199:         foreach my $item (@contents) {
        !           200:             if (!grep(/^\Q$item\E$/,@{$cat_options->{$cat}})) {
        !           201:                 push(@{$cat_options->{$cat}},$item);
        !           202:             }
        !           203:             if ($level == 3) {
        !           204:                 if (!grep/^\Q$item\E$/,@{$by_year->{$data->[1]}->{$currkey}}) {
        !           205:                     push(@{$by_year->{$data->[1]}->{$currkey}},$item);                 
        !           206:                 }
        !           207:                 if (!grep/^\Q$item\E$/,@{$by_sem->{$data->[2]}->{$currkey}}) {
        !           208:                     push(@{$by_sem->{$data->[2]}->{$currkey}},$item);
        !           209:                 }
        !           210:                 if (!grep/^\Q$item\E$/,@{$by_dept->{$currkey}}) {
        !           211:                     push(@{$by_dept->{$currkey}},$item);
        !           212:                 }
        !           213: 
        !           214:             }
        !           215:         }
        !           216:     }
        !           217:     return $level;
        !           218: }
        !           219: 
        !           220: sub build_javascript {
        !           221:     my ($by_year,$by_sem,$by_dept,$cat_order,$codetitles) = @_;
        !           222:     my @unsorted = keys(%{$by_year});
        !           223:     my @sorted_yrs; 
        !           224:     &Apache::courseclassifier::sort_cats('0',$cat_order,$codetitles,\@unsorted,\@sorted_yrs);
        !           225:     my $output = 'var idcse_by_yr_year = new Array("'.join('","',@sorted_yrs).'");'."\n".
        !           226:                  'var idcse_by_yr_dept = new Array('.scalar(@sorted_yrs).');'."\n".
        !           227:                  'var idcse_by_yr_num = new Array('.scalar(@sorted_yrs).');'."\n";
        !           228:     for (my $i=0; $i<@sorted_yrs; $i++) {
        !           229:         my $numkeys = keys(%{$by_year->{$sorted_yrs[$i]}});
        !           230:         $output .= " idcse_by_yr_num[$i] = new Array($numkeys);\n";
        !           231:         if (ref($by_year->{$sorted_yrs[$i]}) eq 'HASH') {
        !           232:             @unsorted = keys(%{$by_year->{$sorted_yrs[$i]}});
        !           233:             my @sorted_depts;
        !           234:             &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_depts);
        !           235:             $output .= qq| idcse_by_yr_dept[$i] = new Array ("|.join('","',@sorted_depts).'");'."\n";
        !           236:             for (my $j=0; $j<@sorted_depts; $j++) {
        !           237:                 $output .= qq| idcse_by_yr_num[$i][$j] = new Array ("|;
        !           238:                 $output .= join('","',sort(@{$by_year->{$sorted_yrs[$i]}->{$sorted_depts[$j]}})).'");'."\n";
        !           239:             }
        !           240:         }
        !           241:     }
        !           242:     @unsorted = keys(%{$by_sem});
        !           243:     my @sorted_sems;
        !           244:     &Apache::courseclassifier::sort_cats('1',$cat_order,$codetitles,\@unsorted,\@sorted_sems);
        !           245:     $output .=  'idcse_by_sem_sems = new Array("'.join('","',@sorted_sems).'");'."\n".
        !           246:                 'idcse_by_sem_dept = new Array('.scalar(@sorted_sems).');'."\n".
        !           247:                 'idcse_by_sem_num = new Array('.scalar(@sorted_sems).');'."\n";
        !           248:     for (my $i=0; $i<@sorted_sems; $i++) {
        !           249:         my $numkeys = keys(%{$by_sem->{$sorted_sems[$i]}});
        !           250:         $output .= " idcse_by_sem_num[$i] = new Array($numkeys);\n";
        !           251:         if (ref($by_sem->{$sorted_sems[$i]}) eq 'HASH') {
        !           252:             @unsorted = keys(%{$by_sem->{$sorted_sems[$i]}});
        !           253:             my @sorted_depts;
        !           254:             &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_depts);
        !           255:             $output .= qq| idcse_by_sem_dept[$i] = new Array("|.join('","',@sorted_depts).'");'."\n";
        !           256:             for (my $j=0; $j<@sorted_depts; $j++) {
        !           257:                 $output .= qq| idcse_by_sem_num[$i][$j] = new Array ("|.join('","',sort(@{$by_sem->{$sorted_sems[$i]}->{$sorted_depts[$j]}})).'");'."\n";
        !           258:             }
        !           259:         }
        !           260:     }
        !           261:     @unsorted = keys(%{$by_dept});
        !           262:     my @sorted_deps;
        !           263:     &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_deps);
        !           264:     $output .= 'idcse_by_dep = new Array('.scalar(@sorted_deps).');'."\n"; 
        !           265:     for (my $k=0; $k<@sorted_deps; $k++) {
        !           266:         $output .= qq| idcse_by_dep[$k] = new Array ("|.join('","',sort(@{$by_dept->{$sorted_deps[$k]}})).'");'."\n";
        !           267:     }
        !           268:     return $output;
        !           269: }
        !           270: 
        !           271: 
1.1       raeburn   272: sub print_course_listing {
                    273:     my ($domain) = @_;
                    274:     my $output;
                    275:     my $year = $env{'form.Year'};
                    276:     my $sem = $env{'form.Semester'};
                    277:     my $dept = $env{'form.Department'};
                    278:     my $coursenum = $env{'form.Number'};
                    279:     my $instcode;
1.6     ! raeburn   280:     if ($sem eq '0' ) {
        !           281:         $instcode .= '^[sfu]s';
        !           282:     } else {
        !           283:         $instcode .= '^'.$sem; 
1.1       raeburn   284:     }
1.6     ! raeburn   285:     if ($year eq '0') {
        !           286:         $instcode .= '\d{2}';
        !           287:     } else {
1.1       raeburn   288:         $instcode .= $year; 
                    289:     }
1.6     ! raeburn   290:     if ($dept eq '0') {
        !           291:         $instcode .= '\w{2,3}';
        !           292:     } else {
1.1       raeburn   293:         $instcode .= $dept;
                    294:     }
1.6     ! raeburn   295:     if ($coursenum ne '0' && $coursenum != -1) {
        !           296:         $instcode .= $coursenum.'$'; 
1.1       raeburn   297:     }
                    298:     my %courses = &Apache::lonnet::courseiddump($domain,'.',1,$instcode,'.','.',
1.6     ! raeburn   299:                                                 undef,undef,'Course',1);
1.1       raeburn   300:     if (keys(%courses) == 0) {
1.2       raeburn   301:         $output = &mt('No courses match the criteria you selected.');
1.1       raeburn   302:         return $output;
                    303:     }
1.2       raeburn   304:     $output = &mt('<b>Note for students:</b> If you are officially enrolled in a course but there is no student role for the course in your LON-CAPA roles screen, check the default access dates and/or auto-enrollment settings for the course below.  Your roles screen displays only currently accessible roles.<br /><br />');
1.1       raeburn   305:     $output .= &Apache::loncommon::start_data_table().
                    306:               &Apache::loncommon::start_data_table_header_row().
                    307:               '<th><a href="javascript:changeSort('."'code'".')">'.&mt('Code').'</a></th>'.
                    308:               '<th>'.&mt('Sections').'</th>'.
1.2       raeburn   309:               '<th>'.&mt('Crosslisted').'</th>'.
1.1       raeburn   310:               '<th><a href="javascript:changeSort('."'title'".')">'.&mt('Title').'</a></th>'.
                    311:               '<th><a href="javascript:changeSort('."'owner'".')">'.&mt('Owner').'</a></th>'.
1.2       raeburn   312:               '<th>'.&mt('Student Status').'</th>'.
1.1       raeburn   313:               '<th>'.&mt('Default Access Dates').'</th>'.
1.2       raeburn   314:               '<th>'.&mt('Auto-enrollment').'</th>'.
1.1       raeburn   315:               &Apache::loncommon::end_data_table_header_row();
                    316:     my %courseinfo;
                    317:     foreach my $course (keys(%courses)) {
                    318:         my $descr;
                    319:         if ($courses{$course} =~ m/^([^:]*):/i) {
                    320:             $descr = &unescape($1);
                    321:         } else {
                    322:             $descr = &unescape($courses{$course});
                    323:         }
                    324:         my $cleandesc=&HTML::Entities::encode($descr,'<>&"');
                    325:         $cleandesc=~s/'/\\'/g;
                    326:         my ($cdom,$cnum)=split(/\_/,$course);
1.2       raeburn   327:        
1.4       albertel  328:         my ($desc,$instcode,$owner,$ttype) = split(/:/,$courses{$course});
1.1       raeburn   329:         $owner = &unescape($owner);
                    330:         my ($ownername,$ownerdom);
                    331:         if ($owner =~ /:/) {
                    332:             ($ownername,$ownerdom) = split(/:/,$owner);
                    333:         } else {
                    334:             $ownername = $owner;
                    335:             if ($owner ne '') {
                    336:                 $ownerdom = $cdom;
                    337:             }
                    338:         }
                    339:         my %ownernames;
                    340:         if ($ownername ne '' && $ownerdom ne '') {
                    341:             %ownernames = &Apache::loncommon::getnames($ownername,$ownerdom);
                    342:         }
                    343:         $courseinfo{$course}{'cdom'} = $cdom;
                    344:         $courseinfo{$course}{'cnum'} = $cnum;
                    345:         $courseinfo{$course}{'code'} = $instcode;
                    346:         $courseinfo{$course}{'ownerlastname'} = $ownernames{'lastname'};
                    347:         $courseinfo{$course}{'title'} = $cleandesc;
1.2       raeburn   348:         $courseinfo{$course}{'owner'} = $owner; 
1.1       raeburn   349:     }
                    350:     my %Sortby;
                    351:     foreach my $course (sort(keys(%courses))) {
                    352:         if ($env{'form.sortby'} eq 'code') {
                    353:             push(@{$Sortby{$courseinfo{$course}{'code'}}},$course);
                    354:         } elsif ($env{'form.sortby'} eq 'owner') {
                    355:             push(@{$Sortby{$courseinfo{$course}{'ownerlastname'}}},$course);
                    356:         } else {
                    357:             push(@{$Sortby{$courseinfo{$course}{'title'}}},$course);
                    358:         }
                    359:     }
                    360:     my @sorted_courses;
                    361:     if (($env{'form.sortby'} eq 'code') || ($env{'form.sortby'} eq 'owner')) {
                    362:         @sorted_courses = sort(keys(%Sortby));
                    363:     } else {
                    364:         @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby));
                    365:     }
                    366:     foreach my $item (@sorted_courses) {
                    367:         foreach my $course (@{$Sortby{$item}}) {
                    368:             $output.=&Apache::loncommon::start_data_table_row(); 
                    369:             $output.=&courseinfo_row($courseinfo{$course});
                    370:             $output.=&Apache::loncommon::end_data_table_row();
                    371:         }
                    372:     }
                    373:     $output .= &Apache::loncommon::end_data_table();
                    374:     return $output;
                    375: }
                    376: 
                    377: sub courseinfo_row {
                    378:     my ($info) = @_;
1.2       raeburn   379:     my ($cdom,$cnum,$title,$ownerlast,$code,$owner,$output);
1.1       raeburn   380:     if (ref($info) eq 'HASH') {
                    381:         $cdom = $info->{'cdom'};
                    382:         $cnum = $info->{'cnum'};
                    383:         $title = $info->{'title'};
1.2       raeburn   384:         $ownerlast = $info->{'ownerlastname'};
                    385:         $code = $info->{'code'};
                    386:         $owner = $info->{'owner'};
1.1       raeburn   387:     } else {
1.2       raeburn   388:         $output = '<td colspan="8">'.&mt('No information available for [_1].',
                    389:                                          $code).'</td>';
1.1       raeburn   390:         return $output;
                    391:     }
                    392:     my %coursehash = &Apache::lonnet::dump('environment',$cdom,$cnum);
                    393:     my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum);
                    394:     my %idx;
1.2       raeburn   395:     my @classids;
                    396:     my @crosslistings;
1.1       raeburn   397:     $idx{'status'} = &Apache::loncoursedata::CL_STATUS();
1.4       albertel  398:     my %status_title = &Apache::lonlocal::texthash(
1.1       raeburn   399:                            Expired => 'Previous access',
                    400:                            Active => 'Current access',
                    401:                            Future => 'Future access',
                    402:                        );
                    403:     my %student_count = (
                    404:                            Expired => 0,
                    405:                            Active => 0,
                    406:                            Future => 0,
                    407:                        );
1.4       albertel  408:     while (my ($student,$data) = each(%$classlist)) {
1.1       raeburn   409:         $student_count{$data->[$idx{'status'}]} ++;
                    410:     }
                    411:     my $seclist = &identify_sections($coursehash{'internal.sectionnums'});
1.2       raeburn   412:     my $xlist_items = &identify_sections($coursehash{'internal.crosslistings'});
1.1       raeburn   413:     my $countslist;
                    414:     my $startaccess = '';
                    415:     my $endaccess = '';
1.2       raeburn   416:     my $now;
                    417:     my ($accessdates,$autoenrolldates,$showsyllabus);
1.1       raeburn   418:     if ( defined($coursehash{'default_enrollment_start_date'}) ) {
                    419:         $startaccess = &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_start_date'});
                    420:     }
                    421:     if ( defined($coursehash{'default_enrollment_end_date'}) ) {
                    422:         $endaccess = &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_end_date'});
                    423:         if ($coursehash{'default_enrollment_end_date'} == 0) {
                    424:             $endaccess = "No ending date";
                    425:         }
                    426:     }
                    427:     if ($startaccess) {
                    428:         $accessdates .= &mt('From: ').$startaccess.'<br />';
                    429:     }
                    430:     if ($endaccess) {
                    431:         $accessdates .= &mt('To: ').$endaccess.'<br />';
                    432:     }
1.2       raeburn   433:     $autoenrolldates = &mt('Not enabled');
                    434:     if (defined($coursehash{'internal.autoadds'}) && $coursehash{'internal.autoadds'} == 1) {
1.1       raeburn   435:         my ($autostart,$autoend);
                    436:         if ( defined($coursehash{'internal.autostart'}) ) {
                    437:             $autostart = &Apache::lonlocal::locallocaltime($coursehash{'internal.autostart'});
                    438:         }
                    439:         if ( defined($coursehash{'internal.autoend'}) ) {
                    440:             $autoend = &Apache::lonlocal::locallocaltime($coursehash{'internal.autoend'});
1.2       raeburn   441:         }
                    442:         if ($coursehash{'internal.autostart'} > $now) {
                    443:             if ($coursehash{'internal.autoend'} && $coursehash{'internal.autoend'} < $now) {
                    444:                 $autoenrolldates = &mt('Not enabled');
                    445:             } else {
                    446:                 my $valid_classes = &get_valid_classes($seclist,$xlist_items,
                    447:                                                        $code,$owner,$cdom,$cnum);
                    448:                 if ($valid_classes ne '') {
                    449:                     $autoenrolldates = &mt('Not enabled<br />Starts: ').
                    450:                                        $autostart.'<br />'.$valid_classes;
                    451:                 }
                    452:             }
                    453:         } else {
                    454:             if ($coursehash{'internal.autoend'} && $coursehash{'internal.autoend'} < $now) {
                    455:                 $autoenrolldates = &mt('Not enabled<br />Ended: ').$autoend;
                    456:             } else {
                    457:                 my $valid_classes = &get_valid_classes($seclist,$xlist_items,
                    458:                                                        $code,$owner,$cdom,$cnum);
                    459:                 if ($valid_classes ne '') {
                    460:                     $autoenrolldates = &mt('Currently enabled<br />').
                    461:                                        $valid_classes;
                    462:                 }
1.1       raeburn   463:             }
                    464:         }
                    465:     }
1.2       raeburn   466:     if (defined($coursehash{'showsyllabus'})) {
                    467:         $showsyllabus = $coursehash{'showsyllabus'};
                    468:     } 
1.1       raeburn   469:     foreach my $status ('Active','Future','Expired') {
                    470:         $countslist .= '<nobr>'.$status_title{$status}.': '.
                    471:                        $student_count{$status}.'</nobr><br />';
                    472:     }
1.2       raeburn   473:     if ($xlist_items eq '') {
                    474:         $xlist_items = &mt('No');
                    475:     }
1.1       raeburn   476:     $output = '<td>'.$coursehash{'internal.coursecode'}.'</td>'.
                    477:               '<td>'.$seclist.'</td>'.
1.2       raeburn   478:               '<td>'.$xlist_items.'</td>'.
                    479:               '<td>'.$title.'&nbsp;<font size="-2">';
                    480:     if ($showsyllabus) {
                    481:         $output .= &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$cnum,$cdom);
                    482:     }
                    483:     $output .= '</font></td>'.
                    484:                '<td>'.$ownerlast.'</td>'.
                    485:                '<td>'.$countslist.'</td>'.
                    486:                '<td>'.$accessdates.'</td>'.
                    487:                '<td>'.$autoenrolldates.'</td>'; 
1.1       raeburn   488:     return $output;
                    489: }
                    490: 
                    491: sub identify_sections {
                    492:     my ($seclist) = @_;
                    493:     my @secnums;
                    494:     if ($seclist =~ /,/) {
1.4       albertel  495:         my @sections = split(/,/,$seclist);
1.1       raeburn   496:         foreach my $sec (@sections) {
                    497:             $sec =~ s/:[^:]*$//;
                    498:             push(@secnums,$sec);
                    499:         }
                    500:     } else {
                    501:         if ($seclist =~ m/^([^:]+):/) {
                    502:             my $sec = $1;
1.4       albertel  503:             if (!grep(/^\Q$sec\E$/,@secnums)) {
                    504:                 push(@secnums,$sec);
1.1       raeburn   505:             }
                    506:         }
                    507:     }
                    508:     @secnums = sort {$a <=> $b} @secnums;
                    509:     my $seclist = join(', ',@secnums);
                    510:     return $seclist;
                    511: }
                    512: 
1.2       raeburn   513: sub get_valid_classes {
                    514:     my ($seclist,$xlist_items,$crscode,$owner,$cdom,$cnum) = @_;
                    515:     my $response;
                    516:     my %validations;
                    517:     @{$validations{'sections'}} = ();
                    518:     @{$validations{'xlists'}} = ();
                    519:     my $totalitems = 0;
                    520:     if ($seclist) {
                    521:         foreach my $sec (split(',',$seclist)) {
                    522:             my $class = $crscode.$sec;
1.3       albertel  523:             if (&Apache::lonnet::auto_validate_class_sec($cdom,$cnum,$owner,
                    524: 							 $class) eq 'ok') {
1.2       raeburn   525:                 if (!grep(/^\Q$sec$\E/,@{$validations{'sections'}})) {
1.4       albertel  526:                     push(@{$validations{'sections'}},$sec);
1.2       raeburn   527:                     $totalitems ++;
                    528:                 }
                    529:             }
                    530:         }
                    531:     }
                    532:     if ($xlist_items) {
                    533:         foreach my $item (split(',',$xlist_items)) {
1.3       albertel  534:             if (&Apache::lonnet::auto_validate_class_sec($cdom,$cnum,$owner,
                    535: 							 $item) eq 'ok') {
1.2       raeburn   536:                 if (!grep(/^\Q$item$\E/,@{$validations{'xlists'}})) {
1.4       albertel  537:                     push(@{$validations{'xlists'}},$item);
1.2       raeburn   538:                     $totalitems ++;
                    539:                 }
                    540:             }
                    541:         }
                    542:     }
                    543:     if ($totalitems > 0) {
                    544:         if (@{$validations{'sections'}}) {
                    545:             $response = &mt('Sections: ').
                    546:                         join(',',@{$validations{'sections'}}).'<br />';
                    547:         }
                    548:         if (@{$validations{'xlists'}}) {
                    549:             $response .= &mt('Courses: ').
                    550:                         join(',',@{$validations{'xlists'}});
                    551:         }
                    552:     }
                    553:     return $response;
                    554: }
                    555: 
1.6     ! raeburn   556: sub javascript_select_filler {
        !           557:     my ($formname,$scripttext,$codetitles,$longtitles_str,$allidlist) = @_;
        !           558:     my $output = <<END;
        !           559: function courseSet() {
        !           560:     var longtitles = new Array ("$longtitles_str");
        !           561:     var valyr = document.$formname.Year.options[document.$formname.Year.selectedIndex].value
        !           562:     var valsem  = document.$formname.Semester.options[document.$formname.Semester.selectedIndex].value
        !           563:     var valdept = document.$formname.Department.options[document.$formname.Department.selectedIndex].value
        !           564:     var valclass = document.$formname.Number.options[document.$formname.Number.selectedIndex].value
        !           565:     var idyears = new Array("$allidlist");
        !           566:     var idyr = -1;
        !           567:     var idsem = -1;
        !           568:     var iddept = -1;
        !           569:     document.$formname.Number.length = 0;
        !           570: 
        !           571:     $scripttext
        !           572: 
        !           573:     selYear = document.$formname.Year.selectedIndex-1;
        !           574:     selSemester = document.$formname.Semester.selectedIndex-1;
        !           575:     selDepartment = document.$formname.Department.selectedIndex-1;
        !           576:     if (selYear == -1) {
        !           577:         if (selSemester == -1) {
        !           578:             if (selDepartment > -1) {
        !           579:                 document.$formname.Number.options[0] =  new Option('All','0',false,false);
        !           580:                 for (var k=0; k<idcse_by_dep[selDepartment].length; k++) {
        !           581:                     document.$formname.Number.options[k+1] = new Option(idcse_by_dep[selDepartment][k],idcse_by_dep[selDepartment][k],false,false);
        !           582: 
        !           583:                 }
        !           584:             } 
        !           585:             else {
        !           586:                 document.$formname.Number.options[0] = new Option("All","0",true,true);
        !           587:             }
        !           588:         }
        !           589:         else {
        !           590:             if (selDepartment > -1) {
        !           591:                 for (var i=0; i<idcse_by_sem_sems.length; i++) {
        !           592:                     if (idcse_by_sem_sems[i] == valsem) {
        !           593:                         idsem = i;
        !           594:                     }
        !           595:                 }
        !           596:                 if (idsem != -1) {
        !           597:                     for (var i=0; i<idcse_by_sem_dept[idsem].length; i++) {
        !           598:                         if (idcse_by_sem_dept[idsem][i] == valdept) {
        !           599:                             iddept = i;
        !           600:                         }
        !           601:                     }
        !           602:                 }
        !           603:                 if (iddept != -1) {
        !           604:                     document.$formname.Number.options[0] =  new Option('All','0',false,false);
        !           605:                     for (var k=0; k<idcse_by_sem_num[idsem][iddept].length; k++) {
        !           606:                         document.$formname.Number.options[k+1] = new Option(idcse_by_sem_num[idsem][iddept][k],idcse_by_sem_num[idsem][iddept][k],false,false);
        !           607:                     }
        !           608:                 }
        !           609:                 else {
        !           610:                     document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
        !           611:                 }
        !           612:             }
        !           613:             else {
        !           614:                 document.$formname.Number.options[0] = new Option("All","0",true,true);
        !           615:             }
        !           616:         }
        !           617:     }
        !           618:     else {
        !           619:         if (selSemester == -1) {
        !           620:             if (selDepartment > -1) {
        !           621:                 for (var i=0; i<idcse_by_yr_year.length; i++) {
        !           622:                     if (idcse_by_yr_year[i] == valyr) {
        !           623:                         idyr = i;
        !           624:                     }
        !           625:                 }
        !           626:                 if (idyr != -1) {      
        !           627:                     for (var i=0; i<idcse_by_yr_dept[idyr].length; i++) {
        !           628:                         if (idcse_by_yr_dept[idyr][i] == valdept) {
        !           629:                             iddept = i;
        !           630:                         }
        !           631:                     }
        !           632:                 }
        !           633:                 if (iddept != -1) {
        !           634:                     document.$formname.Number.options[0] =  new Option('All','0',false,false);
        !           635:                     for (var k=0; k<idcse_by_yr_num[idyr][iddept].length; k++) {
        !           636:                         document.$formname.Number.options[k+1] = new Option(idcse_by_yr_num[idyr][iddept][k],idcse_by_yr_num[idyr][iddept][k],false,false);
        !           637:                     }
        !           638:                 } 
        !           639:                 else {
        !           640:                     document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
        !           641:                 }
        !           642:             }
        !           643:             else {
        !           644:                 document.$formname.Number.options[0] = new Option("All","0",true,true);
        !           645:             }
        !           646:         }
        !           647:         else {
        !           648:             for (var k=0; k<idyears.length; k++) {
        !           649:                 if (idyears[k] == valyr) {
        !           650:                     idyr = k;
        !           651:                 }
        !           652:             }
        !           653:             if (idyr != -1) {
        !           654:                 for (var k=0; k<idsems[idyr].length; k++) {
        !           655:                     if (idsems[idyr][k] == valsem) {
        !           656:                         idsem = k;
        !           657:                     }
        !           658:                 }
        !           659:             }
        !           660:             if (idsem != -1) {
        !           661:                 for (var k=0; k<idcodes[idyr][idsem].length; k++) {
        !           662:                     if (idcodes[idyr][idsem][k] == valdept) {
        !           663:                         iddept = k;
        !           664:                     }
        !           665:                 }
        !           666:             }
        !           667:             if (iddept != -1) {
        !           668:                 document.$formname.Number.options[0] =  new Option('All','0',false,false);
        !           669:                 for (var i=0; i<idcourses[idyr][idsem][iddept].length; i++) {
        !           670:                     var display = idcourses[idyr][idsem][iddept][i];
        !           671:                     if (longtitles[3] == 1) {
        !           672:                         if (idcourseslongs[idyr][idsem][iddept][i] != "") {
        !           673:                             display = idcourseslongs[idyr][idsem][iddept][i]
        !           674:                         }
        !           675:                     }
        !           676:                     document.$formname.Number.options[i+1] = new Option(display,idcourses[idyr][idsem][iddept][i],false,false)
        !           677:                 }
        !           678:             }
        !           679:             else {
        !           680:                 document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
        !           681:             }
        !           682:         }
        !           683:         document.$formname.Number.selectedIndex = 0
        !           684:     }
        !           685: }
        !           686: END
        !           687:     return $output;
        !           688: }
1.1       raeburn   689: 
                    690: 1;

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