File:  [LON-CAPA] / loncom / interface / coursecatalog.pm
Revision 1.6: download - view: text, annotated - select for diffs
Thu Oct 12 23:15:33 2006 UTC (17 years, 7 months ago) by raeburn
Branches: MAIN
CVS tags: HEAD
Using routines from courseclassifier instead of lonsupportreq. All ipossible values are now displayed in select boxes for Year, Semester and Department.  Options available in "Number" select box are set dynamically if a specific Department is selected.  Choices will vary depending on current selections for Year and Semester.

#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#

package Apache::coursecatalog;

use strict;
use lib qw(/home/httpd/lib/perl);
use Apache::Constants qw(:common);
use Apache::loncommon;
use Apache::lonnet;
use Apache::lonlocal;
use Apache::courseclassifier;
use Apache::lonacc;
use lib '/home/httpd/lib/perl/';
use LONCAPA;

sub handler {
    my ($r) = @_;
    &Apache::loncommon::content_type($r,'text/html');
    $r->send_http_header;
    if ($r->header_only) {
        return OK;
    }
    &Apache::lonacc::get_posted_cgi($r);
    &Apache::lonlocal::get_language_handle($r);
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['sortby']);
    my $codedom = $Apache::lonnet::perlvar{'lonDefDomain'};
    my %coursecodes = ();
    my %codes = ();
    my @codetitles = ();
    my %cat_titles = ();
    my %cat_order = ();
    my %idlist = ();
    my %idnums = ();
    my %idlist_titles = ();
    my %by_year;
    my %by_sem;
    my %by_dept;
    my %cat_items;
    my $caller = 'global';
    my $format_reply;
    my $totcodes = 0;
    my $jscript = '';
    my ($numtitles,$lasttitle);
    my $formname = 'coursecatalog';
    my $domdesc = $Apache::lonnet::domaindescription{$codedom};
    $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom,$totcodes);
    if ($totcodes > 0) {
        $format_reply = &Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes,\%codes,\@codetitles,\%cat_titles,\%cat_order);
        if ($format_reply eq 'ok') {
            my $numtypes = @codetitles;
            &Apache::courseclassifier::build_code_selections(\%codes,\@codetitles,\%cat_titles,\%cat_order,\%idlist,\%idnums,\%idlist_titles);
            my ($scripttext,$longtitles) = &Apache::courseclassifier::javascript_definitions(\@codetitles,\%idlist,\%idlist_titles,\%idnums,\%cat_titles);
            my $longtitles_str = join('","',@{$longtitles});
            my $allidlist = $idlist{$codetitles[0]};
            $numtitles = @codetitles;
            $lasttitle = $numtitles;
            if ($numtitles > 4) {
                $lasttitle = 4;
            }
            my @data = ('top');
            for (my $k=0; $k<$lasttitle; $k++) {
                my $cat = $codetitles[$k];
                my $level = 1;
                $level = &recurse_options($codetitles[$k],$idlist{$codetitles[$k]},$level,$cat,\%cat_items,\@data,\%by_year,\%by_sem,\%by_dept);        }
            $scripttext .= &build_javascript(\%by_year,\%by_sem,\%by_dept,\%cat_order,\@codetitles);
            $jscript .= &javascript_select_filler($formname,$scripttext,\@codetitles,$longtitles_str,$allidlist);
        }
        if ($env{'form.state'} eq 'listing') {
            $jscript .= '
function setElements() {
';
            for (my $i=0; $i<@codetitles-1; $i++) {
                if ($env{'form.'.$codetitles[$i]} != -1) {
                    $jscript .= '
    for (var j=0; j<document.'.$formname.'.'.$codetitles[$i].'.length; j++) {
        if (document.'.$formname.'.'.$codetitles[$i].'[j].value == "'.$env{'form.'.$codetitles[$i]}.'") {
            document.'.$formname.'.'.$codetitles[$i].'.selectedIndex = j;
        }
    }
';
                }
            }
            $jscript .= '   courseSet()'."\n";
            if ($env{'form.'.$codetitles[-1]} != -1) {
                $jscript .= '
    for (var j=0; j<document.'.$formname.'.'.$codetitles[-1].'.length; j++) {
        if (document.'.$formname.'.'.$codetitles[-1].'[j].value == "'.$env{'form.'.$codetitles[-1]}.'") {
            document.'.$formname.'.'.$codetitles[-1].'.selectedIndex = j;
        }
    }
';
            }
            $jscript .= '}';
            $jscript .= qq|
function changeSort(caller) {
    document.coursecatalog.sortby.value = caller;
    document.coursecatalog.submit();
}\n|;
        }
        my $js = '<script type"text/javascript">'."\n$jscript\n".
                 '</script>';
        my %add_entries = (topmargin    => "0",
                           marginheight => "0",
                           onLoad       =>"setElements()",);
        my $start_page =
            &Apache::loncommon::start_page('Course Catalog',$js,
                                           { 
                                             'add_entries' => \%add_entries,
                                             'no_inline_link'   => 1,});
        $r->print($start_page);

        $r->print('<h3>'.&mt('Display information about official [_1] classes for which LON-CAPA courses have been created:',$domdesc).'</h3>');
        $r->print(&mt('<b>Choose which course(s) to list.</b><br />'));
        $r->print('<form name="coursecatalog" method="post">'); 
        if ($numtitles > 0) {
            $r->print('<table><tr>');
            for (my $k=0; $k<$lasttitle-1; $k++) {
                my @unsorted = @{$cat_items{$codetitles[$k]}};
                my @items;
                &Apache::courseclassifier::sort_cats($k,\%cat_order,\@codetitles,\@unsorted,\@items);
                my @longitems;
                if (defined($cat_titles{$codetitles[$k]})) {
                    foreach my $item (@items) {
                        push(@longitems,$cat_titles{$codetitles[$k]}{$item});
                    }
                } else {
                    @longitems = @items;
                }
                $r->print('<td align="center">'.$codetitles[$k].'<br />'."\n".
                          '<select name="'.$codetitles[$k].'" onChange="courseSet()"');
                $r->print('>'."\n".'<option value="0" />All'."\n");
                for (my $i=0; $i<@items; $i++) {
                    if ($longitems[$i] eq '') {
                        $longitems[$i] = $items[$i];
                    }
                    $r->print(' <option value="'.$items[$i].'">'.$longitems[$i].'</option>');
                }
                $r->print('</select></td>');
            }
            $r->print('<td align="center">'.$codetitles[$lasttitle-1].'<br />'."\n".
                      '<select name="'.$codetitles[$lasttitle-1].'">'."\n".
                      '<option value="0">All'."\n".
                      '</option>'."\n".'</select>'."\n".
                 '</td>'
                );
            $r->print('</tr></table>');
            if ($numtitles > 4) {
                $r->print('<br /><br />'.$codetitles[$numtitles-1].'<br />'."\n".
                '<input type="text" name="'.$codetitles[$numtitles-1].'" /><br />'."\n");
            }
        }
        $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>');
    } else {
        $r->print(&Apache::loncommon::start_page('Course Catalog','',
                  {
                   'no_inline_link'   => 1,}));
        $r->print('<br />'.&mt('No official courses to display for [_1].',$domdesc));
    }
    if ($env{'form.state'} eq 'listing') {
        $r->print('<br /><br />'.&print_course_listing($codedom).'<br />');
    }
    $r->print(&Apache::loncommon::end_page());
    return OK;
}

