Diff for /loncom/interface/courseclassifier.pm between versions 1.5 and 1.6

version 1.5, 2008/03/21 18:00:18 version 1.6, 2009/05/01 01:30:08
Line 30  package Apache::courseclassifier; Line 30  package Apache::courseclassifier;
 use strict;  use strict;
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::lonlocal;
 use LONCAPA;  use LONCAPA;
   
 sub retrieve_instcodes {  sub retrieve_instcodes {
Line 431  sub javascript_definitions { Line 432  sub javascript_definitions {
 sub courseset_js_start {  sub courseset_js_start {
     my ($formname,$longtitles_str,$allidlist) = @_;      my ($formname,$longtitles_str,$allidlist) = @_;
     my $output = <<END;      my $output = <<END;
   
 function courseSet(caller) {  function courseSet(caller) {
     var longtitles = new Array ("$longtitles_str");      var longtitles = new Array ("$longtitles_str");
     var idyr = document.$formname.Year.selectedIndex      var idyr = document.$formname.Year.selectedIndex
Line 442  END Line 444  END
     return $output;      return $output;
 }  }
   
   sub instcode_selectors_data {
       my ($codedom,$formname,$cat_items,$codetitles,$cat_titles,$cat_order) = @_;
       my ($jscript,%coursecodes,%codes,%idlist,%idnums,%idlist_titles,
           %by_year,%by_sem,%by_dept);
       my ($numtitles,$lasttitle);
       my $caller = 'global';
       my $totcodes = &retrieve_instcodes(\%coursecodes,$codedom);
       if ($totcodes > 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<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 .= '}';
                   }
               }
           }
       }
       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 .= '<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]}};
               }
               &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 .= '<td align="center">'.$codetitles->[$k].'<br />'."\n".
                          '<select name="'.$codetitles->[$k].'" onChange="courseSet()"'.
                          '>'."\n".'<option value="0" />All'."\n";
               for (my $i=0; $i<@items; $i++) {
                   if ($longitems[$i] eq '') {
                       $longitems[$i] = $items[$i];
                   }
                   $output .= ' <option value="'.$items[$i].'">'.$longitems[$i].'</option>';
               }
               $output .= '</select></td>';
           }
           $output .= '<td align="center">'.$codetitles->[$lasttitle-1].'<br />'."\n".
                      '<select name="'.$codetitles->[$lasttitle-1].'">'."\n".
                      '<option value="0">'.&mt('All')."\n".
                      '</option>'."\n".'</select>'."\n".
                      '</td></tr></table>'."\n";
           if ($numtitles > 4) {
               $output .= '<br /><br />'.$codetitles->[$numtitles-1].'<br />'."\n".
                          '<input type="text" name="'.$codetitles->[$numtitles-1].
                          '" /><br />'."\n";
           }
           $output .= '<br />';
       }
       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 = <<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 instcode_search_str {
       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 = '.+';
           }
       }
       return $instcode;
   }
   
 1;  1;
   

Removed from v.1.5  
changed lines
  Added in v.1.6


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>