# The LearningOnline Network with CAPA # Utilities for classifying courses based on institutional code # # $Id: courseclassifier.pm,v 1.25 2017/01/18 21:07:31 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::loncommon; 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') { if ($courses{$course}{'inst_code'} ne '') { $$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,$codetitlesref) = @_; return unless (ref($codetitlesref) eq 'ARRAY'); my @codetitles = @{$codetitlesref}; my $numtitles = @codetitles; my %lt = &Apache::lonlocal::texthash( Select => 'Select', Pick => 'Pick', ); 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() { var choice; for (var i=0; i[$i].'.selectedIndex = 0;'; } $jscript .= ' } else { if (document.getElementById("instcodes")) { document.getElementById("instcodes").style.display = "block"; } } } function setOfficial(caller) { if (typeof(caller) != "undefined") { if (caller.options[caller.selectedIndex].value != 0) { if (document.'.$formname.'.official.length > 0) { for (var j=0; j[$i]} = $standardnames[$i]; } } $jscript .= ' function setElements() { '; for (my $i=0; $i<@{$codetitles}-1; $i++) { my $item = $local_to_standard{$codetitles->[$i]}; if ($env{'form.'.$item} != -1) { $jscript .= ' for (var j=0; j[-1]}; if ($env{'form.'.$lastcodetitle} != -1) { $jscript .= ' for (var j=0; j 0) { my $style; if ($official eq 'off') { $style = ' style="display: none"'; } if ($id eq '') { $id = 'instcodes'; } my $disabled; if ($noedit) { $disabled = ' disabled="disabled"'; } $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 instcode_selectors { my ($codedom,$formname,$officialjs,$codetitles) = @_; my ($output,%cat_titles,%cat_order,%cat_items); my ($jscript,$totcodes,$numtitles,$lasttitle) = &instcode_selectors_data($codedom,$formname,\%cat_items,$codetitles, \%cat_titles,\%cat_order,$officialjs); if ($numtitles > 0) { my $official = ' checked="checked" '; my $unofficial = ''; if (($formname eq 'filterpicker') && ($env{'form.official'} eq 'off')) { $unofficial = $official; $official = ''; } $output .= ''.&mt('Official course:').' '. (' 'x3).'
'. &build_instcode_selectors($numtitles,$lasttitle,\%cat_items,$codetitles, \%cat_titles,\%cat_order,$env{'form.official'})."\n". ''."\n". ''."\n"; } return ($output,$jscript,$numtitles); } 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 $all = &mt('All'); my $nocrs = &mt('No courses'); my $output = < 0) { for (var i = 0; i< document.$formname.Year.options.length; i++) { if (document.$formname.Year.options[i].value == "$env{'form.Year'}") { document.$formname.Year.selectedIndex = i; break; } } } if (document.$formname.Department.options.length > 0) { for (var i = 0; i< document.$formname.Department.options.length; i++) { if (document.$formname.Department.options[i].value == "$env{'form.Department'}") { document.$formname.Department.selectedIndex = i; break; } } } if (document.$formname.Semester.options.length > 0) { for (var i = 0; i< document.$formname.Semester.options.length; i++) { if (document.$formname.Semester.options[i].value == "$env{'form.Semester'}") { document.$formname.Semester.selectedIndex = i; break; } } } } var selYear = document.$formname.Year.selectedIndex-1; var selSemester = document.$formname.Semester.selectedIndex-1; var 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 -1) { for (var i=0; i -1) { for (var i=0; i -1) { for (var k=0; k 0) { for (var i = 0; i< document.$formname.Number.options.length; i++) { if (document.$formname.Number.options[i].value == "$env{'form.Number'}") { document.$formname.Number.selectedIndex = i; break; } } } } else { $officialjs } } END return $output; } sub instcode_search_str { my ($domain,$numtitles,$codetitles) = @_; my $instcode; if (defined($numtitles) && $numtitles == 0) { $instcode = '.+'; } else { my (%codedefaults,@code_order); my $defaults_result = &Apache::lonnet::auto_instcode_defaults($domain,\%codedefaults, \@code_order); my @standardnames = &Apache::loncommon::get_standard_codeitems(); my %local_to_standard; if (ref($codetitles) eq 'ARRAY') { for (my $i=0; $i<@{$codetitles}; $i++) { $local_to_standard{$codetitles->[$i]} = $standardnames[$i]; } } if ($defaults_result eq 'ok') { $instcode ='^'; foreach my $loctitle (@code_order) { my $item = $local_to_standard{$loctitle}; if ($item ne '') { if ($env{'form.'.$item} eq '0' ) { $instcode .= $codedefaults{$loctitle}; } else { $instcode .= $env{'form.'.$item}; } } else { $instcode .= '.+'; } } $instcode .= '$'; } else { $instcode = '.+'; } } return $instcode; } sub instcode_from_selectors { my ($cdom,$noregexps) = @_; my $instcode; my $caller = 'global'; my (%coursecodes,%codes,@codetitles,%cat_titles,%cat_order, %codedefaults,@code_order); my $format_reply = &Apache::lonnet::auto_instcode_format($caller,$cdom,\%coursecodes, \%codes,\@codetitles,\%cat_titles,\%cat_order); my $defaults_result = &Apache::lonnet::auto_instcode_defaults($cdom,\%codedefaults, \@code_order); if (($defaults_result eq 'ok') && ($format_reply eq 'ok')) { my @standardnames = &Apache::loncommon::get_standard_codeitems(); my %local_to_standard; for (my $i=0; $i<@codetitles; $i++) { $local_to_standard{$codetitles[$i]} = $standardnames[$i]; } foreach my $loctitle (@code_order) { my $category = $local_to_standard{$loctitle}; if ($category ne '') { if ($env{'form.'.$category} eq '-1' ) { if ($noregexps) { $instcode .= ' '; } else { $instcode .= $codedefaults{$category}; } } else { $instcode .= $env{'form.'.$category}; } } else { $instcode .= '.+'; } } } return $instcode; } 1;