sub recurse_options {
    my ($currkey,$currlist,$level,$cat,$cat_options,$data,$by_year,$by_sem,$by_dept) = @_;
    if (ref($currlist) eq 'HASH') {
        $level ++;
        foreach my $key (sort(keys(%{$currlist}))) {
            $$data[$level-1]= $key;
            &recurse_options($key,$currlist->{$key},$level,$cat,$cat_options,$data,$by_year,$by_sem,$by_dept);
        }
    } else {
        $level --;
        my @contents = split(/","/,$currlist);
        foreach my $item (@contents) {
            if (!grep(/^\Q$item\E$/,@{$cat_options->{$cat}})) {
                push(@{$cat_options->{$cat}},$item);
            }
            if ($level == 3) {
                if (!grep/^\Q$item\E$/,@{$by_year->{$data->[1]}->{$currkey}}) {
                    push(@{$by_year->{$data->[1]}->{$currkey}},$item);                 
                }
                if (!grep/^\Q$item\E$/,@{$by_sem->{$data->[2]}->{$currkey}}) {
                    push(@{$by_sem->{$data->[2]}->{$currkey}},$item);
                }
                if (!grep/^\Q$item\E$/,@{$by_dept->{$currkey}}) {
                    push(@{$by_dept->{$currkey}},$item);
                }

            }
        }
    }
    return $level;
}

