# The LearningOnline Network with CAPA # Utilities for classifying courses based on institutional code # # $Id: courseclassifier.pm,v 1.7 2009/05/05 05:30:00 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA# # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # package Apache::courseclassifier; use strict; use lib '/home/httpd/lib/perl/'; use Apache::lonnet; use Apache::lonlocal; use LONCAPA; sub retrieve_instcodes { my ($coursecodes,$codedom) = @_; my $totcodes; my %courses = &Apache::lonnet::courseiddump($codedom,'.',1,'.','.','.', undef,undef,'Course'); foreach my $course (keys(%courses)) { if (ref($courses{$course}) eq 'HASH') { $$coursecodes{$course} = $courses{$course}{'inst_code'}; $totcodes ++; } } return $totcodes; } sub sort_cats { my ($num,$cat_order,$codetitles,$idsarrayref,$sorted) = @_; my @unsorted = @{$idsarrayref}; if (defined($$cat_order{$$codetitles[$num]})) { foreach my $item (@{$$cat_order{$$codetitles[$num]}}) { if (grep/^\Q$item\E$/,@unsorted) { push @{$sorted}, $item; } } } else { @{$sorted} = sort (@unsorted); } } sub recurse_list { my ($cid,$codetitles,$codes,$num,$idarrays) = @_; if ($num == 0) { if (!grep/^$$codes{$cid}{$$codetitles[0]}$/,@{$$idarrays{$$codetitles[0]}}) { push @{$$idarrays{$$codetitles[0]}}, $$codes{$cid}{$$codetitles[0]}; } } elsif ($num == 1) { if (defined($$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}})) { if (!grep/^$$codes{$cid}{$$codetitles[1]}$/,@{$$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}}}) { push @{$$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}}}, $$codes{$cid}{$$codetitles[1]}; } } else { @{$$idarrays{$$codetitles[1]}{$$codes{$cid}{$$codetitles[0]}}} = ("$$codes{$cid}{$$codetitles[1]}"); } } elsif ($num == 2) { if (defined($$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}})) { if (defined($$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}})) { if (!grep/^$$codes{$cid}{$$codetitles[2]}$/,@{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}}) { push @{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}}, $$codes{$cid}{$$codetitles[2]}; } } else { @{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ("$$codes{$cid}{$$codetitles[2]}"); } } else { %{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}} = (); @{$$idarrays{$$codetitles[2]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = ("$$codes{$cid}{$$codetitles[2]}"); } } elsif ($num == 3) { if (defined($$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}})) { if (defined($$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}})) { if (defined($$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}})) { if (!grep/^$$codes{$cid}{$$codetitles[3]}$/,@{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}}) { push @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}}, $$codes{$cid}{$$codetitles[3]}; } } else { @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ("$$codes{$cid}{$$codetitles[3]}"); } } else { %{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = (); @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ("$$codes{$cid}{$$codetitles[3]}"); } } else { %{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}} = (); %{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = (); @{$$idarrays{$$codetitles[3]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = ("$$codes{$cid}{$$codetitles[3]}"); } } elsif ($num == 4) { if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}})) { if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}})) { if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}})) { if (defined($$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}})) { if (!grep/^$$codes{$cid}{$$codetitles[4]}$/,@{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}}) { push @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}}, $$codes{$cid}{$$codetitles[4]}; } } else { @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[4]}"); } } else { %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = (); @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[4]}"); } } else { %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = (); %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = (); @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[4]}"); } } else { %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}} = (); %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}} = (); %{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[2]}}} = (); @{$$idarrays{$$codetitles[4]}{$$codes{$cid}{$$codetitles[0]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[1]}}{$$codes{$cid}{$$codetitles[3]}}} = ("$$codes{$cid}{$$codetitles[3]}"); } } $num ++; if ($num <@{$codetitles}) { &recurse_list($cid,$codetitles,$codes,$num,$idarrays); } } sub build_code_selections { my ($codes,$codetitles,$cat_titles,$cat_order,$idlist,$idnums,$idlist_titles) = @_; my %idarrays = (); for (my $i=1; $i<@{$codetitles}; $i++) { %{$idarrays{$$codetitles[$i]}} = (); } foreach my $cid (sort keys %{$codes}) { &recurse_list($cid,$codetitles,$codes,0,\%idarrays); } for (my $num=0; $num<@{$codetitles}; $num++) { if ($num == 0) { my @contents = (); my @contents_titles = (); &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[0]}},\@contents); if (defined($$cat_titles{$$codetitles[0]})) { foreach (@contents) { push @contents_titles, $$cat_titles{$$codetitles[0]}{$_}; } } $$idlist{$$codetitles[0]} = join('","',@contents); $$idnums{$$codetitles[0]} = scalar(@contents); if (defined($$cat_titles{$$codetitles[0]})) { $$idlist_titles{$$codetitles[0]} = join('","',@contents_titles); } } elsif ($num == 1) { %{$$idlist{$$codetitles[1]}} = (); %{$$idlist_titles{$$codetitles[1]}} = (); foreach my $key_a (keys %{$idarrays{$$codetitles[1]}}) { my @sorted_a = (); my @sorted_a_titles = (); &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[1]}{$key_a}},\@sorted_a); if (defined($$cat_titles{$$codetitles[1]})) { foreach (@sorted_a) { push @sorted_a_titles, $$cat_titles{$$codetitles[1]}{$_}; } } $$idlist{$$codetitles[1]}{$key_a} = join('","',@sorted_a); $$idnums{$$codetitles[1]}{$key_a} = scalar(@sorted_a); if (defined($$cat_titles{$$codetitles[1]})) { $$idlist_titles{$$codetitles[1]}{$key_a} = join('","',@sorted_a_titles); } } } elsif ($num == 2) { %{$$idlist{$$codetitles[2]}} = (); %{$$idlist_titles{$$codetitles[2]}} = (); foreach my $key_a (keys %{$idarrays{$$codetitles[2]}}) { %{$$idlist{$$codetitles[2]}{$key_a}} = (); %{$$idlist_titles{$$codetitles[2]}{$key_a}} = (); foreach my $key_b (keys %{$idarrays{$$codetitles[2]}{$key_a}}) { my @sorted_b = (); my @sorted_b_titles = (); &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[2]}{$key_a}{$key_b}},\@sorted_b); if (defined($$cat_titles{$$codetitles[2]})) { foreach (@sorted_b) { push @sorted_b_titles, $$cat_titles{$$codetitles[2]}{$_}; } } $$idlist{$$codetitles[2]}{$key_a}{$key_b} = join('","',@sorted_b); $$idnums{$$codetitles[2]}{$key_a}{$key_b} = scalar(@sorted_b); if (defined($$cat_titles{$$codetitles[2]})) { $$idlist_titles{$$codetitles[2]}{$key_a}{$key_b} = join('","',@sorted_b_titles); } } } } elsif ($num == 3) { %{$$idlist{$$codetitles[3]}} = (); foreach my $key_a (keys %{$idarrays{$$codetitles[3]}}) { %{$$idlist{$$codetitles[3]}{$key_a}} = (); foreach my $key_b (keys %{$idarrays{$$codetitles[3]}{$key_a}}) { %{$$idlist{$$codetitles[3]}{$key_a}{$key_b}} = (); foreach my $key_c (keys %{$idarrays{$$codetitles[3]}{$key_a}{$key_b}}) { my @sorted_c = (); my @sorted_c_titles = (); &sort_cats($num,$cat_order,$codetitles,\@{$idarrays{$$codetitles[3]}{$key_a}{$key_b}{$key_c}},\@sorted_c); if (defined($$cat_titles{$$codetitles[3]})) { foreach (@sorted_c) { push @sorted_c_titles, $$cat_titles{$$codetitles[3]}{$_}; } } $$idlist{$$codetitles[3]}{$key_a}{$key_b}{$key_c} = join('","',@sorted_c); $$idnums{$$codetitles[3]}{$key_a}{$key_b}{$key_c} = scalar(@sorted_c); if (defined($$cat_titles{$$codetitles[3]})) { $$idlist_titles{$$codetitles[3]}{$key_a}{$key_b}{$key_c} = join('","',@sorted_c_titles); } } } } } elsif ($num == 4) { %{$$idlist{$$codetitles[4]}} = (); foreach my $key_a (keys %{$idarrays{$$codetitles[4]}}) { %{$$idlist{$$codetitles[4]}{$key_a}} = (); foreach my $key_b (keys %{$idarrays{$$codetitles[4]}{$key_a}}) { %{$$idlist{$$codetitles[4]}{$key_a}{$key_b}} = (); foreach my $key_c (keys %{$idarrays{$$codetitles[4]}{$key_a}{$key_b}}) { %{$$idlist{$$codetitles[4]}{$key_a}{$key_b}{$key_c}} = (); foreach my $key_d (keys %{$idarrays{$$codetitles[4]}{$key_a}{$key_b}{$key_c}}) { my @sorted_d = (); my @sorted_d_titles = (); &sort_cats($num,$cat_order,$codetitles,$idarrays{$$codetitles[4]}{$key_a}{$key_b}{$key_c}{$key_d},\@sorted_d); if (defined($$cat_titles{$$codetitles[4]})) { foreach (@sorted_d) { push @sorted_d_titles, $$cat_titles{$$codetitles[4]}{$_}; } } $$idlist{$$codetitles[4]}{$key_a}{$key_b}{$key_c}{$key_d} = join('","',@sorted_d); $$idnums{$$codetitles[4]}{$key_a}{$key_b}{$key_c}{$key_d} = scalar(@sorted_d); if (defined($$cat_titles{$$codetitles[4]})) { $$idlist_titles{$$codetitles[3]}{$key_a}{$key_b}{$key_c}{$key_d} = join('","',@sorted_d_titles); } } } } } } } } sub javascript_code_selections { my ($formname,@codetitles) = @_; my $numtitles = @codetitles; my $output = (<{$codetitles->[$i]})) { $longtitles->[$i] = 1; } else { $longtitles->[$i] = 0; } } my $scripttext; if ($longtitles->[0]) { $scripttext = qq| var idyearslongs = new Array("$idlist_titles->{$codetitles->[0]}")\n|; } $scripttext .= " var idsems = new Array ($idnums->{$codetitles->[0]})\n"; if ($longtitles->[1]) { $scripttext .= " var idsemslongs = new Array ($idnums->{$codetitles->[0]})\n"; } $scripttext .= " var idcodes = new Array ($idnums->{$codetitles->[0]})\n"; if ($longtitles->[2]) { $scripttext .= " var idcodeslongs = new Array ($idnums->{$codetitles->[0]})\n"; } $scripttext .= " var idcourses = new Array ($idnums->{$codetitles->[0]})\n"; if ($longtitles->[3]) { $scripttext .= " var idcourseslongs = new Array ($idnums->{$codetitles->[0]})\n"; } my @sort_a = split/","/,$idlist->{$codetitles->[0]}; for (my $j=0; $j<@sort_a; $j++) { $scripttext .= qq| idsems[$j] = new Array("$idlist->{$codetitles->[1]}{$sort_a[$j]}")\n|; if ($longtitles->[1]) { $scripttext .= qq| idsemslongs[$j] = new Array("$idlist_titles->{$codetitles->[1]}{$sort_a[$j]}")\n|; } $scripttext .= qq| idcodes[$j] = new Array($idnums->{$codetitles->[1]}{$sort_a[$j]})\n|; if ($longtitles->[2]) { $scripttext .= qq| idcodeslongs[$j] = new Array($idnums->{$codetitles->[1]}{$sort_a[$j]})\n|; } $scripttext .= qq| idcourses[$j] = new Array($idnums->{$codetitles->[1]}{$sort_a[$j]})\n|; if ($longtitles->[3]) { $scripttext .= qq| idcourseslongs[$j] = new Array($idnums->{$codetitles->[1]}{$sort_a[$j]})\n|; } my @sort_b = split/","/,$idlist->{$codetitles->[1]}{$sort_a[$j]}; for (my $k=0; $k<@sort_b; $k++) { my $idcode_entry = $idlist->{$codetitles->[2]}{$sort_a[$j]}{$sort_b[$k]}; $scripttext .= qq| idcodes[$j][$k] = new Array("$idcode_entry")\n|; if ($longtitles->[2]) { my $idcodelong_entry = $idlist_titles->{$codetitles->[2]}{$sort_a[$j]}{$sort_b[$k]}; $scripttext .= qq| idcodeslongs[$j][$k] = new Array("$idcodelong_entry")\n|; } $scripttext .= qq| idcourses[$j][$k] = new Array($idnums->{$codetitles->[2]}{$sort_a[$j]}{$sort_b[$k]})\n|; if ($longtitles->[3]) { $scripttext .= qq| idcourseslongs[$j][$k] = new Array($idnums->{$codetitles->[2]}{$sort_a[$j]}{$sort_b[$k]})\n|; } my @sort_c = split/","/,$idlist->{$codetitles->[2]}{$sort_a[$j]}{$sort_b[$k]}; for (my $l=0; $l<@sort_c; $l++) { my $idcourse_entry = $idlist->{$codetitles->[3]}{$sort_a[$j]}{$sort_b[$k]}{$sort_c[$l]}; $scripttext .= qq| idcourses[$j][$k][$l] = new Array("$idcourse_entry")\n|; if ($longtitles->[3]) { my $idcourselong_entry = $idlist_titles->{$codetitles->[3]}{$sort_a[$j]}{$sort_b[$k]}{$sort_c[$l]}; $scripttext .= qq| idcourseslongs[$j][$k][$l] = new Array("$idcourselong_entry")\n|; } } } } return ($scripttext,$longtitles); } sub courseset_js_start { my ($formname,$longtitles_str,$allidlist) = @_; my $output = < 0) { if (&Apache::lonnet::auto_instcode_format($caller,$codedom,\%coursecodes, \%codes,$codetitles,$cat_titles,$cat_order) eq 'ok') { &build_code_selections(\%codes,$codetitles,$cat_titles,$cat_order, \%idlist,\%idnums,\%idlist_titles); my ($scripttext,$longtitles) = &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; } if ($numtitles == 0) { if (!defined($env{'form.state'})) { $env{'form.state'} = 'listing'; } } else { 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); if ($officialjs) { $jscript .= ' function toggleOfficial() {'; for (my $i=0; $i<@{$codetitles}-1; $i++) { $jscript .= ' document.'.$formname.'.'.$codetitles->[$i].'.selectedIndex = 0;'; } $jscript .= ' } function setOfficial(caller) { if (caller.options[caller.selectedIndex].value != 0) { if (document.'.$formname.'.official.length > 0) { for (var j=0; j[$i]} != -1) { $jscript .= ' for (var j=0; j[$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[-1].'.length; j++) { if (document.'.$formname.'.'.$codetitles->[-1].'[j].value == "'.$env{'form.'.$codetitles->[-1]}.'") { document.'.$formname.'.'.$codetitles->[-1].'.selectedIndex = j; } } '; } $jscript .= '}'; } } } } return ($jscript,$totcodes,$numtitles,$lasttitle); } sub build_instcode_selectors { my ($numtitles,$lasttitle,$cat_items,$codetitles,$cat_titles,$cat_order) = @_; my $output; if ($numtitles > 0) { $output .= ''; for (my $k=0; $k<$lasttitle-1; $k++) { my (@items,@unsorted); if (ref($cat_items->{$codetitles->[$k]}) eq 'ARRAY') { @unsorted = @{$cat_items->{$codetitles->[$k]}}; } &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; } $output .= ''; } $output .= '
'.$codetitles->[$k].'
'."\n". '
'.$codetitles->[$lasttitle-1].'
'."\n". ''."\n". '
'."\n"; if ($numtitles > 4) { $output .= '

'.$codetitles->[$numtitles-1].'
'."\n". '
'."\n"; } $output .= '
'; } return $output; } 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; &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; &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; &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; &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 javascript_select_filler { my ($formname,$scripttext,$codetitles,$longtitles_str,$allidlist,$officialjs) = @_; my $output = < -1) { document.$formname.Number.options[0] = new Option('All','0',false,false); for (var k=0; k -1) { for (var i=0; i -1) { for (var i=0; i -1) { for (var k=0; k