--- loncom/interface/coursecatalog.pm 2009/03/18 20:58:02 1.50 +++ loncom/interface/coursecatalog.pm 2010/01/02 22:34:30 1.53.4.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler for displaying the course catalog interface # -# $Id: coursecatalog.pm,v 1.50 2009/03/18 20:58:02 raeburn Exp $ +# $Id: coursecatalog.pm,v 1.53.4.2 2010/01/02 22:34:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -174,7 +174,7 @@ sub course_details { my $js = '<script type="text/javascript">'."\n". &courselink_javascript().'</script>'."\n"; my $start_page = - &Apache::loncommon::start_page('Course Catalog',$js, + &Apache::loncommon::start_page('Course/Community Catalog',$js, { 'add_entries' => \%add_entries, 'no_inline_link' => 1,}); @@ -182,13 +182,13 @@ sub course_details { if ($env{'form.numtitles'} > 0) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursecatalog", - text=>"Select courses"}); + text=>"Course/Community Catalog"}); } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:document.$formname.submit()", text=>"Course listing"}, {text=>"Course details"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Details')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog')); $r->print('<br />'.&mt('Detailed course information:').'<br /><br />'. &print_course_listing($codedom,undef,$trails,$allitems). '<br /><br />'); @@ -226,7 +226,6 @@ function ToSelfenroll(courseid) { END } - sub instcode_course_selector { my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs) = @_; my %coursecodes = (); @@ -234,79 +233,17 @@ sub instcode_course_selector { 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 %add_entries = (topmargin => "0", marginheight => "0",); - my $js; - $totcodes = &Apache::courseclassifier::retrieve_instcodes(\%coursecodes,$codedom); - 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; - } - 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<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 .= '}'; - } - } - } - $js = '<script type"text/javascript">'."\n$jscript\n$catjs\n". + my ($jscript,$totcodes,$numtitles,$lasttitle) = + &Apache::courseclassifier::instcode_selectors_data($codedom,$formname, + \%cat_items,\@codetitles,\%cat_titles,\%cat_order); + my $js = '<script type"text/javascript">'."\n$jscript\n$catjs\n". '</script>'; + if ($totcodes) { if (($env{'form.state'} eq 'listing') && ($numtitles > 0)) { $add_entries{'onLoad'} = 'setElements()'; } @@ -318,43 +255,9 @@ function setElements() { '<input type="hidden" name="currcat_0" value="instcode::0" />'. &additional_filters($codedom)); if ($numtitles > 0) { - $r->print('<b>'.&mt('Choose which course(s) to list.').'</b><br />'); - $r->print('<table><tr>'); - for (my $k=0; $k<$lasttitle-1; $k++) { - my (@items,@unsorted); - if (ref($cat_items{$codetitles[$k]}) eq 'ARRAY') { - @unsorted = @{$cat_items{$codetitles[$k]}}; - } - &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></tr></table>'."\n"); - if ($numtitles > 4) { - $r->print('<br /><br />'.$codetitles[$numtitles-1].'<br />'."\n". - '<input type="text" name="'.$codetitles[$numtitles-1].'" /><br />'."\n"); - } - $r->print('<br />'); + $r->print('<b>'.&mt('Choose which course(s) to list.').'</b><br />'. + &Apache::courseclassifier::build_instcode_selectors($numtitles, + $lasttitle,\%cat_items,\@codetitles,\%cat_titles,\%cat_order)); } $r->print('<input type="hidden" name="coursenum" value="" />'."\n". '<input type="hidden" name="sortby" value="" />'."\n". @@ -389,22 +292,21 @@ sub cat_header { if ($numtitles > 0) { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursecatalog", - text=>"Select courses"}, + text=>"Course/Community Catalog"}, {text=>"Course listing"}); } else { &Apache::lonhtmlcommon::add_breadcrumb ({text=>"Course listing"}); } - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Listing')); } else { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/coursecatalog", - text=>"Select courses"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Select courses')); + text=>"Course/Community Catalog"}); } + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog')); my $onchange; unless (($env{'browser.interface'} eq 'textual') || ($env{'form.interface'} eq 'textual')) { - $onchange = 1; + $onchange = 'this.form.submit()'; } $r->print('<form name="coursecatdom" method="post" action="/adm/coursecatalog">'. '<table border="0"><tr><td><b>'.&mt('Domain:').'</b></td><td>'. @@ -615,113 +517,9 @@ sub user_is_dc { return; } -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 search_official_courselist { my ($domain,$numtitles) = @_; - 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); - if ($defaults_result eq 'ok') { - $instcode ='^'; - foreach my $item (@code_order) { - if ($env{'form.'.$item} eq '0' ) { - $instcode .= $codedefaults{$item}; - } else { - $instcode .= $env{'form.'.$item}; - } - } - $instcode .= '$'; - } else { - $instcode = '.'; - } - } + my $instcode = &Apache::courseclassifier::instcode_search_str($domain,$numtitles); my $showhidden; if (&user_is_dc($domain)) { $showhidden = $env{'form.showhidden'}; @@ -934,7 +732,7 @@ sub build_courseinfo_hash { } } foreach my $owner (@owners) { - my ($ownername,$ownerdom) = @_; + my ($ownername,$ownerdom); if ($owner =~ /:/) { ($ownername,$ownerdom) = split(/:/,$owner); } else { @@ -1219,145 +1017,6 @@ sub get_valid_classes { 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 { - if (selDepartment > -1) { - 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); - } - } - else { - document.$formname.Number.options[0] = new Option('All','0',true,true); - } - } - document.$formname.Number.selectedIndex = 0 - } -} -END - return $output; -} - sub autoenroll_info { my ($coursehash,$now,$seclist,$xlist_items,$code,$owners,$cdom,$cnum) = @_; my $autoenrolldates = &mt('Not enabled');