sub build_javascript {
    my ($by_year,$by_sem,$by_dept,$cat_order,$codetitles) = @_;
    my @unsorted = keys(%{$by_year});
    my @sorted_yrs; 
    &Apache::courseclassifier::sort_cats('0',$cat_order,$codetitles,\@unsorted,\@sorted_yrs);
    my $output = 'var idcse_by_yr_year = new Array("'.join('","',@sorted_yrs).'");'."\n".
                 'var idcse_by_yr_dept = new Array('.scalar(@sorted_yrs).');'."\n".
                 'var idcse_by_yr_num = new Array('.scalar(@sorted_yrs).');'."\n";
    for (my $i=0; $i<@sorted_yrs; $i++) {
        my $numkeys = keys(%{$by_year->{$sorted_yrs[$i]}});
        $output .= " idcse_by_yr_num[$i] = new Array($numkeys);\n";
        if (ref($by_year->{$sorted_yrs[$i]}) eq 'HASH') {
            @unsorted = keys(%{$by_year->{$sorted_yrs[$i]}});
            my @sorted_depts;
            &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_depts);
            $output .= qq| idcse_by_yr_dept[$i] = new Array ("|.join('","',@sorted_depts).'");'."\n";
            for (my $j=0; $j<@sorted_depts; $j++) {
                $output .= qq| idcse_by_yr_num[$i][$j] = new Array ("|;
                $output .= join('","',sort(@{$by_year->{$sorted_yrs[$i]}->{$sorted_depts[$j]}})).'");'."\n";
            }
        }
    }
    @unsorted = keys(%{$by_sem});
    my @sorted_sems;
    &Apache::courseclassifier::sort_cats('1',$cat_order,$codetitles,\@unsorted,\@sorted_sems);
    $output .=  'idcse_by_sem_sems = new Array("'.join('","',@sorted_sems).'");'."\n".
                'idcse_by_sem_dept = new Array('.scalar(@sorted_sems).');'."\n".
                'idcse_by_sem_num = new Array('.scalar(@sorted_sems).');'."\n";
    for (my $i=0; $i<@sorted_sems; $i++) {
        my $numkeys = keys(%{$by_sem->{$sorted_sems[$i]}});
        $output .= " idcse_by_sem_num[$i] = new Array($numkeys);\n";
        if (ref($by_sem->{$sorted_sems[$i]}) eq 'HASH') {
            @unsorted = keys(%{$by_sem->{$sorted_sems[$i]}});
            my @sorted_depts;
            &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_depts);
            $output .= qq| idcse_by_sem_dept[$i] = new Array("|.join('","',@sorted_depts).'");'."\n";
            for (my $j=0; $j<@sorted_depts; $j++) {
                $output .= qq| idcse_by_sem_num[$i][$j] = new Array ("|.join('","',sort(@{$by_sem->{$sorted_sems[$i]}->{$sorted_depts[$j]}})).'");'."\n";
            }
        }
    }
    @unsorted = keys(%{$by_dept});
    my @sorted_deps;
    &Apache::courseclassifier::sort_cats('2',$cat_order,$codetitles,\@unsorted,\@sorted_deps);
    $output .= 'idcse_by_dep = new Array('.scalar(@sorted_deps).');'."\n"; 
    for (my $k=0; $k<@sorted_deps; $k++) {
        $output .= qq| idcse_by_dep[$k] = new Array ("|.join('","',sort(@{$by_dept->{$sorted_deps[$k]}})).'");'."\n";
    }
    return $output;
}


