--- loncom/interface/courseclassifier.pm 2007/10/06 04:32:49 1.3 +++ loncom/interface/courseclassifier.pm 2023/07/10 01:55:15 1.30 @@ -1,3 +1,7 @@ +# The LearningOnline Network with CAPA +# Utilities for classifying courses based on institutional code +# +# $Id: courseclassifier.pm,v 1.30 2023/07/10 01:55:15 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,28 +30,17 @@ 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') { - $$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; + push(@{$sorted},$item); } } } else { @@ -76,7 +69,8 @@ sub recurse_list { 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]}"); } + @{$$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]}"); @@ -117,7 +111,8 @@ sub recurse_list { } } 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]}"); + %{$$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]}}} = (); @@ -138,7 +133,7 @@ sub build_code_selections { for (my $i=1; $i<@{$codetitles}; $i++) { %{$idarrays{$$codetitles[$i]}} = (); } - foreach my $cid (sort keys %{$codes}) { + foreach my $cid (sort(keys(%{$codes}))) { &recurse_list($cid,$codetitles,$codes,0,\%idarrays); } for (my $num=0; $num<@{$codetitles}; $num++) { @@ -159,7 +154,7 @@ sub build_code_selections { } elsif ($num == 1) { %{$$idlist{$$codetitles[1]}} = (); %{$$idlist_titles{$$codetitles[1]}} = (); - foreach my $key_a (keys %{$idarrays{$$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); @@ -177,10 +172,10 @@ sub build_code_selections { } elsif ($num == 2) { %{$$idlist{$$codetitles[2]}} = (); %{$$idlist_titles{$$codetitles[2]}} = (); - foreach my $key_a (keys %{$idarrays{$$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}}) { + 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); @@ -198,11 +193,11 @@ sub build_code_selections { } } elsif ($num == 3) { %{$$idlist{$$codetitles[3]}} = (); - foreach my $key_a (keys %{$idarrays{$$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}}) { + 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}}) { + 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); @@ -214,20 +209,20 @@ sub build_code_selections { $$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[2]}{$key_a}{$key_b} = join('","',@sorted_c_titles); + $$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]}}) { + foreach my $key_a (keys(%{$idarrays{$$codetitles[4]}})) { %{$$idlist{$$codetitles[4]}{$key_a}} = (); - foreach my $key_b (keys %{$idarrays{$$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}}) { + 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}}) { + 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); @@ -238,6 +233,9 @@ sub build_code_selections { } $$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); + } } } } @@ -247,14 +245,20 @@ sub build_code_selections { } sub javascript_code_selections { - my ($formname,@codetitles) = @_; + my ($formname,$codetitlesref,$knowncodes,$sectionlist) = @_; + return unless (ref($codetitlesref) eq 'ARRAY'); + my @codetitles = @{$codetitlesref}; my $numtitles = @codetitles; + my %lt = &Apache::lonlocal::texthash( + Select => 'Select', + Pick => 'Pick', + ); my $output = (< 0)) { + my @standardnames = &Apache::loncommon::get_standard_codeitems(); + my (%local_to_standard,$currstr); + for (my $i=0; $i<@codetitles; $i++) { + $local_to_standard{$codetitles[$i]} = $standardnames[$i]; + } + $output .= <<"ENDJS"; + +function initialize_codes() { +ENDJS + for (my $i=0; $i<@codetitles-1; $i++) { + my $item = $local_to_standard{$codetitles[$i]}; + $currstr .= $knowncodes->{$codetitles[$i]}; + if ($knowncodes->{$codetitles[$i]} != -1) { + $output .= ' + for (var j=0; j{$codetitles[$i]}.'") { + document.'.$formname.'.'.$item.'.selectedIndex = j; + } + } +'; + } + $output .= ' courseSet('."'$codetitles[$i]'".')'."\n"; + } + my $lastcodetitle = $local_to_standard{$codetitles[-1]}; + $currstr .= $knowncodes->{$codetitles[-1]}; + if ($knowncodes->{$codetitles[-1]} != -1) { + $output .= ' + for (var j=0; j{$codetitles[-1]}.'") { + document.'.$formname.'.'.$lastcodetitle.'.selectedIndex = j; + } + } +'; + } + $output .= " return;\n}\n"; + if ($sectionlist) { + $output .= ' +function toggleSecVis() { + var currcode = ""; + var crscode = '."'$currstr'".'; +'; + for (my $i=0; $i<@codetitles-1; $i++) { + my $item = $local_to_standard{$codetitles[$i]}; + $output .= 'currcode += document.'.$formname.'.'.$item.'.options[document.'.$formname.'.'.$item.'.selectedIndex].value;'."\n"; + } + my $lastcodetitle = $local_to_standard{$codetitles[-1]}; + if ($lastcodetitle ne '') { + if ($knowncodes->{$codetitles[-1]} != -1) { + $output .= 'currcode += document.'.$formname.'.'.$lastcodetitle.'.options[document.'.$formname.'.'.$lastcodetitle.'.selectedIndex].value;'."\n"; + } + } + $output .= <<"ENDSEC"; + var showlist = 'none'; + var showbox = 'inline'; + if ((crscode != '') && (currcode == crscode)) { + showlist = 'inline'; + showbox = 'none'; + } + if (document.getElementById('LC_helpdesk_sectionlist')) { + document.getElementById('LC_helpdesk_sectionlist').style.display = showlist; + } + if (document.getElementById('LC_helpdesk_section')) { + document.getElementById('LC_helpdesk_section').style.display = showbox; + } + return; +} + +ENDSEC + + } + } else { + $output .= <<"END_OF_JS"; function initialize_codes() { courseSet(); return; } -END_OF_BLOCK +END_OF_JS + } + return $output; } - sub javascript_definitions { my ($codetitles,$idlist,$idlist_titles,$idnums,$cat_titles) = @_; my $numtitles = @{$codetitles}; @@ -423,6 +503,7 @@ sub javascript_definitions { sub courseset_js_start { my ($formname,$longtitles_str,$allidlist) = @_; my $output = <{'codetitles'}) eq 'ARRAY') && (ref($instcats->{'codes'}) eq 'HASH') && + (ref($instcats->{'cat_titles'}) eq 'HASH') && (ref($instcats->{'cat_order'}) eq 'HASH')) { + %{$codes} = %{$instcats->{'codes'}}; + @{$codetitles} = @{$instcats->{'codetitles'}}; + %{$cat_titles} = %{$instcats->{'cat_titles'}}; + %{$cat_order} = %{$instcats->{'cat_order'}}; + $totcodes = scalar(keys(%{$codes})); + if ((!$totcodes) && (exists($instcats->{'totcodes'}))) { + $totcodes = $instcats->{'totcodes'}; + } + &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 (@codetitles,%codedefaults,@code_order); + my $instcats = &Apache::lonnet::get_dom_instcats($cdom); + if (ref($instcats) eq 'HASH') { + if (ref($instcats->{'codetitles'}) eq 'ARRAY') { + @codetitles = @{$instcats->{'codetitles'}}; + } + } + my $defaults_result = + &Apache::lonnet::auto_instcode_defaults($cdom,\%codedefaults, + \@code_order); + if (($defaults_result eq 'ok') && (@codetitles > 0)) { + 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;