Diff for /loncom/interface/domainprefs.pm between versions 1.49 and 1.54

version 1.49, 2008/05/08 22:13:32 version 1.54, 2008/05/31 23:37:46
Line 96  sub handler { Line 96  sub handler {
                                   col2 => '',}],                                    col2 => '',}],
                     },                      },
         'defaults' =>           'defaults' => 
                     { text => 'Default authentication/language',                      { text => 'Default authentication/language/timezone',
                       help => '',                        help => '',
                       header => [{col1 => 'Setting',                        header => [{col1 => 'Setting',
                                   col2 => 'Value'}],                                    col2 => 'Value'}],
Line 1543  sub print_usercreation { Line 1543  sub print_usercreation {
             &Apache::lonnet::inst_userrules($dom,'username');              &Apache::lonnet::inst_userrules($dom,'username');
         my %lt = &usercreation_types();          my %lt = &usercreation_types();
         my %checked;          my %checked;
           my @selfcreate; 
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if (ref($settings->{'cancreate'}) eq 'HASH') {              if (ref($settings->{'cancreate'}) eq 'HASH') {
                 foreach my $item (@creators) {                  foreach my $item (@creators) {
                     $checked{$item} = $settings->{'cancreate'}{$item};                      $checked{$item} = $settings->{'cancreate'}{$item};
                 }                  }
                   if (ref($settings->{'cancreate'}{'selfcreate'}) eq 'ARRAY') {
                       @selfcreate = @{$settings->{'cancreate'}{'selfcreate'}};
                   } elsif ($settings->{'cancreate'}{'selfcreate'} ne '') {
                       if ($settings->{'cancreate'}{'selfcreate'} eq 'any') {
                           @selfcreate = ('email','login','sso');
                       } elsif ($settings->{'cancreate'}{'selfcreate'} ne 'none') {
                           @selfcreate = ($settings->{'cancreate'}{'selfcreate'});
                       }
                   }
             } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {              } elsif (ref($settings->{'cancreate'}) eq 'ARRAY') {
                 foreach my $item (@creators) {                  foreach my $item (@creators) {
                     if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {                      if (grep(/^\Q$item\E$/,@{$settings->{'cancreate'}})) {
Line 1559  sub print_usercreation { Line 1569  sub print_usercreation {
         my $rownum = 0;          my $rownum = 0;
         foreach my $item (@creators) {          foreach my $item (@creators) {
             $rownum ++;              $rownum ++;
             if ($checked{$item} eq '') {              if ($item ne 'selfcreate') {  
                 if ($item eq 'selfcreate') {                  if ($checked{$item} eq '') {
                     $checked{$item} = 'none';  
                 } else {  
                     $checked{$item} = 'any';                      $checked{$item} = 'any';
                 }                  }
             }              }
Line 1575  sub print_usercreation { Line 1583  sub print_usercreation {
             $datatable .= '<tr'.$css_class.'>'.              $datatable .= '<tr'.$css_class.'>'.
                          '<td><span class="LC_nobreak">'.$lt{$item}.                           '<td><span class="LC_nobreak">'.$lt{$item}.
                          '</span></td><td align="right">';                           '</span></td><td align="right">';
             my @options = ('any');              my @options;
             if ($item eq 'selfcreate') {              if ($item eq 'selfcreate') {
                 push(@options,('email','login','sso'));                  push(@options,('email','login','sso'));
             } else {              } else {
                   @options = ('any');
                 if (ref($rules) eq 'HASH') {                  if (ref($rules) eq 'HASH') {
                     if (keys(%{$rules}) > 0) {                      if (keys(%{$rules}) > 0) {
                         push(@options,('official','unofficial'));                          push(@options,('official','unofficial'));
                     }                      }
                 }                  }
                   push(@options,'none');
             }              }
             push(@options,'none');  
             foreach my $option (@options) {              foreach my $option (@options) {
                   my $type = 'radio';
                 my $check = ' ';                  my $check = ' ';
                 if ($checked{$item} eq $option) {                  if ($item eq 'selfcreate') {
                     $check = ' checked="checked" ';                      $type = 'checkbox';
                       if (grep(/^\Q$option\E$/,@selfcreate)) {
                           $check = ' checked="checked" ';
                       }
                   } else {
                       if ($checked{$item} eq $option) {
                           $check = ' checked="checked" ';
                       }
                 }                   } 
                 $datatable .= '<span class="LC_nobreak"><label>'.                  $datatable .= '<span class="LC_nobreak"><label>'.
                               '<input type="radio" name="can_createuser_'.                                '<input type="'.$type.'" name="can_createuser_'.
                               $item.'" value="'.$option.'"'.$check.'/>&nbsp;'.                                $item.'" value="'.$option.'"'.$check.'/>&nbsp;'.
                               $lt{$option}.'</label>&nbsp;&nbsp;</span>';                                $lt{$option}.'</label>&nbsp;&nbsp;</span>';
             }              }
Line 1765  sub print_usermodification { Line 1782  sub print_usermodification {
   
 sub print_defaults {  sub print_defaults {
     my ($dom,$rowtotal) = @_;      my ($dom,$rowtotal) = @_;
     my @items = ('auth_def','auth_arg_def','lang_def');      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def');
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my $titles = &defaults_titles();      my $titles = &defaults_titles();
     my $rownum = 0;      my $rownum = 0;
Line 1797  sub print_defaults { Line 1814  sub print_defaults {
                               '" value="'.$auth.'"'.$checked.'/>'.                                '" value="'.$auth.'"'.$checked.'/>'.
                               $authnames{$shortauth{$auth}}.'</label>&nbsp;&nbsp;';                                $authnames{$shortauth{$auth}}.'</label>&nbsp;&nbsp;';
             }              }
           } elsif ($item eq 'timezone_def') {
               my $includeempty = 1;
               $datatable .= &Apache::loncommon::select_timezone($item,$domdefaults{$item},undef,$includeempty);
         } else {          } else {
             $datatable .= '<input type="text" name="'.$item.'" value="'.              $datatable .= '<input type="text" name="'.$item.'" value="'.
                           $domdefaults{$item}.'" />';                            $domdefaults{$item}.'" />';
Line 1813  sub defaults_titles { Line 1833  sub defaults_titles {
                    'auth_def'      => 'Default authentication type',                     'auth_def'      => 'Default authentication type',
                    'auth_arg_def'  => 'Default authentication argument',                     'auth_arg_def'  => 'Default authentication argument',
                    'lang_def'      => 'Default language',                     'lang_def'      => 'Default language',
                      'timezone_def'  => 'Default timezone',
                  );                   );
     return (\%titles);      return (\%titles);
 }  }
Line 1945  sub print_coursecategories { Line 1966  sub print_coursecategories {
     my $itemcount = 1;      my $itemcount = 1;
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         my (@cats,@trails,%allitems,%idx,@jsarray);          my (@cats,@trails,%allitems,%idx,@jsarray);
         &extract_categories($settings,\@cats,\@trails,\%allitems,\%idx,\@jsarray);          &Apache::loncommon::extract_categories($settings,\@cats,\@trails,
                                                  \%allitems,\%idx,\@jsarray);
         my $maxdepth = scalar(@cats);          my $maxdepth = scalar(@cats);
         my $colattrib = '';          my $colattrib = '';
         if ($maxdepth > 2) {          if ($maxdepth > 2) {
Line 2050  sub coursecategories_javascript { Line 2072  sub coursecategories_javascript {
     my ($output,$jstext);      my ($output,$jstext);
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         my (@cats,@jsarray,%idx);          my (@cats,@jsarray,%idx);
         &gather_categories($settings,\@cats,\%idx,\@jsarray);          &Apache::loncommon::gather_categories($settings,\@cats,\%idx,\@jsarray);
         if (@jsarray > 0) {          if (@jsarray > 0) {
             $jstext = '    var categories = Array('.scalar(@jsarray).');'."\n";              $jstext = '    var categories = Array('.scalar(@jsarray).');'."\n";
             for (my $i=0; $i<@jsarray; $i++) {              for (my $i=0; $i<@jsarray; $i++) {
Line 2147  sub initialize_categories { Line 2169  sub initialize_categories {
     $css_class = $itemcount%2?' class="LC_odd_row"':'';      $css_class = $itemcount%2?' class="LC_odd_row"':'';
     $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','0'".');"';      $chgstr = ' onchange="javascript:reorderCats(this.form,'."'','addcategory_pos','0'".');"';
     $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'      $datatable .= '<tr '.$css_class.'><td><span class="LC_nobreak">'
                   .'<select name="addcategory_pos"'.$chgstr/'><option value="0">1</option>'                    .'<select name="addcategory_pos"'.$chgstr.'><option value="0">1</option>'
                   .'<option value="1" selected="selected">2</option></select>&nbsp;'                    .'<option value="1" selected="selected">2</option></select>&nbsp;'
                   .&mt('Add category').'</td><td>'.&mt('Name:')                    .&mt('Add category').'</td><td>'.&mt('Name:')
                   .'&nbsp;<input type="text" size="20" name="addcategory_name" value="" /></td></tr>';                    .'&nbsp;<input type="text" size="20" name="addcategory_name" value="" /></td></tr>';
Line 2553  sub modify_rolecolors { Line 2575  sub modify_rolecolors {
 sub modify_colors {  sub modify_colors {
     my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;      my ($r,$dom,$confname,$roles,$domconfig,$confhash) = @_;
     my (%changes,%choices);      my (%changes,%choices);
     my @bgs = ('pgbg','mainbg','sidebg');      my @bgs;
     my @links = ('link','alink','vlink');      my @links = ('link','alink','vlink');
     my @logintext;      my @logintext;
     my @images;      my @images;
Line 2568  sub modify_colors { Line 2590  sub modify_colors {
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
             @images = ('img','logo','domlogo','login');              @images = ('img','logo','domlogo','login');
               @bgs = ('pgbg','mainbg','sidebg');
         } else {          } else {
             @images = ('img');              @images = ('img');
               @bgs = ('pgbg','tabbg','sidebg'); 
         }          }
         $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};          $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
         foreach my $item (@bgs,@links,@logintext) {          foreach my $item (@bgs,@links,@logintext) {
Line 3640  sub modify_usercreation { Line 3664  sub modify_usercreation {
     my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');      my @email_rule = &Apache::loncommon::get_env_multiple('form.email_rule');
     my @contexts = ('author','course','selfcreate');      my @contexts = ('author','course','selfcreate');
     foreach my $item(@contexts) {      foreach my $item(@contexts) {
         $cancreate{$item} = $env{'form.can_createuser_'.$item};  
         if ($item eq 'selfcreate') {          if ($item eq 'selfcreate') {
               @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);
             my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);              my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
             if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {              if (!((($domdefaults{'auth_def'} =~/^krb/) && ($domdefaults{'auth_arg_def'} ne '')) || ($domdefaults{'auth_def'} eq 'localauth'))) {
                 if (($cancreate{$item} eq 'any') || ($cancreate{$item} eq 'login')) {                  if (ref($cancreate{$item}) eq 'ARRAY') { 
                     $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.&mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');                         if (grep(/^login$/,@{$cancreate{$item}})) {
                           $warningmsg = &mt('Although account creation has been set to be available for institutional logins, currently default authentication in this domain has not been set to support this.').' '.&mt('You need to set the default authentication type to Kerberos 4 or 5 (with a Kerberos domain specified), or to Local authentication, if the localauth module has been customized in your domain to authenticate institutional logins.');   
                       }
                 }                  }
             }              }
           } else {
               $cancreate{$item} = $env{'form.can_createuser_'.$item};
         }          }
     }      }
     if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {      if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
             if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {              if ($item eq 'selfcreate') {
                 push(@{$changes{'cancreate'}},$item);                  if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') { 
             }                       foreach my $curr (@{$curr_usercreation{'cancreate'}{$item}}) {
                           if (!grep(/^$curr$/,@{$cancreate{$item}})) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       }
                   } else {
                       if ($curr_usercreation{'cancreate'}{$item} eq '') {
                           if (@{$cancreate{$item}} > 0) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       } else {
                           if ($curr_usercreation{'cancreate'}{$item} eq 'any') {
                               if (@{$cancreate{$item}} < 3) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           } elsif ($curr_usercreation{'cancreate'}{$item} eq 'none') {
                               if (@{$cancreate{$item}} > 0) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           } elsif (!grep(/^$curr_usercreation{'cancreate'}{$item}$/,@{$cancreate{$item}})) {
                               if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                   push(@{$changes{'cancreate'}},$item);
                               }
                           }
                       }
                   }
                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                       foreach my $type (@{$cancreate{$item}}) {
                           if (ref($curr_usercreation{'cancreate'}{$item}) eq 'ARRAY') {
                               if (!grep(/^$type$/,@{$curr_usercreation{'cancreate'}{$item}})) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           } elsif (($curr_usercreation{'cancreate'}{$item} ne 'any') &&
                                    ($curr_usercreation{'cancreate'}{$item} ne 'none')) {
                               if ($curr_usercreation{'cancreate'}{$item} ne $type) {
                                   if (!grep(/^$item$/,@{$changes{'cancreate'}})) {
                                       push(@{$changes{'cancreate'}},$item);
                                   }
                               }
                           }
                       }
                   }
               } else {
                   if ($curr_usercreation{'cancreate'}{$item} ne $cancreate{$item}) {
                       push(@{$changes{'cancreate'}},$item);
                   }
               }
         }          }
     } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {      } elsif (ref($curr_usercreation{'cancreate'}) eq 'ARRAY') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
Line 3761  sub modify_usercreation { Line 3845  sub modify_usercreation {
   
     my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%usercreation_hash,
                                              $dom);                                               $dom);
   
       my %selfcreatetypes = (
                                sso   => 'users authenticated by institutional single sign on',
                                login => 'users authenticated by institutional log-in',
                                email => 'users who provide a valid e-mail address for use as the username',
                             );
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
Line 3769  sub modify_usercreation { Line 3859  sub modify_usercreation {
                 foreach my $type (@{$changes{'cancreate'}}) {                  foreach my $type (@{$changes{'cancreate'}}) {
                     my $chgtext =  $lt{$type}.', ';                      my $chgtext =  $lt{$type}.', ';
                     if ($type eq 'selfcreate') {                      if ($type eq 'selfcreate') {
                         if ($cancreate{$type} eq 'none') {                          if (@{$cancreate{$type}} == 0) {
                             $chgtext .= &mt('creation of a new user account is not permitted.');                              $chgtext .= &mt('creation of a new user account is not permitted.');
                         } elsif ($cancreate{$type} eq 'any') {                          } else {
                             $chgtext .= &mt('creation of a new account is permitted for users authenticated by institutional log-in and SSO, and also for e-mail addresses used as usernames.');                              $chgtext .= &mt('creation of a new account is permitted for:<ul>');
                         } elsif ($cancreate{$type} eq 'login') {                              foreach my $case (@{$cancreate{$type}}) {
                             $chgtext .= &mt('creation of a new account is only permitted for users authenticated by institutional log-in.');                                  $chgtext .= '<li>'.$selfcreatetypes{$case}.'</li>';
                         } elsif ($cancreate{$type} eq 'sso') {                              }
                             $chgtext .= &mt('creation of a new account is only permitted for users authenticated by institutional single sign on.');                              $chgtext .= '</ul>';
                         } elsif ($cancreate{$type} eq 'email') {  
                             $chgtext .= &mt('creation of a new account is only permitted for users who provide a valid e-mail address for use as the username.');  
                         }                          }
                     } else {                      } else {
                         if ($cancreate{$type} eq 'none') {                          if ($cancreate{$type} eq 'none') {
Line 3983  sub modify_defaults { Line 4071  sub modify_defaults {
     my ($dom,$r) = @_;      my ($dom,$r) = @_;
     my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);      my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my @items = ('auth_def','auth_arg_def','lang_def');      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def');
     my @authtypes = ('internal','krb4','krb5','localauth');      my @authtypes = ('internal','krb4','krb5','localauth');
     foreach my $item (@items) {      foreach my $item (@items) {
         $newvalues{$item} = $env{'form.'.$item};          $newvalues{$item} = $env{'form.'.$item};
Line 4004  sub modify_defaults { Line 4092  sub modify_defaults {
                     push(@errors,$item);                      push(@errors,$item);
                 }                  }
             }              }
           } elsif ($item eq 'timezone_def') {
               if ($newvalues{$item} ne '') {
                   my @timezones = &DateTime::TimeZone->all_names;
                   if (!grep(/^\Q$newvalues{$item}\E/,@timezones)) {
                       push(@errors,$item);   
                   }
               }
         }          }
         if (grep(/^\Q$item\E$/,@errors)) {          if (grep(/^\Q$item\E$/,@errors)) {
             $newvalues{$item} = $domdefaults{$item};              $newvalues{$item} = $domdefaults{$item};
Line 4015  sub modify_defaults { Line 4110  sub modify_defaults {
                          defaults => { auth_def => $newvalues{'auth_def'},                           defaults => { auth_def => $newvalues{'auth_def'},
                                        auth_arg_def => $newvalues{'auth_arg_def'},                                         auth_arg_def => $newvalues{'auth_arg_def'},
                                        lang_def => $newvalues{'lang_def'},                                         lang_def => $newvalues{'lang_def'},
                                          timezone_def => $newvalues{'timezone_def'},
                                      }                                       }
                        );                         );
     my $title = &defaults_titles();      my $title = &defaults_titles();
Line 4047  sub modify_defaults { Line 4143  sub modify_defaults {
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,              &Apache::lonnet::do_cache_new('domdefaults',$dom,
                                           $defaults_hash{'defaults'},$cachetime);                                            $defaults_hash{'defaults'},$cachetime);
             my $sysmail = $r->dir_config('lonSysEMail');              if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'}) {
             &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);                  my $sysmail = $r->dir_config('lonSysEMail');
                   &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);
               }
         } else {          } else {
             $resulttext = &mt('No changes made to default authentication/language settings');              $resulttext = &mt('No changes made to default authentication/language/timezone settings');
         }          }
     } else {      } else {
         $resulttext = '<span class="LC_error">'.          $resulttext = '<span class="LC_error">'.
Line 4156  sub modify_coursecategories { Line 4254  sub modify_coursecategories {
     if (ref($domconfig{'coursecategories'}) eq 'HASH') {      if (ref($domconfig{'coursecategories'}) eq 'HASH') {
         if (@deletecategory > 0) {          if (@deletecategory > 0) {
             #FIXME Need to remove category from all courses using a deleted category               #FIXME Need to remove category from all courses using a deleted category 
             &extract_categories($domconfig{'coursecategories'},\@predelcats,\@predeltrails,\%predelallitems);              &Apache::loncommon::extract_categories($domconfig{'coursecategories'},\@predelcats,\@predeltrails,\%predelallitems);
             foreach my $item (@deletecategory) {              foreach my $item (@deletecategory) {
                 if ($domconfig{'coursecategories'}{$item} ne '') {                  if ($domconfig{'coursecategories'}{$item} ne '') {
                     delete($domconfig{'coursecategories'}{$item});                      delete($domconfig{'coursecategories'}{$item});
Line 4216  sub modify_coursecategories { Line 4314  sub modify_coursecategories {
             }              }
         }          }
         my (@chkcats,@chktrails,%chkallitems);          my (@chkcats,@chktrails,%chkallitems);
         &extract_categories($domconfig{'coursecategories'},\@chkcats,\@chktrails,\%chkallitems);          &Apache::loncommon::extract_categories($domconfig{'coursecategories'},\@chkcats,\@chktrails,\%chkallitems);
         if (ref($chkcats[0]) eq 'ARRAY') {          if (ref($chkcats[0]) eq 'ARRAY') {
             my $depth = 0;              my $depth = 0;
             my $chg = 0;              my $chg = 0;
Line 4238  sub modify_coursecategories { Line 4336  sub modify_coursecategories {
         }          }
         my $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom);          my $putresult = &Apache::lonnet::put_dom('configuration',\%domconfig,$dom);
         my (@cats,@trails,%allitems);          my (@cats,@trails,%allitems);
         &extract_categories($domconfig{'coursecategories'},\@cats,\@trails,\%allitems);          &Apache::loncommon::extract_categories($domconfig{'coursecategories'},\@cats,\@trails,\%allitems);
         if ($putresult eq 'ok') {          if ($putresult eq 'ok') {
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             if (keys(%deletions) > 0) {              if (keys(%deletions) > 0) {
Line 4323  sub recurse_cat_deletes { Line 4421  sub recurse_cat_deletes {
         }          }
     }      }
     return;      return;
 }  
   
 sub gather_categories {  
     my ($categories,$cats,$idx,$jsarray) = @_;  
     my %counters;  
     my $num = 0;  
     foreach my $item (keys(%{$categories})) {  
         my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$item);  
         if ($container eq '' && $depth == 0) {  
             $cats->[$depth][$categories->{$item}] = $cat;  
         } else {  
             $cats->[$depth]{$container}[$categories->{$item}] = $cat;  
         }  
         my ($escitem,$tail) = split(/:/,$item,2);  
         if ($counters{$tail} eq '') {  
             $counters{$tail} = $num;  
             $num ++;  
         }  
         if (ref($idx) eq 'HASH') {  
             $idx->{$item} = $counters{$tail};  
         }  
         if (ref($jsarray) eq 'ARRAY') {   
             push(@{$jsarray->[$counters{$tail}]},$item);  
         }  
     }  
     return;  
 }  
   
 sub extract_categories {  
     my ($categories,$cats,$trails,$allitems,$idx,$jsarray) = @_;  
     if (ref($categories) eq 'HASH') {  
         &gather_categories($categories,$cats,$idx,$jsarray);  
         if (ref($cats->[0]) eq 'ARRAY') {  
             for (my $i=0; $i<@{$cats->[0]}; $i++) {  
                 my $name = $cats->[0][$i];  
                 my $item = &escape($name).'::0';  
                 my $trailstr;  
                 if ($name eq 'instcode') {  
                     $trailstr = &mt('Official courses (with institutional codes)');  
                 } else {  
                     $trailstr = $name;  
                 }  
                 if ($allitems->{$item} eq '') {  
                     push(@{$trails},$trailstr);  
                     $allitems->{$item} = scalar(@{$trails})-1;  
                 }  
                 my @parents = ($name);  
                 if (ref($cats->[1]{$name}) eq 'ARRAY') {  
                     for (my $j=0; $j<@{$cats->[1]{$name}}; $j++) {  
                         my $category = $cats->[1]{$name}[$j];  
                         &recurse_categories($cats,2,$category,$trails,$allitems,\@parents);  
                     }  
                 }  
             }  
         }  
     }  
     return;  
 }  
   
 sub recurse_categories {  
     my ($cats,$depth,$category,$trails,$allitems,$parents) = @_;  
     my $shallower = $depth - 1;  
     if (ref($cats->[$depth]{$category}) eq 'ARRAY') {  
         for (my $k=0; $k<@{$cats->[$depth]{$category}}; $k++) {  
             my $name = $cats->[$depth]{$category}[$k];  
             my $item = &escape($category).':'.&escape($parents->[-1]).':'.$shallower;  
             my $trailstr = join(' -&gt; ',(@{$parents},$category));  
             if ($allitems->{$item} eq '') {   
                 push(@{$trails},$trailstr);  
                 $allitems->{$item} = scalar(@{$trails})-1;  
             }  
             my $deeper = $depth+1;  
             push(@{$parents},$category);  
             &recurse_categories($cats,$deeper,$name,$trails,$allitems,$parents);  
             pop(@{$parents});  
         }  
     } else {  
         my $item = &escape($category).':'.&escape($parents->[-1]).':'.$shallower;  
         my $trailstr = join(' -&gt; ',(@{$parents},$category));  
         if ($allitems->{$item} eq '') {  
             push(@{$trails},$trailstr);  
             $allitems->{$item} = scalar(@{$trails})-1;  
         }  
     }  
     return;  
 }  }
   
 1;  1;

Removed from v.1.49  
changed lines
  Added in v.1.54


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