sub print_course_listing {
    my ($domain) = @_;
    my $output;
    my $year = $env{'form.Year'};
    my $sem = $env{'form.Semester'};
    my $dept = $env{'form.Department'};
    my $coursenum = $env{'form.Number'};
    my $instcode;
    if ($sem eq '0' ) {
        $instcode .= '^[sfu]s';
    } else {
        $instcode .= '^'.$sem; 
    }
    if ($year eq '0') {
        $instcode .= '\d{2}';
    } else {
        $instcode .= $year; 
    }
    if ($dept eq '0') {
        $instcode .= '\w{2,3}';
    } else {
        $instcode .= $dept;
    }
    if ($coursenum ne '0' && $coursenum != -1) {
        $instcode .= $coursenum.'$'; 
    }
    my %courses = &Apache::lonnet::courseiddump($domain,'.',1,$instcode,'.','.',
                                                undef,undef,'Course',1);
    if (keys(%courses) == 0) {
        $output = &mt('No courses match the criteria you selected.');
        return $output;
    }
    $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 />');
    $output .= &Apache::loncommon::start_data_table().
              &Apache::loncommon::start_data_table_header_row().
              '<th><a href="javascript:changeSort('."'code'".')">'.&mt('Code').'</a></th>'.
              '<th>'.&mt('Sections').'</th>'.
              '<th>'.&mt('Crosslisted').'</th>'.
              '<th><a href="javascript:changeSort('."'title'".')">'.&mt('Title').'</a></th>'.
              '<th><a href="javascript:changeSort('."'owner'".')">'.&mt('Owner').'</a></th>'.
              '<th>'.&mt('Student Status').'</th>'.
              '<th>'.&mt('Default Access Dates').'</th>'.
              '<th>'.&mt('Auto-enrollment').'</th>'.
              &Apache::loncommon::end_data_table_header_row();
    my %courseinfo;
    foreach my $course (keys(%courses)) {
        my $descr;
        if ($courses{$course} =~ m/^([^:]*):/i) {
            $descr = &unescape($1);
        } else {
            $descr = &unescape($courses{$course});
        }
        my $cleandesc=&HTML::Entities::encode($descr,'<>&"');
        $cleandesc=~s/'/\\'/g;
        my ($cdom,$cnum)=split(/\_/,$course);
       
        my ($desc,$instcode,$owner,$ttype) = split(/:/,$courses{$course});
        $owner = &unescape($owner);
        my ($ownername,$ownerdom);
        if ($owner =~ /:/) {
            ($ownername,$ownerdom) = split(/:/,$owner);
        } else {
            $ownername = $owner;
            if ($owner ne '') {
                $ownerdom = $cdom;
            }
        }
        my %ownernames;
        if ($ownername ne '' && $ownerdom ne '') {
            %ownernames = &Apache::loncommon::getnames($ownername,$ownerdom);
        }
        $courseinfo{$course}{'cdom'} = $cdom;
        $courseinfo{$course}{'cnum'} = $cnum;
        $courseinfo{$course}{'code'} = $instcode;
        $courseinfo{$course}{'ownerlastname'} = $ownernames{'lastname'};
        $courseinfo{$course}{'title'} = $cleandesc;
        $courseinfo{$course}{'owner'} = $owner; 
    }
    my %Sortby;
    foreach my $course (sort(keys(%courses))) {
        if ($env{'form.sortby'} eq 'code') {
            push(@{$Sortby{$courseinfo{$course}{'code'}}},$course);
        } elsif ($env{'form.sortby'} eq 'owner') {
            push(@{$Sortby{$courseinfo{$course}{'ownerlastname'}}},$course);
        } else {
            push(@{$Sortby{$courseinfo{$course}{'title'}}},$course);
        }
    }
    my @sorted_courses;
    if (($env{'form.sortby'} eq 'code') || ($env{'form.sortby'} eq 'owner')) {
        @sorted_courses = sort(keys(%Sortby));
    } else {
        @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby));
    }
    foreach my $item (@sorted_courses) {
        foreach my $course (@{$Sortby{$item}}) {
            $output.=&Apache::loncommon::start_data_table_row(); 
            $output.=&courseinfo_row($courseinfo{$course});
            $output.=&Apache::loncommon::end_data_table_row();
        }
    }
    $output .= &Apache::loncommon::end_data_table();
    return $output;
}

