--- loncom/interface/courseclassifier.pm 2008/03/21 18:00:18 1.5 +++ loncom/interface/courseclassifier.pm 2009/05/01 01:30:08 1.6 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utilities for classifying courses based on institutional code # -# $Id: courseclassifier.pm,v 1.5 2008/03/21 18:00:18 raeburn Exp $ +# $Id: courseclassifier.pm,v 1.6 2009/05/01 01:30:08 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -30,6 +30,7 @@ package Apache::courseclassifier; use strict; use lib '/home/httpd/lib/perl/'; use Apache::lonnet; +use Apache::lonlocal; use LONCAPA; sub retrieve_instcodes { @@ -431,6 +432,7 @@ sub javascript_definitions { 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); + $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[$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) = @_; + 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