sub courseinfo_row {
    my ($info) = @_;
    my ($cdom,$cnum,$title,$ownerlast,$code,$owner,$output);
    if (ref($info) eq 'HASH') {
        $cdom = $info->{'cdom'};
        $cnum = $info->{'cnum'};
        $title = $info->{'title'};
        $ownerlast = $info->{'ownerlastname'};
        $code = $info->{'code'};
        $owner = $info->{'owner'};
    } else {
        $output = '<td colspan="8">'.&mt('No information available for [_1].',
                                         $code).'</td>';
        return $output;
    }
    my %coursehash = &Apache::lonnet::dump('environment',$cdom,$cnum);
    my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum);
    my %idx;
    my @classids;
    my @crosslistings;
    $idx{'status'} = &Apache::loncoursedata::CL_STATUS();
    my %status_title = &Apache::lonlocal::texthash(
                           Expired => 'Previous access',
                           Active => 'Current access',
                           Future => 'Future access',
                       );
    my %student_count = (
                           Expired => 0,
                           Active => 0,
                           Future => 0,
                       );
    while (my ($student,$data) = each(%$classlist)) {
        $student_count{$data->[$idx{'status'}]} ++;
    }
    my $seclist = &identify_sections($coursehash{'internal.sectionnums'});
    my $xlist_items = &identify_sections($coursehash{'internal.crosslistings'});
    my $countslist;
    my $startaccess = '';
    my $endaccess = '';
    my $now;
    my ($accessdates,$autoenrolldates,$showsyllabus);
    if ( defined($coursehash{'default_enrollment_start_date'}) ) {
        $startaccess = &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_start_date'});
    }
    if ( defined($coursehash{'default_enrollment_end_date'}) ) {
        $endaccess = &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_end_date'});
        if ($coursehash{'default_enrollment_end_date'} == 0) {
            $endaccess = "No ending date";
        }
    }
    if ($startaccess) {
        $accessdates .= &mt('From: ').$startaccess.'<br />';
    }
    if ($endaccess) {
        $accessdates .= &mt('To: ').$endaccess.'<br />';
    }
    $autoenrolldates = &mt('Not enabled');
    if (defined($coursehash{'internal.autoadds'}) && $coursehash{'internal.autoadds'} == 1) {
        my ($autostart,$autoend);
        if ( defined($coursehash{'internal.autostart'}) ) {
            $autostart = &Apache::lonlocal::locallocaltime($coursehash{'internal.autostart'});
        }
        if ( defined($coursehash{'internal.autoend'}) ) {
            $autoend = &Apache::lonlocal::locallocaltime($coursehash{'internal.autoend'});
        }
        if ($coursehash{'internal.autostart'} > $now) {
            if ($coursehash{'internal.autoend'} && $coursehash{'internal.autoend'} < $now) {
                $autoenrolldates = &mt('Not enabled');
            } else {
                my $valid_classes = &get_valid_classes($seclist,$xlist_items,
                                                       $code,$owner,$cdom,$cnum);
                if ($valid_classes ne '') {
                    $autoenrolldates = &mt('Not enabled<br />Starts: ').
                                       $autostart.'<br />'.$valid_classes;
                }
            }
        } else {
            if ($coursehash{'internal.autoend'} && $coursehash{'internal.autoend'} < $now) {
                $autoenrolldates = &mt('Not enabled<br />Ended: ').$autoend;
            } else {
                my $valid_classes = &get_valid_classes($seclist,$xlist_items,
                                                       $code,$owner,$cdom,$cnum);
                if ($valid_classes ne '') {
                    $autoenrolldates = &mt('Currently enabled<br />').
                                       $valid_classes;
                }
            }
        }
    }
    if (defined($coursehash{'showsyllabus'})) {
        $showsyllabus = $coursehash{'showsyllabus'};
    } 
    foreach my $status ('Active','Future','Expired') {
        $countslist .= '<nobr>'.$status_title{$status}.': '.
                       $student_count{$status}.'</nobr><br />';
    }
    if ($xlist_items eq '') {
        $xlist_items = &mt('No');
    }
    $output = '<td>'.$coursehash{'internal.coursecode'}.'</td>'.
              '<td>'.$seclist.'</td>'.
              '<td>'.$xlist_items.'</td>'.
              '<td>'.$title.'&nbsp;<font size="-2">';
    if ($showsyllabus) {
        $output .= &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$cnum,$cdom);
    }
    $output .= '</font></td>'.
               '<td>'.$ownerlast.'</td>'.
               '<td>'.$countslist.'</td>'.
               '<td>'.$accessdates.'</td>'.
               '<td>'.$autoenrolldates.'</td>'; 
    return $output;
}

sub identify_sections {
    my ($seclist) = @_;
    my @secnums;
    if ($seclist =~ /,/) {
        my @sections = split(/,/,$seclist);
        foreach my $sec (@sections) {
            $sec =~ s/:[^:]*$//;
            push(@secnums,$sec);
        }
    } else {
        if ($seclist =~ m/^([^:]+):/) {
            my $sec = $1;
            if (!grep(/^\Q$sec\E$/,@secnums)) {
                push(@secnums,$sec);
            }
        }
    }
    @secnums = sort {$a <=> $b} @secnums;
    my $seclist = join(', ',@secnums);
    return $seclist;
}

sub get_valid_classes {
    my ($seclist,$xlist_items,$crscode,$owner,$cdom,$cnum) = @_;
    my $response;
    my %validations;
    @{$validations{'sections'}} = ();
    @{$validations{'xlists'}} = ();
    my $totalitems = 0;
    if ($seclist) {
        foreach my $sec (split(',',$seclist)) {
            my $class = $crscode.$sec;
            if (&Apache::lonnet::auto_validate_class_sec($cdom,$cnum,$owner,
							 $class) eq 'ok') {
                if (!grep(/^\Q$sec$\E/,@{$validations{'sections'}})) {
                    push(@{$validations{'sections'}},$sec);
                    $totalitems ++;
                }
            }
        }
    }
    if ($xlist_items) {
        foreach my $item (split(',',$xlist_items)) {
            if (&Apache::lonnet::auto_validate_class_sec($cdom,$cnum,$owner,
							 $item) eq 'ok') {
                if (!grep(/^\Q$item$\E/,@{$validations{'xlists'}})) {
                    push(@{$validations{'xlists'}},$item);
                    $totalitems ++;
                }
            }
        }
    }
    if ($totalitems > 0) {
        if (@{$validations{'sections'}}) {
            $response = &mt('Sections: ').
                        join(',',@{$validations{'sections'}}).'<br />';
        }
        if (@{$validations{'xlists'}}) {
            $response .= &mt('Courses: ').
                        join(',',@{$validations{'xlists'}});
        }
    }
    return $response;
}

sub javascript_select_filler {
    my ($formname,$scripttext,$codetitles,$longtitles_str,$allidlist) = @_;
    my $output = <<END;
function courseSet() {
    var longtitles = new Array ("$longtitles_str");
    var valyr = document.$formname.Year.options[document.$formname.Year.selectedIndex].value
    var valsem  = document.$formname.Semester.options[document.$formname.Semester.selectedIndex].value
    var valdept = document.$formname.Department.options[document.$formname.Department.selectedIndex].value
    var valclass = document.$formname.Number.options[document.$formname.Number.selectedIndex].value
    var idyears = new Array("$allidlist");
    var idyr = -1;
    var idsem = -1;
    var iddept = -1;
    document.$formname.Number.length = 0;

    $scripttext

    selYear = document.$formname.Year.selectedIndex-1;
    selSemester = document.$formname.Semester.selectedIndex-1;
    selDepartment = document.$formname.Department.selectedIndex-1;
    if (selYear == -1) {
        if (selSemester == -1) {
            if (selDepartment > -1) {
                document.$formname.Number.options[0] =  new Option('All','0',false,false);
                for (var k=0; k<idcse_by_dep[selDepartment].length; k++) {
                    document.$formname.Number.options[k+1] = new Option(idcse_by_dep[selDepartment][k],idcse_by_dep[selDepartment][k],false,false);

                }
            } 
            else {
                document.$formname.Number.options[0] = new Option("All","0",true,true);
            }
        }
        else {
            if (selDepartment > -1) {
                for (var i=0; i<idcse_by_sem_sems.length; i++) {
                    if (idcse_by_sem_sems[i] == valsem) {
                        idsem = i;
                    }
                }
                if (idsem != -1) {
                    for (var i=0; i<idcse_by_sem_dept[idsem].length; i++) {
                        if (idcse_by_sem_dept[idsem][i] == valdept) {
                            iddept = i;
                        }
                    }
                }
                if (iddept != -1) {
                    document.$formname.Number.options[0] =  new Option('All','0',false,false);
                    for (var k=0; k<idcse_by_sem_num[idsem][iddept].length; k++) {
                        document.$formname.Number.options[k+1] = new Option(idcse_by_sem_num[idsem][iddept][k],idcse_by_sem_num[idsem][iddept][k],false,false);
                    }
                }
                else {
                    document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
                }
            }
            else {
                document.$formname.Number.options[0] = new Option("All","0",true,true);
            }
        }
    }
    else {
        if (selSemester == -1) {
            if (selDepartment > -1) {
                for (var i=0; i<idcse_by_yr_year.length; i++) {
                    if (idcse_by_yr_year[i] == valyr) {
                        idyr = i;
                    }
                }
                if (idyr != -1) {      
                    for (var i=0; i<idcse_by_yr_dept[idyr].length; i++) {
                        if (idcse_by_yr_dept[idyr][i] == valdept) {
                            iddept = i;
                        }
                    }
                }
                if (iddept != -1) {
                    document.$formname.Number.options[0] =  new Option('All','0',false,false);
                    for (var k=0; k<idcse_by_yr_num[idyr][iddept].length; k++) {
                        document.$formname.Number.options[k+1] = new Option(idcse_by_yr_num[idyr][iddept][k],idcse_by_yr_num[idyr][iddept][k],false,false);
                    }
                } 
                else {
                    document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
                }
            }
            else {
                document.$formname.Number.options[0] = new Option("All","0",true,true);
            }
        }
        else {
            for (var k=0; k<idyears.length; k++) {
                if (idyears[k] == valyr) {
                    idyr = k;
                }
            }
            if (idyr != -1) {
                for (var k=0; k<idsems[idyr].length; k++) {
                    if (idsems[idyr][k] == valsem) {
                        idsem = k;
                    }
                }
            }
            if (idsem != -1) {
                for (var k=0; k<idcodes[idyr][idsem].length; k++) {
                    if (idcodes[idyr][idsem][k] == valdept) {
                        iddept = k;
                    }
                }
            }
            if (iddept != -1) {
                document.$formname.Number.options[0] =  new Option('All','0',false,false);
                for (var i=0; i<idcourses[idyr][idsem][iddept].length; i++) {
                    var display = idcourses[idyr][idsem][iddept][i];
                    if (longtitles[3] == 1) {
                        if (idcourseslongs[idyr][idsem][iddept][i] != "") {
                            display = idcourseslongs[idyr][idsem][iddept][i]
                        }
                    }
                    document.$formname.Number.options[i+1] = new Option(display,idcourses[idyr][idsem][iddept][i],false,false)
                }
            }
            else {
                document.$formname.Number.options[0] =  new Option('No courses','0',true,true);
            }
        }
        document.$formname.Number.selectedIndex = 0
    }
}
END
    return $output;
}

1;

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