Diff for /loncom/interface/domainprefs.pm between versions 1.160.6.27 and 1.161

version 1.160.6.27, 2013/10/16 23:57:49 version 1.161, 2012/05/30 16:29:20
Line 45  described at http://www.lon-capa.org. Line 45  described at http://www.lon-capa.org.
 =head1 OVERVIEW  =head1 OVERVIEW
   
 Each institution using LON-CAPA will typically have a single domain designated   Each institution using LON-CAPA will typically have a single domain designated 
 for use by individuals affiliated with the institution.  Accordingly, each domain  for use by individuals affliated with the institution.  Accordingly, each domain
 may define a default set of logos and a color scheme which can be used to "brand"  may define a default set of logos and a color scheme which can be used to "brand"
 the LON-CAPA instance. In addition, an institution will typically have a language  the LON-CAPA instance. In addition, an institution will typically have a language
 and timezone which are used for the majority of courses.  and timezone which are used for the majority of courses.
Line 86  $dom,$settings,$rowtotal,$action. Line 86  $dom,$settings,$rowtotal,$action.
   
 $dom is the domain, $settings is a reference to a hash of current settings for  $dom is the domain, $settings is a reference to a hash of current settings for
 the current context, $rowtotal is a reference to the scalar used to record the   the current context, $rowtotal is a reference to the scalar used to record the 
 number of rows displayed on the page, and $action is the context (quotas,   number of rows displayed on the page, and $action is the context (either quotas 
 requestcourses or requestauthor).  or requestcourses).
   
 The print_quotas routine was orginally created to display/store information  The print_quotas routine was orginally created to display/store information
 about default quota sizes for portfolio spaces for the different types of   about default quota sizes for portfolio spaces for the different types of 
 institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.),   institutional affiliation in the domain (e.g., Faculty, Staff, Student etc.), 
 but is now also used to manage availability of user tools:   but is now also used to manage availability of user tools: 
 i.e., blogs, aboutme page, and portfolios, and the course request tool,  i.e., blogs, aboutme page, and portfolios, and the course request tool,
 used by course owners to request creation of a course, and to display/store  used by course owners to request creation of a course.
 default quota sizes for authoring spaces.  
   
 Outputs: 1  Outputs: 1
   
Line 211  sub handler { Line 210  sub handler {
                 'quotas','autoenroll','autoupdate','autocreate',                  'quotas','autoenroll','autoupdate','autocreate',
                 'directorysrch','usercreation','usermodification',                  'directorysrch','usercreation','usermodification',
                 'contacts','defaults','scantron','coursecategories',                  'contacts','defaults','scantron','coursecategories',
                 'serverstatuses','requestcourses','coursedefaults',                  'serverstatuses','requestcourses','helpsettings',
                 'usersessions','loadbalancing','requestauthor'],$dom);                  'coursedefaults','usersessions','loadbalancing'],$dom);
     my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',      my @prefs_order = ('rolecolors','login','defaults','quotas','autoenroll',
                        'autoupdate','autocreate','directorysrch','contacts',                         'autoupdate','autocreate','directorysrch','contacts',
                        'usercreation','usermodification','scantron',                         'usercreation','usermodification','scantron',
                        'requestcourses','requestauthor','coursecategories',                         'requestcourses','coursecategories','serverstatuses','helpsettings',
                        'serverstatuses','coursedefaults','usersessions');                         'coursedefaults','usersessions');
     my %existing;      if (keys(%servers) > 1) {
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {  
         %existing = %{$domconfig{'loadbalancing'}};  
     }  
     if ((keys(%servers) > 1) || (keys(%existing) > 0)) {  
         push(@prefs_order,'loadbalancing');          push(@prefs_order,'loadbalancing');
     }      }
     my %prefs = (      my %prefs = (
Line 241  sub handler { Line 236  sub handler {
         'login' =>          'login' =>
                     { text => 'Log-in page options',                      { text => 'Log-in page options',
                       help => 'Domain_Configuration_Login_Page',                        help => 'Domain_Configuration_Login_Page',
                       header => [{col1 => 'Log-in Page Items',                        header => [{col1 => 'Item',
                                   col2 => '',},                                    col2 => '',}],
                                  {col1 => 'Log-in Help',  
                                   col2 => 'Value'}],  
                     },                      },
   
         'defaults' =>           'defaults' => 
                     { text => 'Default authentication/language/timezone/portal',                      { text => 'Default authentication/language/timezone/portal',
                       help => 'Domain_Configuration_LangTZAuth',                        help => 'Domain_Configuration_LangTZAuth',
Line 253  sub handler { Line 247  sub handler {
                                   col2 => 'Value'}],                                    col2 => 'Value'}],
                     },                      },
         'quotas' =>           'quotas' => 
                     { text => 'Blogs, personal web pages, webDAV/quotas, portfolios',                      { text => 'User blogs, personal information pages, portfolios',
                       help => 'Domain_Configuration_Quotas',                        help => 'Domain_Configuration_Quotas',
                       header => [{col1 => 'User affiliation',                        header => [{col1 => 'User affiliation',
                                   col2 => 'Available tools',                                    col2 => 'Available tools',
                                   col3 => 'Quotas, Mb; (Authoring requires role)',}],                                    col3 => 'Portfolio quota',}],
                     },                      },
         'autoenroll' =>          'autoenroll' =>
                    { text => 'Auto-enrollment settings',                     { text => 'Auto-enrollment settings',
Line 329  sub handler { Line 323  sub handler {
                              {col1 => 'Setting',                               {col1 => 'Setting',
                               col2 => 'Value'}],                                col2 => 'Value'}],
                  },                   },
         'requestauthor' =>  
                  {text => 'Request authoring space',  
                   help => 'Domain_Configuration_Request_Author',  
                   header => [{col1 => 'User affiliation',  
                               col2 => 'Availability/Processing of requests',},  
                              {col1 => 'Setting',  
                               col2 => 'Value'}],  
                  },  
         'coursecategories' =>          'coursecategories' =>
                   { text => 'Cataloging of courses/communities',                    { text => 'Cataloging of courses/communities',
                     help => 'Domain_Configuration_Cataloging_Courses',                      help => 'Domain_Configuration_Cataloging_Courses',
Line 354  sub handler { Line 340  sub handler {
                               col3 => 'Specific IPs',                                col3 => 'Specific IPs',
                             }],                              }],
                  },                   },
         'coursedefaults' =>          'helpsettings' =>
                    {text   => 'Help page settings',
                     help   => 'Domain_Configuration_Help_Settings',
                     header => [{col1 => 'Authenticated Help Settings',
                                 col2 => ''},
                                {col1 => 'Unauthenticated Help Settings',
                                 col2 => ''}],
                    },
           'coursedefaults' => 
                  {text => 'Course/Community defaults',                   {text => 'Course/Community defaults',
                   help => 'Domain_Configuration_Course_Defaults',                    help => 'Domain_Configuration_Course_Defaults',
                   header => [{col1 => 'Defaults which can be overridden for each course by a DC',                    header => [{col1 => 'Defaults which can be overridden in each course by a CC',
                                 col2 => 'Value',},
                                {col1 => 'Defaults which can be overridden for each course by a DC',
                               col2 => 'Value',},],                                col2 => 'Value',},],
                  },                   },
           'privacy' => 
                    {text   => 'User Privacy',
                     help   => 'Domain_Configuration_User_Privacy',
                     header => [{col1 => 'Setting',
                                 col2 => 'Value',}],
                    },
         'usersessions' =>          'usersessions' =>
                  {text  => 'User session hosting/offloading',                   {text  => 'User session hosting/offloading',
                   help  => 'Domain_Configuration_User_Sessions',                    help  => 'Domain_Configuration_User_Sessions',
Line 371  sub handler { Line 373  sub handler {
                               col2 => 'Rules'}],                                col2 => 'Rules'}],
                  },                   },
          'loadbalancing' =>           'loadbalancing' =>
                  {text  => 'Dedicated Load Balancer(s)',                   {text  => 'Dedicated Load Balancer',
                   help  => 'Domain_Configuration_Load_Balancing',                    help  => 'Domain_Configuration_Load_Balancing',
                   header => [{col1 => 'Balancers',                    header => [{col1 => 'Server',
                               col2 => 'Default destinations',                                col2 => 'Default destinations',
                               col3 => 'User affiliation',                                col3 => 'User affliation',
                               col4 => 'Overrides'},                                col4 => 'Overrides'},
                             ],                              ],
                  },                   },
Line 386  sub handler { Line 388  sub handler {
                             header => [{col1 => 'Log-in Service',                              header => [{col1 => 'Log-in Service',
                                         col2 => 'Server Setting',},                                          col2 => 'Server Setting',},
                                        {col1 => 'Log-in Page Items',                                         {col1 => 'Log-in Page Items',
                                         col2 => ''},                                          col2 => ''}],
                                        {col1 => 'Log-in Help',  
                                         col2 => 'Value'}],  
                            };                             };
     }      }
   
     my @roles = ('student','coordinator','author','admin');      my @roles = ('student','coordinator','author','admin');
     my @actions = &Apache::loncommon::get_env_multiple('form.actions');      my @actions = &Apache::loncommon::get_env_multiple('form.actions');
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
     ({href=>"javascript:changePage(document.$phase,'pickactions')",      ({href=>"javascript:changePage(document.$phase,'pickactions')",
       text=>"Settings to display/modify"});        text=>"Settings to display/modify"});
     my $confname = $dom.'-domainconfig';      my $confname = $dom.'-domainconfig';
   
     if ($phase eq 'process') {      if ($phase eq 'process') {
         my $result = &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,          &Apache::lonconfigsettings::make_changes($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,\@roles);
                                                               \%prefs,\%domconfig,$confname,\@roles);  
         if (ref($result) eq 'HASH') {  
             $r->rflush();  
             &devalidate_remote_domconfs($dom,$result);  
         }  
     } elsif ($phase eq 'display') {      } elsif ($phase eq 'display') {
         my $js = &recaptcha_js().          my $js;
                  &credits_js();          if (keys(%servers) > 1) {
         if ((keys(%servers) > 1) || (keys(%existing) > 0)) {  
             my ($othertitle,$usertypes,$types) =              my ($othertitle,$usertypes,$types) =
                 &Apache::loncommon::sorted_inst_types($dom);                  &Apache::loncommon::sorted_inst_types($dom);
             $js .= &lonbalance_targets_js($dom,$types,\%servers,              $js = &lonbalance_targets_js($dom,$types,\%servers).
                                           $domconfig{'loadbalancing'}).                    &new_spares_js().
                    &new_spares_js().                    &common_domprefs_js().
                    &common_domprefs_js().                    &Apache::loncommon::javascript_array_indexof();
                    &Apache::loncommon::javascript_array_indexof();  
         }          }
         &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);          &Apache::lonconfigsettings::display_settings($r,$dom,$phase,$context,\@prefs_order,\%prefs,\%domconfig,$confname,$js);
     } else {      } else {
 # check if domconfig user exists for the domain.  
         my $servadm = $r->dir_config('lonAdmEMail');  
         my ($configuserok,$author_ok,$switchserver) =  
             &config_check($dom,$confname,$servadm);  
         unless ($configuserok eq 'ok') {  
             &Apache::lonconfigsettings::print_header($r,$phase,$context);  
             $r->print(&mt('The domain configuration user "[_1]" has yet to be created.',  
                           $confname).  
                       '<br />'  
             );  
             if ($switchserver) {  
                 $r->print(&mt('Ordinarily, that domain configuration user is created when the ./UPDATE script is run to install LON-CAPA for the first time.').  
                           '<br />'.  
                           &mt('However, that does not apply when new domains are added to a multi-domain server, and ./UPDATE has not been run recently.').  
                           '<br />'.  
                           &mt('The "[_1]" user can be created automatically when a Domain Coordinator visits the web-based "Set domain configuration" screen, in a session hosted on the primary library server.',$confname).  
                           '<br />'.  
                           &mt('To do that now, use the following link: [_1]',$switchserver)  
                 );  
             } else {  
                 $r->print(&mt('To create that user from the command line run the ./UPDATE script found in the top level directory of the extracted LON-CAPA tarball.').  
                           '<br />'.  
                           &mt('Once that is done, you will be able to use the web-based "Set domain configuration" to configure the domain')  
                 );  
             }  
             $r->print(&Apache::loncommon::end_page());  
             return OK;  
         }  
         if (keys(%domconfig) == 0) {          if (keys(%domconfig) == 0) {
             my $primarylibserv = &Apache::lonnet::domain($dom,'primary');              my $primarylibserv = &Apache::lonnet::domain($dom,'primary');
             my @ids=&Apache::lonnet::current_machine_ids();              my @ids=&Apache::lonnet::current_machine_ids();
Line 487  sub handler { Line 450  sub handler {
 }  }
   
 sub process_changes {  sub process_changes {
     my ($r,$dom,$confname,$action,$roles,$values,$lastactref) = @_;      my ($r,$dom,$confname,$action,$roles,$values) = @_;
     my %domconfig;      my %domconfig;
     if (ref($values) eq 'HASH') {      if (ref($values) eq 'HASH') {
         %domconfig = %{$values};          %domconfig = %{$values};
     }      }
     my $output;      my $output;
     if ($action eq 'login') {      if ($action eq 'login') {
         $output = &modify_login($r,$dom,$confname,$lastactref,%domconfig);          $output = &modify_login($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'rolecolors') {      } elsif ($action eq 'rolecolors') {
         $output = &modify_rolecolors($r,$dom,$confname,$roles,          $output = &modify_rolecolors($r,$dom,$confname,$roles,
                                      $lastactref,%domconfig);                                       %domconfig);
     } elsif ($action eq 'quotas') {      } elsif ($action eq 'quotas') {
         $output = &modify_quotas($dom,$action,$lastactref,%domconfig);          $output = &modify_quotas($dom,$action,%domconfig);
     } elsif ($action eq 'autoenroll') {      } elsif ($action eq 'autoenroll') {
         $output = &modify_autoenroll($dom,$lastactref,%domconfig);          $output = &modify_autoenroll($dom,%domconfig);
     } elsif ($action eq 'autoupdate') {      } elsif ($action eq 'autoupdate') {
         $output = &modify_autoupdate($dom,%domconfig);          $output = &modify_autoupdate($dom,%domconfig);
     } elsif ($action eq 'autocreate') {      } elsif ($action eq 'autocreate') {
Line 513  sub process_changes { Line 476  sub process_changes {
     } elsif ($action eq 'usermodification') {      } elsif ($action eq 'usermodification') {
         $output = &modify_usermodification($dom,%domconfig);          $output = &modify_usermodification($dom,%domconfig);
     } elsif ($action eq 'contacts') {      } elsif ($action eq 'contacts') {
         $output = &modify_contacts($dom,$lastactref,%domconfig);          $output = &modify_contacts($dom,%domconfig);
     } elsif ($action eq 'defaults') {      } elsif ($action eq 'defaults') {
         $output = &modify_defaults($dom,$lastactref,%domconfig);          $output = &modify_defaults($dom,$r);
     } elsif ($action eq 'scantron') {      } elsif ($action eq 'scantron') {
         $output = &modify_scantron($r,$dom,$confname,$lastactref,%domconfig);          $output = &modify_scantron($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'coursecategories') {      } elsif ($action eq 'coursecategories') {
         $output = &modify_coursecategories($dom,%domconfig);          $output = &modify_coursecategories($dom,%domconfig);
     } elsif ($action eq 'serverstatuses') {      } elsif ($action eq 'serverstatuses') {
         $output = &modify_serverstatuses($dom,%domconfig);          $output = &modify_serverstatuses($dom,%domconfig);
     } elsif ($action eq 'requestcourses') {      } elsif ($action eq 'requestcourses') {
         $output = &modify_quotas($dom,$action,$lastactref,%domconfig);          $output = &modify_quotas($dom,$action,%domconfig);
     } elsif ($action eq 'requestauthor') {      } elsif ($action eq 'helpsettings') {
         $output = &modify_quotas($dom,$action,$lastactref,%domconfig);          $output = &modify_helpsettings($r,$dom,$confname,%domconfig);
     } elsif ($action eq 'coursedefaults') {      } elsif ($action eq 'coursedefaults') {
         $output = &modify_coursedefaults($dom,$lastactref,%domconfig);          $output = &modify_coursedefaults($dom,%domconfig);
     } elsif ($action eq 'usersessions') {      } elsif ($action eq 'usersessions') {
         $output = &modify_usersessions($dom,$lastactref,%domconfig);          $output = &modify_usersessions($dom,%domconfig);
     } elsif ($action eq 'loadbalancing') {      } elsif ($action eq 'loadbalancing') {
         $output = &modify_loadbalancing($dom,%domconfig);          $output = &modify_loadbalancing($dom,%domconfig);
     }      }
Line 558  sub print_config_box { Line 521  sub print_config_box {
     if ($numheaders > 1) {      if ($numheaders > 1) {
         my $colspan = '';          my $colspan = '';
         my $rightcolspan = '';          my $rightcolspan = '';
         if (($action eq 'rolecolors') || ($action eq 'coursecategories') ||          if (($action eq 'rolecolors') || ($action eq 'coursecategories') || ($action eq 'helpsettings')) {
             (($action eq 'login') && ($numheaders < 3))) {  
             $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
         }          }
         if ($action eq 'usersessions') {          if ($action eq 'usersessions') {
Line 583  sub print_config_box { Line 545  sub print_config_box {
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('top',$dom,$item,$settings,\$rowtotal);
         } elsif ($action eq 'login') {          } elsif ($action eq 'login') {
             if ($numheaders == 3) {              $output .= &print_login('top',$dom,$confname,$phase,$settings,\$rowtotal);
                 $colspan = ' colspan="2"';              $colspan = ' colspan="2"';
                 $output .= &print_login('service',$dom,$confname,$phase,$settings,\$rowtotal);  
             } else {  
                 $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal);  
             }  
         } elsif ($action eq 'requestcourses') {          } elsif ($action eq 'requestcourses') {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } elsif ($action eq 'requestauthor') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'usersessions') {          } elsif ($action eq 'usersessions') {
             $output .= &print_usersessions('top',$dom,$settings,\$rowtotal);               $output .= &print_usersessions('top',$dom,$settings,\$rowtotal); 
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);              $output .= &print_rolecolors($phase,'student',$dom,$confname,$settings,\$rowtotal);
           } elsif ($action eq 'coursedefaults') {
               $output .= &print_coursedefaults('top',$dom,$settings,\$rowtotal);
         }          }
         $output .= '          $output .= '
            </table>             </table>
Line 653  sub print_config_box { Line 613  sub print_config_box {
         } elsif ($action eq 'coursecategories') {          } elsif ($action eq 'coursecategories') {
             $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);              $output .= &print_coursecategories('bottom',$dom,$item,$settings,\$rowtotal);
         } elsif ($action eq 'login') {          } elsif ($action eq 'login') {
             if ($numheaders == 3) {              $output .= &print_login('bottom',$dom,$confname,$phase,$settings,\$rowtotal);
                 $output .= &print_login('page',$dom,$confname,$phase,$settings,\$rowtotal).'  
            </table>  
           </td>  
          </tr>  
          <tr>  
            <td>  
             <table class="LC_nested">  
              <tr class="LC_info_row">  
               <td class="LC_left_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col1'}).'</td>  
               <td class="LC_right_item"'.$colspan.'>'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.  
                        &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);  
                 $rowtotal ++;  
             } else {  
                 $output .= &print_login('help',$dom,$confname,$phase,$settings,\$rowtotal);  
             }  
         } elsif ($action eq 'requestcourses') {          } elsif ($action eq 'requestcourses') {
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);              $output .= &print_courserequestmail($dom,$settings,\$rowtotal);
         } elsif ($action eq 'requestauthor') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_requestmail($dom,$action,$settings,\$rowtotal);              $output .= &print_helpsettings('bottom',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'usersessions') {          } elsif ($action eq 'usersessions') {
             $output .= &print_usersessions('middle',$dom,$settings,\$rowtotal).'              $output .= &print_usersessions('middle',$dom,$settings,\$rowtotal).'
            </table>             </table>
Line 686  sub print_config_box { Line 631  sub print_config_box {
               <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.                <td class="LC_right_item">'.&mt($item->{'header'}->[2]->{'col2'}).'</td>      </tr>'.
                        &print_usersessions('bottom',$dom,$settings,\$rowtotal);                         &print_usersessions('bottom',$dom,$settings,\$rowtotal);
             $rowtotal ++;              $rowtotal ++;
           } elsif ($action eq 'coursedefaults') {
               $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal);
         } elsif ($action eq 'rolecolors') {          } elsif ($action eq 'rolecolors') {
             $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'              $output .= &print_rolecolors($phase,'coordinator',$dom,$confname,$settings,\$rowtotal).'
            </table>             </table>
Line 762  sub print_config_box { Line 709  sub print_config_box {
         }          }
         $output .= '</tr>';          $output .= '</tr>';
         $rowtotal ++;          $rowtotal ++;
         if ($action eq 'quotas') {          if ($action eq 'login') {
               $output .= &print_login('bottom',$dom,$confname,$phase,$settings,
                                       \$rowtotal);
           } elsif ($action eq 'quotas') {
             $output .= &print_quotas($dom,$settings,\$rowtotal,$action);              $output .= &print_quotas($dom,$settings,\$rowtotal,$action);
         } elsif ($action eq 'autoenroll') {          } elsif ($action eq 'autoenroll') {
             $output .= &print_autoenroll($dom,$settings,\$rowtotal);              $output .= &print_autoenroll($dom,$settings,\$rowtotal);
Line 773  sub print_config_box { Line 723  sub print_config_box {
         } elsif ($action eq 'contacts') {          } elsif ($action eq 'contacts') {
             $output .= &print_contacts($dom,$settings,\$rowtotal);              $output .= &print_contacts($dom,$settings,\$rowtotal);
         } elsif ($action eq 'defaults') {          } elsif ($action eq 'defaults') {
             $output .= &print_defaults($dom,$settings,\$rowtotal);              $output .= &print_defaults($dom,\$rowtotal);
         } elsif ($action eq 'scantron') {          } elsif ($action eq 'scantron') {
             $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);              $output .= &print_scantronformat($r,$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'serverstatuses') {          } elsif ($action eq 'serverstatuses') {
             $output .= &print_serverstatuses($dom,$settings,\$rowtotal);              $output .= &print_serverstatuses($dom,$settings,\$rowtotal);
         } elsif ($action eq 'helpsettings') {          } elsif ($action eq 'helpsettings') {
             $output .= &print_helpsettings($dom,$confname,$settings,\$rowtotal);              $output .= &print_helpsettings('top',$dom,$confname,$settings,\$rowtotal);
         } elsif ($action eq 'loadbalancing') {          } elsif ($action eq 'loadbalancing') {
             $output .= &print_loadbalancing($dom,$settings,\$rowtotal);              $output .= &print_loadbalancing($dom,$settings,\$rowtotal);
         } elsif ($action eq 'coursedefaults') {  
             $output .= &print_coursedefaults('bottom',$dom,$settings,\$rowtotal);  
         }          }
     }      }
     $output .= '      $output .= '
Line 795  sub print_config_box { Line 743  sub print_config_box {
 }  }
   
 sub print_login {  sub print_login {
     my ($caller,$dom,$confname,$phase,$settings,$rowtotal) = @_;      my ($position,$dom,$confname,$phase,$settings,$rowtotal) = @_;
     my ($css_class,$datatable);      my ($css_class,$datatable);
     my %choices = &login_choices();      my %choices = &login_choices();
   
     if ($caller eq 'service') {      if ($position eq 'top') {
         my %servers = &Apache::lonnet::internet_dom_servers($dom);          my %servers = &Apache::lonnet::internet_dom_servers($dom);
         my $choice = $choices{'disallowlogin'};          my $choice = $choices{'disallowlogin'};
         $css_class = ' class="LC_odd_row"';          $css_class = ' class="LC_odd_row"';
Line 826  sub print_login { Line 774  sub print_login {
                           '<td><select name="'.$lonhost.'_server">'.                            '<td><select name="'.$lonhost.'_server">'.
                           '<option value=""'.$direct.'>'.$choices{'directlogin'}.                            '<option value=""'.$direct.'>'.$choices{'directlogin'}.
                           '</option>';                            '</option>';
             foreach my $hostid (sort(keys(%servers))) {              foreach my $hostid (keys(%servers)) {
                 next if ($servers{$hostid} eq $servers{$lonhost});                  next if ($servers{$hostid} eq $servers{$lonhost});
                 my $selected = '';                  my $selected = '';
                 if (ref($disallowed{$lonhost}) eq 'HASH') {                  if (ref($disallowed{$lonhost}) eq 'HASH') {
Line 866  sub print_login { Line 814  sub print_login {
         }          }
         $datatable .= '</table></td></tr>';          $datatable .= '</table></td></tr>';
         return $datatable;          return $datatable;
     } elsif ($caller eq 'page') {      }
         my %defaultchecked = (   
                                'coursecatalog' => 'on',      my %defaultchecked = ( 
                                'helpdesk'      => 'on',                             'coursecatalog' => 'on',
                                'adminmail'     => 'off',                             'adminmail'     => 'off',
                                'newuser'       => 'off',                             'newuser'       => 'off',
                              );                           );
         my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');      my @toggles = ('coursecatalog','adminmail','newuser');
         my (%checkedon,%checkedoff);      my (%checkedon,%checkedoff);
       foreach my $item (@toggles) {
           if ($defaultchecked{$item} eq 'on') { 
               $checkedon{$item} = ' checked="checked" ';
               $checkedoff{$item} = ' ';
           } elsif ($defaultchecked{$item} eq 'off') {
               $checkedoff{$item} = ' checked="checked" ';
               $checkedon{$item} = ' ';
           }
       }
       my @images = ('img','logo','domlogo','login');
       my @logintext = ('textcol','bgcol');
       my @bgs = ('pgbg','mainbg','sidebg');
       my @links = ('link','alink','vlink');
       my %designhash = &Apache::loncommon::get_domainconf($dom);
       my %defaultdesign = %Apache::loncommon::defaultdesign;
       my (%is_custom,%designs);
       my %defaults = (
                      font => $defaultdesign{'login.font'},
                      );
       foreach my $item (@images) {
           $defaults{$item} = $defaultdesign{'login.'.$item};
           $defaults{'showlogo'}{$item} = 1;
       }
       foreach my $item (@bgs) {
           $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};
       }
       foreach my $item (@logintext) {
           $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item};
       }
       foreach my $item (@links) {
           $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};
       }
       if (ref($settings) eq 'HASH') {
         foreach my $item (@toggles) {          foreach my $item (@toggles) {
             if ($defaultchecked{$item} eq 'on') {               if ($settings->{$item} eq '1') {
                 $checkedon{$item} = ' checked="checked" ';                  $checkedon{$item} =  ' checked="checked" ';
                 $checkedoff{$item} = ' ';                  $checkedoff{$item} = ' ';
             } elsif ($defaultchecked{$item} eq 'off') {              } elsif ($settings->{$item} eq '0') {
                 $checkedoff{$item} = ' checked="checked" ';                  $checkedoff{$item} =  ' checked="checked" ';
                 $checkedon{$item} = ' ';                  $checkedon{$item} = ' ';
             }              }
         }          }
         my @images = ('img','logo','domlogo','login');  
         my @logintext = ('textcol','bgcol');  
         my @bgs = ('pgbg','mainbg','sidebg');  
         my @links = ('link','alink','vlink');  
         my %designhash = &Apache::loncommon::get_domainconf($dom);  
         my %defaultdesign = %Apache::loncommon::defaultdesign;  
         my (%is_custom,%designs);  
         my %defaults = (  
                        font => $defaultdesign{'login.font'},  
                        );  
         foreach my $item (@images) {          foreach my $item (@images) {
             $defaults{$item} = $defaultdesign{'login.'.$item};              if (defined($settings->{$item})) {
             $defaults{'showlogo'}{$item} = 1;                  $designs{$item} = $settings->{$item};
         }                  $is_custom{$item} = 1;
         foreach my $item (@bgs) {              }
             $defaults{'bgs'}{$item} = $defaultdesign{'login.'.$item};              if (defined($settings->{'showlogo'}{$item})) {
                   $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item};
               }
         }          }
         foreach my $item (@logintext) {          foreach my $item (@logintext) {
             $defaults{'logintext'}{$item} = $defaultdesign{'login.'.$item};              if ($settings->{$item} ne '') {
                   $designs{'logintext'}{$item} = $settings->{$item};
                   $is_custom{$item} = 1;
               }
         }          }
         foreach my $item (@links) {          if ($settings->{'font'} ne '') {
             $defaults{'links'}{$item} = $defaultdesign{'login.'.$item};              $designs{'font'} = $settings->{'font'};
               $is_custom{'font'} = 1;
         }          }
         if (ref($settings) eq 'HASH') {          foreach my $item (@bgs) {
             foreach my $item (@toggles) {              if ($settings->{$item} ne '') {
                 if ($settings->{$item} eq '1') {                  $designs{'bgs'}{$item} = $settings->{$item};
                     $checkedon{$item} =  ' checked="checked" ';                  $is_custom{$item} = 1;
                     $checkedoff{$item} = ' ';  
                 } elsif ($settings->{$item} eq '0') {  
                     $checkedoff{$item} =  ' checked="checked" ';  
                     $checkedon{$item} = ' ';  
                 }  
             }  
             foreach my $item (@images) {  
                 if (defined($settings->{$item})) {  
                     $designs{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
                 if (defined($settings->{'showlogo'}{$item})) {  
                     $designs{'showlogo'}{$item} = $settings->{'showlogo'}{$item};  
                 }  
             }  
             foreach my $item (@logintext) {  
                 if ($settings->{$item} ne '') {  
                     $designs{'logintext'}{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
             if ($settings->{'font'} ne '') {  
                 $designs{'font'} = $settings->{'font'};  
                 $is_custom{'font'} = 1;  
             }  
             foreach my $item (@bgs) {  
                 if ($settings->{$item} ne '') {  
                     $designs{'bgs'}{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
             foreach my $item (@links) {  
                 if ($settings->{$item} ne '') {  
                     $designs{'links'}{$item} = $settings->{$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
         } else {  
             if ($designhash{$dom.'.login.font'} ne '') {  
                 $designs{'font'} = $designhash{$dom.'.login.font'};  
                 $is_custom{'font'} = 1;  
             }  
             foreach my $item (@images) {  
                 if ($designhash{$dom.'.login.'.$item} ne '') {  
                     $designs{$item} = $designhash{$dom.'.login.'.$item};  
                     $is_custom{$item} = 1;  
                 }  
             }  
             foreach my $item (@bgs) {  
                 if ($designhash{$dom.'.login.'.$item} ne '') {  
                     $designs{'bgs'}{$item} = $designhash{$dom.'.login.'.$item};  
                     $is_custom{$item} = 1;  
                 }  
             }              }
             foreach my $item (@links) {          }
                 if ($designhash{$dom.'.login.'.$item} ne '') {          foreach my $item (@links) {
                     $designs{'links'}{$item} = $designhash{$dom.'.login.'.$item};              if ($settings->{$item} ne '') {
                     $is_custom{$item} = 1;                  $designs{'links'}{$item} = $settings->{$item};
                 }                  $is_custom{$item} = 1;
             }              }
         }          }
         my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',      } else {
                                                       logo => 'Institution Logo',          if ($designhash{$dom.'.login.font'} ne '') {
                                                       domlogo => 'Domain Logo',              $designs{'font'} = $designhash{$dom.'.login.font'};
                                                       login => 'Login box');              $is_custom{'font'} = 1;
         my $itemcount = 1;  
         foreach my $item (@toggles) {  
             $css_class = $itemcount%2?' class="LC_odd_row"':'';  
             $datatable .=    
                 '<tr'.$css_class.'><td colspan="2">'.$choices{$item}.  
                 '</td><td>'.  
                 '<span class="LC_nobreak"><label><input type="radio" name="'.  
                 $item.'"'.$checkedon{$item}.' value="1" />'.&mt('Yes').  
                 '</label>&nbsp;<label><input type="radio" name="'.$item.'"'.  
                 $checkedoff{$item}.' value="0" />'.&mt('No').'</label></span></td>'.  
                 '</tr>';  
             $itemcount ++;  
         }          }
         $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext);          foreach my $item (@images) {
         $datatable .= '</tr></table></td></tr>';              if ($designhash{$dom.'.login.'.$item} ne '') {
     } elsif ($caller eq 'help') {                  $designs{$item} = $designhash{$dom.'.login.'.$item};
         my ($defaulturl,$defaulttype,%url,%type,%lt,%langchoices);                  $is_custom{$item} = 1;
         my $switchserver = &check_switchserver($dom,$confname);  
         my $itemcount = 1;  
         $defaulturl = '/adm/loginproblems.html';  
         $defaulttype = 'default';  
         %lt = &Apache::lonlocal::texthash (  
                      del     => 'Delete?',  
                      rep     => 'Replace:',  
                      upl     => 'Upload:',  
                      default => 'Default',  
                      custom  => 'Custom',  
                                              );  
         %langchoices = &Apache::lonlocal::texthash(&get_languages_hash());  
         my @currlangs;  
         if (ref($settings) eq 'HASH') {  
             if (ref($settings->{'helpurl'}) eq 'HASH') {  
                 foreach my $key (sort(keys(%{$settings->{'helpurl'}}))) {  
                     next if ($settings->{'helpurl'}{$key} eq '');  
                     $url{$key} = $settings->{'helpurl'}{$key}.'?inhibitmenu=yes';  
                     $type{$key} = 'custom';  
                     unless ($key eq 'nolang') {  
                         push(@currlangs,$key);  
                     }  
                 }  
             } elsif ($settings->{'helpurl'} ne '') {  
                 $type{'nolang'} = 'custom';  
                 $url{'nolang'} = $settings->{'helpurl'}.'?inhibitmenu=yes';  
             }              }
         }          }
         foreach my $lang ('nolang',sort(@currlangs)) {          foreach my $item (@bgs) {
             $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';              if ($designhash{$dom.'.login.'.$item} ne '') {
             $datatable .= '<tr'.$css_class.'>';                  $designs{'bgs'}{$item} = $designhash{$dom.'.login.'.$item};
             if ($url{$lang} eq '') {                  $is_custom{$item} = 1;
                 $url{$lang} = $defaulturl;  
             }  
             if ($type{$lang} eq '') {  
                 $type{$lang} = $defaulttype;  
             }  
             $datatable .= '<td colspan="2"><span class="LC_nobreak">';  
             if ($lang eq 'nolang') {  
                 $datatable .= &mt('Log-in help page if no specific language file: [_1]',  
                                   &Apache::loncommon::modal_link($url{$lang},$lt{$type{$lang}},600,500));  
             } else {  
                 $datatable .= &mt('Log-in help page for language: [_1] is [_2]',  
                                   $langchoices{$lang},  
                                   &Apache::loncommon::modal_link($url{$lang},$lt{$type{$lang}},600,500));  
             }  
             $datatable .= '</span></td>'."\n".  
                           '<td class="LC_left_item">';  
             if ($type{$lang} eq 'custom') {  
                 $datatable .= '<span class="LC_nobreak"><label>'.  
                               '<input type="checkbox" name="loginhelpurl_del" value="'.$lang.'" />'.  
                               $lt{'del'}.'</label>&nbsp;'.$lt{'rep'}.'</span>';  
             } else {  
                 $datatable .= $lt{'upl'};  
             }  
             $datatable .='<br />';  
             if ($switchserver) {  
                 $datatable .= &mt('Upload to library server: [_1]',$switchserver);  
             } else {  
                 $datatable .= '<input type="file" name="loginhelpurl_'.$lang.'" />';  
             }              }
             $datatable .= '</td></tr>';  
             $itemcount ++;  
         }          }
         my @addlangs;          foreach my $item (@links) {
         foreach my $lang (sort(keys(%langchoices))) {              if ($designhash{$dom.'.login.'.$item} ne '') {
             next if ((grep(/^\Q$lang\E$/,@currlangs)) || ($lang eq 'x_chef'));                  $designs{'links'}{$item} = $designhash{$dom.'.login.'.$item};
             push(@addlangs,$lang);                  $is_custom{$item} = 1;
         }  
         if (@addlangs > 0) {  
             my %toadd;  
             map { $toadd{$_} = $langchoices{$_} ; } @addlangs;  
             $toadd{''} = &mt('Select');  
             $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';  
             $datatable .= '<tr'.$css_class.'><td class="LC_left_item" colspan="2">'.  
                           &mt('Add log-in help page for a specific language:').'&nbsp;'.  
                           &Apache::loncommon::select_form('','loginhelpurl_add_lang',\%toadd).  
                           '</td><td class="LC_left_item">'.$lt{'upl'}.'<br />';  
             if ($switchserver) {  
                 $datatable .= &mt('Upload to library server: [_1]',$switchserver);  
             } else {  
                 $datatable .= '<input type="file" name="loginhelpurl_add_file" />';  
             }              }
             $datatable .= '</td></tr>';  
             $itemcount ++;  
         }          }
         $datatable .= &captcha_choice('login',$settings,$itemcount);  
     }      }
       my %alt_text = &Apache::lonlocal::texthash  ( img => 'Log-in banner',
                                                     logo => 'Institution Logo',
                                                     domlogo => 'Domain Logo',
                                                     login => 'Login box');
       my $itemcount = 1;
       foreach my $item (@toggles) {
           $css_class = $itemcount%2?' class="LC_odd_row"':'';
           $datatable .=  
               '<tr'.$css_class.'><td colspan="2">'.$choices{$item}.
               '</td><td>'.
               '<span class="LC_nobreak"><label><input type="radio" name="'.
               $item.'"'.$checkedon{$item}.' value="1" />'.&mt('Yes').
               '</label>&nbsp;<label><input type="radio" name="'.$item.'"'.
               $checkedoff{$item}.' value="0" />'.&mt('No').'</label></span></td>'.
               '</tr>';
           $itemcount ++;
       }
       $datatable .= &display_color_options($dom,$confname,$phase,'login',$itemcount,\%choices,\%is_custom,\%defaults,\%designs,\@images,\@bgs,\@links,\%alt_text,$rowtotal,\@logintext);
       $datatable .= '</tr></table></td></tr>';
     return $datatable;      return $datatable;
 }  }
   
Line 1089  sub login_choices { Line 947  sub login_choices {
         &Apache::lonlocal::texthash (          &Apache::lonlocal::texthash (
             coursecatalog => 'Display Course/Community Catalog link?',              coursecatalog => 'Display Course/Community Catalog link?',
             adminmail     => "Display Administrator's E-mail Address?",              adminmail     => "Display Administrator's E-mail Address?",
             helpdesk      => 'Display "Contact Helpdesk" link',  
             disallowlogin => "Login page requests redirected",              disallowlogin => "Login page requests redirected",
             hostid        => "Server",              hostid        => "Server",
             server        => "Redirect to:",              server        => "Redirect to:",
Line 1127  sub print_rolecolors { Line 984  sub print_rolecolors {
     my %designhash = &Apache::loncommon::get_domainconf($dom);      my %designhash = &Apache::loncommon::get_domainconf($dom);
     my %defaultdesign = %Apache::loncommon::defaultdesign;      my %defaultdesign = %Apache::loncommon::defaultdesign;
     my (%is_custom,%designs);      my (%is_custom,%designs);
     my %defaults = &role_defaults($role,\@bgs,\@links,\@images);      my %defaults = (
                      img => $defaultdesign{$role.'.img'},
                      font => $defaultdesign{$role.'.font'},
      fontmenu => $defaultdesign{$role.'.fontmenu'},
                      );
       foreach my $item (@bgs) {
           $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};
       }
       foreach my $item (@links) {
           $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item};
       }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{$role}) eq 'HASH') {          if (ref($settings->{$role}) eq 'HASH') {
             if ($settings->{$role}->{'img'} ne '') {              if ($settings->{$role}->{'img'} ne '') {
Line 1188  sub print_rolecolors { Line 1055  sub print_rolecolors {
     return $datatable;      return $datatable;
 }  }
   
 sub role_defaults {  
     my ($role,$bgs,$links,$images,$logintext) = @_;  
     my %defaults;  
     unless ((ref($bgs) eq 'ARRAY') && (ref($links) eq 'ARRAY') && (ref($images) eq 'ARRAY')) {  
         return %defaults;  
     }  
     my %defaultdesign = %Apache::loncommon::defaultdesign;  
     if ($role eq 'login') {  
         %defaults = (  
                        font => $defaultdesign{$role.'.font'},  
                     );  
         if (ref($logintext) eq 'ARRAY') {  
             foreach my $item (@{$logintext}) {  
                 $defaults{'logintext'}{$item} = $defaultdesign{$role.'.'.$item};  
             }  
         }  
         foreach my $item (@{$images}) {  
             $defaults{'showlogo'}{$item} = 1;  
         }  
     } else {  
         %defaults = (  
                        img => $defaultdesign{$role.'.img'},  
                        font => $defaultdesign{$role.'.font'},  
                        fontmenu => $defaultdesign{$role.'.fontmenu'},  
                     );  
     }  
     foreach my $item (@{$bgs}) {  
         $defaults{'bgs'}{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     foreach my $item (@{$links}) {  
         $defaults{'links'}{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     foreach my $item (@{$images}) {  
         $defaults{$item} = $defaultdesign{$role.'.'.$item};  
     }  
     return %defaults;  
 }  
   
 sub display_color_options {  sub display_color_options {
     my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,      my ($dom,$confname,$phase,$role,$itemcount,$choices,$is_custom,$defaults,$designs,
         $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;          $images,$bgs,$links,$alt_text,$rowtotal,$logintext) = @_;
Line 1238  sub display_color_options { Line 1067  sub display_color_options {
     } else {      } else {
         $datatable .= '<td>&nbsp;</td>';          $datatable .= '<td>&nbsp;</td>';
     }      }
     my $current_color = $designs->{'font'} ? $designs->{'font'} : $defaults->{'font'};      my $fontlink = &color_pick($phase,$role,'font',$choices->{'font'},$designs->{'font'});
   
     $datatable .= '<td><span class="LC_nobreak">'.      $datatable .= '<td><span class="LC_nobreak">'.
                   '<input type="text" class="colorchooser" size="10" name="'.$role.'_font"'.                    '<input type="text" size="10" name="'.$role.'_font"'.
                   ' value="'.$current_color.'" />&nbsp;'.                    ' value="'.$designs->{'font'}.'" />&nbsp;'.$fontlink.
                   '&nbsp;</td></tr>';                    '&nbsp;<span id="css_'.$role.'_font" style="background-color: '.
                     $designs->{'font'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                     '</span></td></tr>';
     unless ($role eq 'login') {       unless ($role eq 'login') { 
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td>'.$choices->{'fontmenu'}.'</td>';                        '<td>'.$choices->{'fontmenu'}.'</td>';
Line 1252  sub display_color_options { Line 1082  sub display_color_options {
         } else {          } else {
             $datatable .= '<td>&nbsp;</td>';              $datatable .= '<td>&nbsp;</td>';
         }          }
  $current_color = $designs->{'fontmenu'} ?          $fontlink = &color_pick($phase,$role,'fontmenu',$choices->{'fontmenu'},$designs->{'fontmenu'});
     $designs->{'fontmenu'} : $defaults->{'fontmenu'};  
         $datatable .= '<td><span class="LC_nobreak">'.          $datatable .= '<td><span class="LC_nobreak">'.
                       '<input class="colorchooser" type="text" size="10" name="'                        '<input type="text" size="10" name="'.$role.'_fontmenu"'.
       .$role.'_fontmenu"'.                        ' value="'.$designs->{'fontmenu'}.'" />&nbsp;'.$fontlink.
                       ' value="'.$current_color.'" />&nbsp;'.                        '&nbsp;<span id="css_'.$role.'_fontmenu" style="background-color: '.
                       '&nbsp;</td></tr>';                        $designs->{'fontmenu'}.';">&nbsp;&nbsp;&nbsp;</span>'.
                         '</span></td></tr>';
     }      }
     my $switchserver = &check_switchserver($dom,$confname);      my $switchserver = &check_switchserver($dom,$confname);
     foreach my $img (@{$images}) {      foreach my $img (@{$images}) {
Line 1273  sub display_color_options { Line 1103  sub display_color_options {
                     &login_header_options($img,$role,$defaults,$is_custom,$choices);                      &login_header_options($img,$role,$defaults,$is_custom,$choices);
                 $logincolors =                  $logincolors =
                     &login_text_colors($img,$role,$logintext,$phase,$choices,                      &login_text_colors($img,$role,$logintext,$phase,$choices,
                                        $designs,$defaults);                                              $designs);
             } elsif ($img ne 'domlogo') {              } elsif ($img ne 'domlogo') {
                 $datatable.= &logo_display_options($img,$defaults,$designs);                  $datatable.= &logo_display_options($img,$defaults,$designs);
             }              }
Line 1352  sub display_color_options { Line 1182  sub display_color_options {
                 $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,                  $datatable .= &image_changes($is_custom->{$img},$alt_text->{$img},$img_import,
                                              $showfile,$fullsize,$role,$img,$imgfile,$logincolors);                                               $showfile,$fullsize,$role,$img,$imgfile,$logincolors);
             } else {              } else {
                 $datatable .= '<td>&nbsp;</td><td class="LC_left_item">'.                  $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
                               &mt('Upload:').'<br />';                                &mt('Upload:');
             }              }
         } else {          } else {
             $datatable .= '<td>&nbsp;</td><td class="LC_left_item">'.              $datatable .= '<td colspan="2" class="LC_right_item"><br />'.
                           &mt('Upload:').'<br />';                            &mt('Upload:');
         }          }
         if ($switchserver) {          if ($switchserver) {
             $datatable .= &mt('Upload to library server: [_1]',$switchserver);              $datatable .= &mt('Upload to library server: [_1]',$switchserver);
Line 1385  sub display_color_options { Line 1215  sub display_color_options {
     }      }
     $datatable .= '<td class="LC_right_item">'.      $datatable .= '<td class="LC_right_item">'.
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
   
     foreach my $item (@{$bgs}) {      foreach my $item (@{$bgs}) {
         $datatable .= '<td align="center">'.$choices->{$item};          my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'bgs'}{$item});
  my $color = $designs->{'bgs'}{$item} ? $designs->{'bgs'}{$item} : $defaults->{'bgs'}{$item};          $datatable .= '<td align="center">'.$link;
         if ($designs->{'bgs'}{$item}) {          if ($designs->{'bgs'}{$item}) {
             $datatable .= '&nbsp;';              $datatable .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'bgs'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
         }          }
         $datatable .= '<br /><input type="text" class="colorchooser" size="8" name="'.$role.'_'.$item.'" value="'.$color.          $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'bgs'}{$item}.
                       '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';                        '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';
     }      }
     $datatable .= '</tr></table></td></tr>';      $datatable .= '</tr></table></td></tr>';
Line 1414  sub display_color_options { Line 1243  sub display_color_options {
     $datatable .= '<td class="LC_right_item">'.      $datatable .= '<td class="LC_right_item">'.
                   '<table border="0"><tr>';                    '<table border="0"><tr>';
     foreach my $item (@{$links}) {      foreach my $item (@{$links}) {
  my $color = $designs->{'link'}{$item} ? $designs->{'link'}{$item} : $defaults->{'links'}{$item};          $datatable .= '<td align="center">'."\n".
         $datatable .= '<td align="center">'.$choices->{$item}."\n";                        &color_pick($phase,$role,$item,$choices->{$item},
                                     $designs->{'links'}{$item});
         if ($designs->{'links'}{$item}) {          if ($designs->{'links'}{$item}) {
             $datatable.='&nbsp;';              $datatable.='&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'links'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
         }          }
         $datatable .= '<br /><input type="text" size="8" class="colorchooser" name="'.$role.'_'.$item.'" value="'.$color.          $datatable .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.$designs->{'links'}{$item}.
                       '" /></td>';                        '" /></td>';
     }      }
     $$rowtotal += $itemcount;      $$rowtotal += $itemcount;
Line 1473  sub login_header_options  { Line 1303  sub login_header_options  {
 }  }
   
 sub login_text_colors {  sub login_text_colors {
     my ($img,$role,$logintext,$phase,$choices,$designs,$defaults) = @_;      my ($img,$role,$logintext,$phase,$choices,$designs) = @_;
     my $color_menu = '<table border="0"><tr>';      my $color_menu = '<table border="0"><tr>';
     foreach my $item (@{$logintext}) {      foreach my $item (@{$logintext}) {
         $color_menu .= '<td align="center">'.$choices->{$item};          my $link = &color_pick($phase,$role,$item,$choices->{$item},$designs->{'logintext'}{$item});
         my $color = $designs->{'logintext'}{$item} ? $designs->{'logintext'}{$item} : $defaults->{'logintext'}{$item};          $color_menu .= '<td align="center">'.$link;
         $color_menu .= '<br /><input type="text" class="colorchooser" size="8" name="'.$role.'_'.$item.'" value="'.$color.          if ($designs->{'logintext'}{$item}) {
                       '" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>';              $color_menu .= '&nbsp;<span id="css_'.$role.'_'.$item.'" style="background-color: '.$designs->{'logintext'}{$item}.';">&nbsp;&nbsp;&nbsp;</span>';
           }
           $color_menu .= '<br /><input type="text" size="8" name="'.$role.'_'.$item.'" value="'.
                          $designs->{'logintext'}{$item}.'" onblur = "javascript:colchg_span('."'css_".$role.'_'.$item."'".',this);" /></td>'.
                          '<td>&nbsp;</td>';
     }      }
     $color_menu .= '</tr></table><br />';      $color_menu .= '</tr></table><br />';
     return $color_menu;      return $color_menu;
Line 1511  sub image_changes { Line 1345  sub image_changes {
                        $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').                         $role.'_del_'.$img.'" value="1" />'.&mt('Delete?').
                        '</label>&nbsp;'.&mt('Replace:').'</span><br />';                         '</label>&nbsp;'.&mt('Replace:').'</span><br />';
         } else {          } else {
             $output .= '<td valign="middle">'.$logincolors.&mt('Upload:').'<br />';              $output .= '<td valign="bottom">'.$logincolors.&mt('Upload:').'<br />';
         }          }
     }      }
     return $output;      return $output;
 }  }
   
   sub color_pick {
       my ($phase,$role,$item,$desc,$curcol) = @_;
       my $link = '<a href="javascript:pjump('."'color_custom','".$desc.
                  "','".$curcol."','".$role.'_'.$item."','parmform.pres','psub'".
                  ');">'.$desc.'</a>';
       return $link;
   }
   
 sub print_quotas {  sub print_quotas {
     my ($dom,$settings,$rowtotal,$action) = @_;      my ($dom,$settings,$rowtotal,$action) = @_;
     my $context;      my $context;
Line 1525  sub print_quotas { Line 1367  sub print_quotas {
     } else {      } else {
         $context = $action;          $context = $action;
     }      }
     my ($datatable,$defaultquota,$authorquota,@usertools,@options,%validations);      my ($datatable,$defaultquota,@usertools,@options,%validations);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     my $typecount = 0;      my $typecount = 0;
     my ($css_class,%titles);      my ($css_class,%titles);
Line 1534  sub print_quotas { Line 1376  sub print_quotas {
         @options =('norequest','approval','validate','autolimit');          @options =('norequest','approval','validate','autolimit');
         %validations = &Apache::lonnet::auto_courserequest_checks($dom);          %validations = &Apache::lonnet::auto_courserequest_checks($dom);
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
     } elsif ($context eq 'requestauthor') {  
         @usertools = ('author');  
         @options = ('norequest','approval','automatic');  
         %titles = &authorrequest_titles();  
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
     }      }
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         foreach my $type (@{$types}) {          foreach my $type (@{$types}) {
             my ($currdefquota,$currauthorquota);              my $currdefquota;
             unless (($context eq 'requestcourses') ||              unless ($context eq 'requestcourses') {
                     ($context eq 'requestauthor')) {  
                 if (ref($settings) eq 'HASH') {                  if (ref($settings) eq 'HASH') {
                     if (ref($settings->{defaultquota}) eq 'HASH') {                      if (ref($settings->{defaultquota}) eq 'HASH') {
                         $currdefquota = $settings->{defaultquota}->{$type};                          $currdefquota = $settings->{defaultquota}->{$type}; 
                     } else {                      } else {
                         $currdefquota = $settings->{$type};                          $currdefquota = $settings->{$type};
                     }                      }
                     if (ref($settings->{authorquota}) eq 'HASH') {  
                         $currauthorquota = $settings->{authorquota}->{$type};  
                     }  
                 }                  }
             }              }
             if (defined($usertypes->{$type})) {              if (defined($usertypes->{$type})) {
Line 1619  sub print_quotas { Line 1453  sub print_quotas {
                                 $cell{$item} .= $titles{'unlimited'};                                  $cell{$item} .= $titles{'unlimited'};
                             }                              }
                         }                          }
                     } elsif ($context eq 'requestauthor') {  
                         my $curroption;  
                         if (ref($settings) eq 'HASH') {  
                             $curroption = $settings->{$type};  
                         }  
                         if (!$curroption) {  
                             $curroption = 'norequest';  
                         }  
                         foreach my $option (@options) {  
                             my $val = $option;  
                             if ($option eq 'norequest') {  
                                 $val = 0;  
                             }  
                             my $checked = '';  
                             if ($option eq $curroption) {  
                                 $checked = ' checked="checked"';  
                             }  
                             $datatable .= '<span class="LC_nobreak"><label>'.  
                                   '<input type="radio" name="authorreq_'.$type.  
                                   '" value="'.$val.'"'.$checked.' />'.  
                                   $titles{$option}.'</label></span>&nbsp; ';  
                         }  
                     } else {                      } else {
                         my $checked = 'checked="checked" ';                          my $checked = 'checked="checked" ';
                         if (ref($settings) eq 'HASH') {                          if (ref($settings) eq 'HASH') {
Line 1666  sub print_quotas { Line 1478  sub print_quotas {
                     $datatable .= '</tr></table>';                      $datatable .= '</tr></table>';
                 }                  }
                 $datatable .= '</td>';                  $datatable .= '</td>';
                 unless (($context eq 'requestcourses') ||                  unless ($context eq 'requestcourses') {
                         ($context eq 'requestauthor')) {  
                     $datatable .=                       $datatable .= 
                               '<td class="LC_right_item">'.                                '<td class="LC_right_item"><span class="LC_nobreak">'.
                               '<span class="LC_nobreak">'.&mt('Portfolio').':&nbsp;'.  
                               '<input type="text" name="quota_'.$type.                                '<input type="text" name="quota_'.$type.
                               '" value="'.$currdefquota.                                '" value="'.$currdefquota.
                               '" size="5" /></span>'.('&nbsp;' x 2).                                '" size="5" /> Mb</span></td>';
                               '<span class="LC_nobreak">'.&mt('Authoring').':&nbsp;'.  
                               '<input type="text" name="authorquota_'.$type.  
                               '" value="'.$currauthorquota.  
                               '" size="5" /></span></td>';  
                 }                  }
                 $datatable .= '</tr>';                  $datatable .= '</tr>';
             }              }
         }          }
     }      }
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless ($context eq 'requestcourses') {
         $defaultquota = '20';          $defaultquota = '20';
         $authorquota = '500';  
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             if (ref($settings->{'defaultquota'}) eq 'HASH') {              if (ref($settings->{'defaultquota'}) eq 'HASH') {
                 $defaultquota = $settings->{'defaultquota'}->{'default'};                  $defaultquota = $settings->{'defaultquota'}->{'default'};
             } elsif (defined($settings->{'default'})) {              } elsif (defined($settings->{'default'})) {
                 $defaultquota = $settings->{'default'};                  $defaultquota = $settings->{'default'};
             }              }
             if (ref($settings->{'authorquota'}) eq 'HASH') {  
                 $authorquota = $settings->{'authorquota'}->{'default'};  
             }  
         }          }
     }      }
     $typecount ++;      $typecount ++;
Line 1757  sub print_quotas { Line 1559  sub print_quotas {
                     $defcell{$item} .= $titles{'unlimited'};                      $defcell{$item} .= $titles{'unlimited'};
                 }                  }
             }              }
         } elsif ($context eq 'requestauthor') {  
             my $curroption;  
             if (ref($settings) eq 'HASH') {  
                 $curroption = $settings->{'default'};  
             }  
             if (!$curroption) {  
                 $curroption = 'norequest';  
             }  
             foreach my $option (@options) {  
                 my $val = $option;  
                 if ($option eq 'norequest') {  
                     $val = 0;  
                 }  
                 my $checked = '';  
                 if ($option eq $curroption) {  
                     $checked = ' checked="checked"';  
                 }  
                 $datatable .= '<span class="LC_nobreak"><label>'.  
                               '<input type="radio" name="authorreq_default"'.  
                               ' value="'.$val.'"'.$checked.' />'.  
                               $titles{$option}.'</label></span>&nbsp; ';  
             }  
         } else {          } else {
             my $checked = 'checked="checked" ';              my $checked = 'checked="checked" ';
             if (ref($settings) eq 'HASH') {              if (ref($settings) eq 'HASH') {
Line 1804  sub print_quotas { Line 1584  sub print_quotas {
         $datatable .= '</tr></table>';          $datatable .= '</tr></table>';
     }      }
     $datatable .= '</td>';      $datatable .= '</td>';
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless ($context eq 'requestcourses') {
         $datatable .= '<td class="LC_right_item">'.          $datatable .= '<td class="LC_right_item"><span class="LC_nobreak">'.
                       '<span class="LC_nobreak">'.&mt('Portfolio').':&nbsp;'.  
                       '<input type="text" name="defaultquota" value="'.                        '<input type="text" name="defaultquota" value="'.
                       $defaultquota.'" size="5" /></span>'.('&nbsp;' x2).                        $defaultquota.'" size="5" /> Mb</span></td>';
                       '<span class="LC_nobreak">'.&mt('Authoring').':&nbsp;'.  
                       '<input type="text" name="authorquota" value="'.  
                       $authorquota.'" size="5" /></span></td>';  
     }      }
     $datatable .= '</tr>';      $datatable .= '</tr>';
     $typecount ++;      $typecount ++;
     $css_class = $typecount%2?' class="LC_odd_row"':'';      $css_class = $typecount%2?' class="LC_odd_row"':'';
     $datatable .= '<tr'.$css_class.'>'.      $datatable .= '<tr'.$css_class.'>'.
                   '<td>'.&mt('LON-CAPA Advanced Users').'<br />';                    '<td>'.&mt('LON-CAPA Advanced Users').' ';
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
         $datatable .= &mt('(overrides affiliation, if set)').          $datatable .= &mt('(overrides affiliation, if set)').
                       '</td>'.                        '</td>'.
Line 1886  sub print_quotas { Line 1662  sub print_quotas {
                     $advcell{$item} .= $titles{'unlimited'};                      $advcell{$item} .= $titles{'unlimited'};
                 }                  }
             }              }
         } elsif ($context eq 'requestauthor') {  
             my $curroption;  
             if (ref($settings) eq 'HASH') {  
                 $curroption = $settings->{'_LC_adv'};  
             }  
             my $checked = '';  
             if ($curroption eq '') {  
                 $checked = ' checked="checked"';  
             }  
             $datatable .= '<span class="LC_nobreak"><label>'.  
                           '<input type="radio" name="authorreq__LC_adv"'.  
                           ' value=""'.$checked.' />'.  
                           &mt('No override set').'</label></span>&nbsp; ';  
             foreach my $option (@options) {  
                 my $val = $option;  
                 if ($option eq 'norequest') {  
                     $val = 0;  
                 }  
                 my $checked = '';  
                 if ($val eq $curroption) {  
                     $checked = ' checked="checked"';  
                 }  
                 $datatable .= '<span class="LC_nobreak"><label>'.  
                               '<input type="radio" name="authorreq__LC_adv"'.  
                               ' value="'.$val.'"'.$checked.' />'.  
                               $titles{$option}.'</label></span>&nbsp; ';  
             }  
         } else {          } else {
             my $checked = 'checked="checked" ';              my $checked = 'checked="checked" ';
             if (ref($settings) eq 'HASH') {              if (ref($settings) eq 'HASH') {
Line 1942  sub print_quotas { Line 1691  sub print_quotas {
     return $datatable;      return $datatable;
 }  }
   
 sub print_requestmail {  sub print_courserequestmail {
     my ($dom,$action,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my ($now,$datatable,%currapp);      my ($now,$datatable,%dompersonnel,@domcoord,@currapproval,$rows);
     $now = time;      $now = time;
       $rows = 0;
       %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);
       foreach my $server (keys(%dompersonnel)) {
           foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
               my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
               if (!grep(/^$uname:$udom$/,@domcoord)) {
                   push(@domcoord,$uname.':'.$udom);
               }
           }
       }
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         if (ref($settings->{'notify'}) eq 'HASH') {          if (ref($settings->{'notify'}) eq 'HASH') {
             if ($settings->{'notify'}{'approval'} ne '') {              if ($settings->{'notify'}{'approval'} ne '') {
                map {$currapp{$_}=1;} split(/,/,$settings->{'notify'}{'approval'});                 @currapproval = split(',',$settings->{'notify'}{'approval'});
             }              }
         }          }
     }      }
     my $numinrow = 2;      if (@currapproval) {
     my $css_class = 'class="LC_odd_row"';          foreach my $dc (@currapproval) {
     my $text;              unless (grep(/^\Q$dc\E$/,@domcoord)) {
     if ($action eq 'requestcourses') {                  push(@domcoord,$dc);
         $text = &mt('Receive notification of course requests requiring approval');              }
     } else {          }
         $text = &mt('Receive notification of authoring space requests requiring approval')  
     }      }
     $datatable = '<tr '.$css_class.'>'.      @domcoord = sort(@domcoord);
                  ' <td>'.$text.'</td>'.      my $numinrow = 4;
       my $numdc = @domcoord;
       my $css_class = 'class="LC_odd_row"';
       $datatable = '<tr'.$css_class.'>'.
                    ' <td>'.&mt('Receive notification of course requests requiring approval.').
                    ' </td>'.
                  ' <td class="LC_left_item">';                   ' <td class="LC_left_item">';
     my ($numdc,$table,$rows) = &active_dc_picker($dom,$numinrow,'checkbox',      if (@domcoord > 0) {
                                                  'reqapprovalnotify',%currapp);          $datatable .= '<table>';
     if ($numdc > 0) {          for (my $i=0; $i<$numdc; $i++) {
         $datatable .= $table;              my $rem = $i%($numinrow);
               if ($rem == 0) {
                   if ($i > 0) {
                       $datatable .= '</tr>';
                   }
                   $datatable .= '<tr>';
                   $rows ++;
               }
               my $check = ' ';
               if (grep(/^\Q$domcoord[$i]\E$/,@currapproval)) {
                   $check = ' checked="checked" ';
               }
               my ($uname,$udom) = split(':',$domcoord[$i]);
               my $fullname = &Apache::loncommon::plainname($uname,$udom);
               if ($i == $numdc-1) {
                   my $colsleft = $numinrow-$rem;
                   if ($colsleft > 1) {
                       $datatable .= '<td colspan="'.$colsleft.'" class="LC_left_item">';
                   } else {
                       $datatable .= '<td class="LC_left_item">';
                   }
               } else {
                   $datatable .= '<td class="LC_left_item">';
               }
               $datatable .= '<span class="LC_nobreak"><label>'.
                             '<input type="checkbox" name="reqapprovalnotify" '.
                             'value="'.$domcoord[$i].'"'.$check.'/>'.
                             $fullname.'</label></span></td>';
           }
           $datatable .= '</tr></table>';
     } else {      } else {
         $datatable .= &mt('There are no active Domain Coordinators');          $datatable .= &mt('There are no active Domain Coordinators');
           $rows ++;
     }      }
     $datatable .='</td></tr>';      $datatable .='</td></tr>';
     $$rowtotal += $rows;      $$rowtotal += $rows;
Line 2124  sub print_autoupdate { Line 1917  sub print_autoupdate {
   
 sub print_autocreate {  sub print_autocreate {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$settings,$rowtotal) = @_;
     my (%createon,%createoff,%currhash);      my (%createon,%createoff);
       my $curr_dc;
     my @types = ('xml','req');      my @types = ('xml','req');
     if (ref($settings) eq 'HASH') {      if (ref($settings) eq 'HASH') {
         foreach my $item (@types) {          foreach my $item (@types) {
Line 2137  sub print_autocreate { Line 1931  sub print_autocreate {
                 }                  }
             }              }
         }          }
         if ($settings->{'xmldc'} ne '') {          $curr_dc = $settings->{'xmldc'};
             $currhash{$settings->{'xmldc'}} = 1;  
         }  
     } else {      } else {
         foreach my $item (@types) {          foreach my $item (@types) {
             $createoff{$item} = ' checked="checked" ';              $createoff{$item} = ' checked="checked" ';
Line 2147  sub print_autocreate { Line 1939  sub print_autocreate {
         }          }
     }      }
     $$rowtotal += 2;      $$rowtotal += 2;
     my $numinrow = 2;  
     my $datatable='<tr class="LC_odd_row">'.      my $datatable='<tr class="LC_odd_row">'.
                   '<td>'.&mt('Create pending official courses from XML files').'</td>'.                    '<td>'.&mt('Create pending official courses from XML files').'</td>'.
                   '<td class="LC_right_item"><span class="LC_nobreak"><label>'.                    '<td class="LC_right_item"><span class="LC_nobreak"><label>'.
Line 2162  sub print_autocreate { Line 1953  sub print_autocreate {
                   $createon{'req'}.' value="1" />'.&mt('Yes').'</label>&nbsp;'.                    $createon{'req'}.' value="1" />'.&mt('Yes').'</label>&nbsp;'.
                   '<label><input type="radio" name="autocreate_req"'.                    '<label><input type="radio" name="autocreate_req"'.
                   $createoff{'req'}.' value="0" />'.&mt('No').'</label></span>';                    $createoff{'req'}.' value="0" />'.&mt('No').'</label></span>';
     my ($numdc,$dctable,$rows) = &active_dc_picker($dom,$numinrow,'radio',      my ($numdc,$dctable) = &active_dc_picker($dom,$curr_dc);
                                                    'autocreate_xmldc',%currhash);  
     if ($numdc > 1) {      if ($numdc > 1) {
         $datatable .= '</td></tr><tr class="LC_odd_row"><td>'.          $datatable .= '</td></tr><tr class="LC_odd_row"><td>'.
                       &mt('Course creation processed as: (choose Dom. Coord.)').                        &mt('Course creation processed as: (choose Dom. Coord.)').
                       '</td><td class="LC_left_item">'.$dctable.'</td></tr>';                        '</td><td class="LC_left_item">'.$dctable.'</td></tr>';
           $$rowtotal ++ ;
     } else {      } else {
         $datatable .= $dctable.'</td></tr>';          $datatable .= $dctable.'</td></tr>';
     }      }
     $$rowtotal += $rows;  
     return $datatable;      return $datatable;
 }  }
   
Line 2294  sub print_contacts { Line 2084  sub print_contacts {
     my @contacts = ('adminemail','supportemail');      my @contacts = ('adminemail','supportemail');
     my (%checked,%to,%otheremails,%bccemails);      my (%checked,%to,%otheremails,%bccemails);
     my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',      my @mailings = ('errormail','packagesmail','lonstatusmail','helpdeskmail',
                     'requestsmail','updatesmail','idconflictsmail');                      'requestsmail');
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         $otheremails{$type} = '';          $otheremails{$type} = '';
     }      }
Line 2330  sub print_contacts { Line 2120  sub print_contacts {
         $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';          $checked{'helpdeskmail'}{'supportemail'} = ' checked="checked" ';
         $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" ';           $checked{'lonstatusmail'}{'adminemail'} = ' checked="checked" '; 
         $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';          $checked{'requestsmail'}{'adminemail'} = ' checked="checked" ';
         $checked{'updatesmail'}{'adminemail'} = ' checked="checked" ';  
         $checked{'idconflictsmail'}{'adminemail'} = ' checked="checked" ';  
     }      }
     my ($titles,$short_titles) = &contact_titles();      my ($titles,$short_titles) = &contact_titles();
     my $rownum = 0;      my $rownum = 0;
     my $css_class;      my $css_class;
     foreach my $item (@contacts) {      foreach my $item (@contacts) {
           $rownum ++;
         $css_class = $rownum%2?' class="LC_odd_row"':'';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.           $datatable .= '<tr'.$css_class.'>'. 
                   '<td><span class="LC_nobreak">'.$titles->{$item}.                    '<td><span class="LC_nobreak">'.$titles->{$item}.
                   '</span></td><td class="LC_right_item">'.                    '</span></td><td class="LC_right_item">'.
                   '<input type="text" name="'.$item.'" value="'.                    '<input type="text" name="'.$item.'" value="'.
                   $to{$item}.'" /></td></tr>';                    $to{$item}.'" /></td></tr>';
         $rownum ++;  
     }      }
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
           $rownum ++;
         $css_class = $rownum%2?' class="LC_odd_row"':'';          $css_class = $rownum%2?' class="LC_odd_row"':'';
         $datatable .= '<tr'.$css_class.'>'.          $datatable .= '<tr'.$css_class.'>'.
                       '<td><span class="LC_nobreak">'.                        '<td><span class="LC_nobreak">'.
Line 2368  sub print_contacts { Line 2157  sub print_contacts {
                           'value="'.$bccemails{$type}.'"  />';                            'value="'.$bccemails{$type}.'"  />';
         }          }
         $datatable .= '</td></tr>'."\n";          $datatable .= '</td></tr>'."\n";
         $rownum ++;  
     }      }
     my %choices;  
     $choices{'reporterrors'} = &mt('E-mail error reports to [_1]',  
                                    &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                    &mt('LON-CAPA core group - MSU'),600,500));  
     $choices{'reportupdates'} = &mt('E-mail record of completed LON-CAPA updates to [_1]',  
                                     &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                     &mt('LON-CAPA core group - MSU'),600,500));  
     my @toggles = ('reporterrors','reportupdates');  
     my %defaultchecked = ('reporterrors'  => 'on',  
                           'reportupdates' => 'on');  
     (my $reports,$rownum) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,  
                                                \%choices,$rownum);  
     $datatable .= $reports;  
     $$rowtotal += $rownum;      $$rowtotal += $rownum;
     return $datatable;      return $datatable;
 }  }
   
 sub print_helpsettings {  sub print_helpsettings {
     my ($dom,$confname,$settings,$rowtotal) = @_;  
     my ($datatable,$itemcount);  
     $itemcount = 1;  
     my (%choices,%defaultchecked,@toggles);  
     $choices{'submitbugs'} = &mt('Display link to: [_1]?',  
                                  &Apache::loncommon::modal_link('http://bugs.loncapa.org',  
                                  &mt('LON-CAPA bug tracker'),600,500));  
     %defaultchecked = ('submitbugs' => 'on');  
     @toggles = ('submitbugs',);  
   
     ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,   my ($position,$dom,$confname,$settings,$rowtotal) = @_;
                                                  \%choices,$itemcount);   my ($css_class,$datatable);
     return $datatable;  
    my $switchserver = &check_switchserver($dom,$confname);
   
    my $itemcount = 1;
   
    if ($position eq 'top') {
   
    my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles);
   
    %choices =
    &Apache::lonlocal::texthash (
    submitbugs => 'Display &quot;Submit a bug&quot; link?',
    );
   
    %defaultchecked = ('submitbugs' => 'on');
   
    @toggles = ('submitbugs',);
   
    foreach my $item (@toggles) {
    if ($defaultchecked{$item} eq 'on') { 
    $checkedon{$item} = ' checked="checked" ';
    $checkedoff{$item} = ' ';
    } elsif ($defaultchecked{$item} eq 'off') {
    $checkedoff{$item} = ' checked="checked" ';
    $checkedon{$item} = ' ';
    }
    }
   
    if (ref($settings) eq 'HASH') {
    foreach my $item (@toggles) {
    if ($settings->{$item} eq '1') {
    $checkedon{$item} =  ' checked="checked" ';
    $checkedoff{$item} = ' ';
    } elsif ($settings->{$item} eq '0') {
    $checkedoff{$item} =  ' checked="checked" ';
    $checkedon{$item} = ' ';
    }
    }
    }
   
    foreach my $item (@toggles) {
    $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
    $datatable .=  
    '<tr'.$css_class.'>
    <td><span class="LC_nobreak">'.$choices{$item}.'</span></td>
    <td><span class="LC_nobreak">&nbsp;</span></td>
    <td class="LC_right_item"><span class="LC_nobreak">
    <label><input type="radio" name="'.$item.'" '.$checkedon{$item}.' value="1" />'.&mt('Yes').'</label>&nbsp;
    <label><input type="radio" name="'.$item.'" '.$checkedoff{$item}.' value="0" />'.&mt('No').'</label>'.
    '</span></td>'.
    '</tr>';
    $itemcount ++;
    }
        
        } else {
        
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
        
         $datatable .= '<tr'.$css_class.'>';
        
         if (ref($settings) eq 'HASH') {
    if ($settings->{'loginhelpurl'} ne '') {
    my($directory, $filename) = $settings->{'loginhelpurl'} =~ m/(.*\/)(.*)$/;
    $datatable .= '<td width="33%"><span class="LC_left_item"><label><a href="'.$settings->{'loginhelpurl'}.'" target="_blank">'.&mt('Custom Login Page Help File In Use').'</a></label></span></td>';
    $datatable .= '<td width="33%"><span class="LC_right_item"><label><input type="checkbox" name="loginhelpurl_del" value="1" />'.&mt('Delete?').'</label></span></td>'
    } else {
    $datatable .= '<td width="33%"><span class="LC_left_item"><label>'.&mt('Default Login Page Help File In Use').'</label></span></td>';
    $datatable .= '<td width="33%"><span class="LC_right_item">&nbsp;</span></td>';
    }
    } else {
    $datatable .= '<td><span class="LC_left_item">&nbsp;</span></td>';
    $datatable .= '<td><span class="LC_right_item">&nbsp;</span></td>';
    }
      
         $datatable .= '<td width="33%"><span class="LC_right_item">';
         if ($switchserver) {
               $datatable .= &mt('Upload to library server: [_1]',$switchserver);
           } else {
           $datatable .= &mt('Upload Custom Login Page Help File:');
               $datatable .='<input type="file" name="loginhelpurl" />';
           }
           $datatable .= '</span></td></tr>';
           
        }
        
        return $datatable;
   
 }  }
   
   
 sub radiobutton_prefs {  sub radiobutton_prefs {
     my ($settings,$toggles,$defaultchecked,$choices,$itemcount,$onclick,      my ($settings,$toggles,$defaultchecked,$choices,$itemcount) = @_;
         $additional) = @_;  
     return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&      return unless ((ref($toggles) eq 'ARRAY') && (ref($defaultchecked) eq 'HASH') &&
                    (ref($choices) eq 'HASH'));                     (ref($choices) eq 'HASH'));
   
Line 2431  sub radiobutton_prefs { Line 2283  sub radiobutton_prefs {
             }              }
         }          }
     }      }
     if ($onclick) {  
         $onclick = ' onclick="'.$onclick.'"';  
     }  
     foreach my $item (@{$toggles}) {      foreach my $item (@{$toggles}) {
         $css_class = $itemcount%2?' class="LC_odd_row"':'';          $css_class = $itemcount%2?' class="LC_odd_row"':'';
         $datatable .=          $datatable .=
             '<tr'.$css_class.'><td valign="top">'.              '<tr'.$css_class.'><td><span class="LC_nobreak">'.$choices->{$item}.
             '<span class="LC_nobreak">'.$choices->{$item}.  
             '</span></td>'.              '</span></td>'.
             '<td class="LC_right_item"><span class="LC_nobreak">'.              '<td class="LC_right_item"><span class="LC_nobreak">'.
             '<label><input type="radio" name="'.              '<label><input type="radio" name="'.
             $item.'" '.$checkedon{$item}.' value="1"'.$onclick.' />'.&mt('Yes').              $item.'" '.$checkedon{$item}.' value="1" />'.&mt('Yes').
             '</label>&nbsp;<label><input type="radio" name="'.$item.'" '.              '</label>&nbsp;<label><input type="radio" name="'.$item.'" '.
             $checkedoff{$item}.' value="0"'.$onclick.' />'.&mt('No').'</label>'.              $checkedoff{$item}.' value="0" />'.&mt('No').'</label>'.
             '</span>'.$additional.              '</span></td>'.
             '</td>'.  
             '</tr>';              '</tr>';
         $itemcount ++;          $itemcount ++;
     }      }
Line 2455  sub radiobutton_prefs { Line 2302  sub radiobutton_prefs {
   
 sub print_coursedefaults {  sub print_coursedefaults {
     my ($position,$dom,$settings,$rowtotal) = @_;      my ($position,$dom,$settings,$rowtotal) = @_;
     my ($css_class,$datatable,%checkedon,%checkedoff,%defaultchecked,@toggles);      my ($css_class,$datatable);
     my $itemcount = 1;      my $itemcount = 1;
     my %choices =  &Apache::lonlocal::texthash (  
         canuse_pdfforms      => 'Course/Community users can create/upload PDF forms',  
         uploadquota          => 'Default quota for files uploaded directly to course/community using Course Editor (MB)',  
         anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',  
         coursecredits        => 'Credits can be specified for courses',  
     );  
     my %staticdefaults = (  
                            anonsurvey_threshold => 10,  
                            uploadquota          => 500,  
                          );  
     if ($position eq 'top') {      if ($position eq 'top') {
           my (%checkedon,%checkedoff,%choices,%defaultchecked,@toggles);
           %choices =
               &Apache::lonlocal::texthash (
                   canuse_pdfforms => 'Course/Community users can create/upload PDF forms',
           );
         %defaultchecked = ('canuse_pdfforms' => 'off');          %defaultchecked = ('canuse_pdfforms' => 'off');
         @toggles = ('canuse_pdfforms');          @toggles = ('canuse_pdfforms',);
         ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,          ($datatable,$itemcount) = &radiobutton_prefs($settings,\@toggles,\%defaultchecked,
                                                  \%choices,$itemcount);                                                   \%choices,$itemcount);
           $$rowtotal += $itemcount;
     } else {      } else {
         $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';          $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
         my ($currdefresponder,$def_official_credits,$def_unofficial_credits,%curruploadquota);          my %choices =
         my $currusecredits = 0;              &Apache::lonlocal::texthash (
         my @types = ('official','unofficial','community');                  anonsurvey_threshold => 'Responder count needed before showing submissions for anonymous surveys',
           );
           my $currdefresponder;
         if (ref($settings) eq 'HASH') {          if (ref($settings) eq 'HASH') {
             $currdefresponder = $settings->{'anonsurvey_threshold'};              $currdefresponder = $settings->{'anonsurvey_threshold'};
             if (ref($settings->{'uploadquota'}) eq 'HASH') {  
                 foreach my $type (keys(%{$settings->{'uploadquota'}})) {  
                     $curruploadquota{$type} = $settings->{'uploadquota'}{$type};  
                 }  
             }  
             if (ref($settings->{'coursecredits'}) eq 'HASH') {  
                 $def_official_credits = $settings->{'coursecredits'}->{'official'};  
                 $def_unofficial_credits = $settings->{'coursecredits'}->{'unofficial'};  
                 if (($def_official_credits ne '') || ($def_unofficial_credits ne '')) {  
                     $currusecredits = 1;  
                 }  
             }  
         }          }
         if (!$currdefresponder) {          if (!$currdefresponder) {
             $currdefresponder = $staticdefaults{'anonsurvey_threshold'};              $currdefresponder = 10;
         } elsif ($currdefresponder < 1) {          } elsif ($currdefresponder < 1) {
             $currdefresponder = 1;              $currdefresponder = 1;
         }          }
         foreach my $type (@types) {  
             if ($curruploadquota{$type} eq '') {  
                 $curruploadquota{$type} = $staticdefaults{'uploadquota'};  
             }  
         }  
         $datatable .=          $datatable .=
                 '<tr'.$css_class.'><td><span class="LC_nobreak">'.                 '<tr'.$css_class.'><td><span class="LC_nobreak">'.$choices{'anonsurvey_threshold'}.
                 $choices{'anonsurvey_threshold'}.  
                 '</span></td>'.                  '</span></td>'.
                 '<td class="LC_right_item"><span class="LC_nobreak">'.                  '<td class="LC_right_item"><span class="LC_nobreak">'.
                 '<input type="text" name="anonsurvey_threshold"'.                  '<input type="text" name="anonsurvey_threshold"'.
                 ' value="'.$currdefresponder.'" size="5" /></span>'.                  ' value="'.$currdefresponder.'" size="5" /></span>'.
                 '</td></tr>'."\n".                  '</td></tr>';
                 '<tr><td><span class="LC_nobreak">'.  
                 $choices{'uploadquota'}.  
                 '</span></td>'.  
                 '<td align="right" class="LC_right_item">'.  
                 '<table><tr>';  
         foreach my $type (@types) {  
             $datatable .= '<td align="center">'.&mt($type).'<br />'.  
                            '<input type="text" name="uploadquota_'.$type.'"'.  
                            ' value="'.$curruploadquota{$type}.'" size="5" /></td>';  
         }  
         $datatable .= '</tr></table></td></tr>'."\n";  
         $itemcount += 2;  
         my $onclick = 'toggleCredits(this.form);';  
         my $display = 'none';  
         if ($currusecredits) {  
             $display = 'block';  
         }  
         my $additional = '<div id="credits" style="display: '.$display.'">'.  
                          '<span class="LC_nobreak">'.  
                          &mt('Default credits for official courses [_1]',  
                          '<input type="text" name="official_credits" value="'.  
                          $def_official_credits.'" size="3" />').  
                          '</span><br />'.  
                          '<span class="LC_nobreak">'.  
                          &mt('Default credits for unofficial courses [_1]',  
                          '<input type="text" name="unofficial_credits" value="'.  
                          $def_unofficial_credits.'" size="3" />').  
                          '</span></div>'."\n";  
         %defaultchecked = ('coursecredits' => 'off');  
         @toggles = ('coursecredits');  
         my $current = {  
                         'coursecredits' => $currusecredits,  
                       };  
         (my $table,$itemcount) =  
             &radiobutton_prefs($current,\@toggles,\%defaultchecked,  
                                \%choices,$itemcount,$onclick,$additional);  
         $datatable .= $table;  
     }      }
     $$rowtotal += $itemcount;  
     return $datatable;      return $datatable;
 }  }
   
Line 2839  sub spares_row { Line 2628  sub spares_row {
             $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';              $css_class = $itemcount%2 ? ' class="LC_odd_row"' : '';
             $datatable .= '<tr'.$css_class.'>              $datatable .= '<tr'.$css_class.'>
                            <td rowspan="2">                             <td rowspan="2">
                             <span class="LC_nobreak">'.                              <span class="LC_nobreak"><b>'.$server.'</b> when busy, offloads to:</span></td>'."\n";
                           &mt('[_1] when busy, offloads to:'  
                               ,'<b>'.$server.'</b>').  
                           "\n";  
             my (%current,%canselect);              my (%current,%canselect);
             my @choices =               my @choices = 
                 &possible_newspares($server,$spareid->{$server},$serverhomes,$altids);                  &possible_newspares($server,$spareid->{$server},$serverhomes,$altids);
Line 2966  sub print_loadbalancing { Line 2752  sub print_loadbalancing {
     my $numinrow = 1;      my $numinrow = 1;
     my $datatable;      my $datatable;
     my %servers = &Apache::lonnet::internet_dom_servers($dom);      my %servers = &Apache::lonnet::internet_dom_servers($dom);
     my (%currbalancer,%currtargets,%currrules,%existing);      my ($currbalancer,$currtargets,$currrules);
     if (ref($settings) eq 'HASH') {      if (keys(%servers) > 1) {
         %existing = %{$settings};          if (ref($settings) eq 'HASH') {
     }              $currbalancer = $settings->{'lonhost'};
     if ((keys(%servers) > 1) || (keys(%existing) > 0)) {              $currtargets = $settings->{'targets'};
         &get_loadbalancers_config(\%servers,\%existing,\%currbalancer,              $currrules = $settings->{'rules'};
                                   \%currtargets,\%currrules);          } else {
               ($currbalancer,$currtargets) = 
                   &Apache::lonnet::get_lonbalancer_config(\%servers);
           }
     } else {      } else {
         return;          return;
     }      }
     my ($othertitle,$usertypes,$types) =      my ($othertitle,$usertypes,$types) =
         &Apache::loncommon::sorted_inst_types($dom);          &Apache::loncommon::sorted_inst_types($dom);
     my $rownum = 8;      my $rownum = 6;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         $rownum += scalar(@{$types});          $rownum += scalar(@{$types});
     }      }
     my @css_class = ('LC_odd_row','LC_even_row');      my $css_class = ' class="LC_odd_row"';
     my $balnum = 0;      my $targets_div_style = 'display: none';
     my $islast;      my $disabled_div_style = 'display: block';
     my (@toshow,$disabledtext);      my $homedom_div_style = 'display: none';
     if (keys(%currbalancer) > 0) {      $datatable = '<tr'.$css_class.'>'.
         @toshow = sort(keys(%currbalancer));                   '<td rowspan="'.$rownum.'" valign="top">'.
         if (scalar(@toshow) < scalar(keys(%servers)) + 1) {                   '<p><select name="loadbalancing_lonhost" onchange="toggleTargets();">'."\n".
             push(@toshow,'');                   '<option value=""';
         }      if (($currbalancer eq '') || (!grep(/^\Q$currbalancer\E$/,keys(%servers)))) {
     } else {          $datatable .= ' selected="selected"';
         @toshow = ('');      } else {
         $disabledtext = &mt('No existing load balancer');          $targets_div_style = 'display: block';
     }          $disabled_div_style = 'display: none';
     foreach my $lonhost (@toshow) {          if ($dom eq &Apache::lonnet::host_domain($currbalancer)) {
         if ($balnum == scalar(@toshow)-1) {              $homedom_div_style = 'display: block'; 
             $islast = 1;          }
         } else {      }
             $islast = 0;      $datatable .= '>'.&mt('None').'</option>'."\n";
         }      foreach my $lonhost (sort(keys(%servers))) {
         my $cssidx = $balnum%2;          my $selected;
         my $targets_div_style = 'display: none';          if ($lonhost eq $currbalancer) {
         my $disabled_div_style = 'display: block';              $selected .= ' selected="selected"';
         my $homedom_div_style = 'display: none';          }
         $datatable .= '<tr class="'.$css_class[$cssidx].'">'.          $datatable .= '<option value="'.$lonhost.'"'.$selected.'>'.$lonhost.'</option>'."\n";
                       '<td rowspan="'.$rownum.'" valign="top">'.      }
                       '<p>';      $datatable .= '</select></p></td><td rowspan="'.$rownum.'" valign="top">'.
         if ($lonhost eq '') {                    '<div id="loadbalancing_disabled" style="'.$disabled_div_style.'">'.&mt('No dedicated Load Balancer').'</div>'."\n".
             $datatable .= '<span class="LC_nobreak">';                    '<div id="loadbalancing_targets" style="'.$targets_div_style.'">'.&mt('Offloads to:').'<br />';
             if (keys(%currbalancer) > 0) {      my ($numspares,@spares) = &count_servers($currbalancer,%servers);
                 $datatable .= &mt('Add balancer:');      my @sparestypes = ('primary','default');
             } else {      my %typetitles = &sparestype_titles();
                 $datatable .= &mt('Enable balancer:');      foreach my $sparetype (@sparestypes) {
             }          my $targettable;
             $datatable .= '&nbsp;'.          for (my $i=0; $i<$numspares; $i++) {
                           '<select name="loadbalancing_lonhost_'.$balnum.'"'.              my $checked;
                           ' id="loadbalancing_lonhost_'.$balnum.'"'.              if (ref($currtargets) eq 'HASH') {
                           ' onchange="toggleTargets('."'$balnum'".');">'."\n".                  if (ref($currtargets->{$sparetype}) eq 'ARRAY') {
                           '<option value="" selected="selected">'.&mt('None').                      if (grep(/^\Q$spares[$i]\E$/,@{$currtargets->{$sparetype}})) {
                           '</option>'."\n";                          $checked = ' checked="checked"';
             foreach my $server (sort(keys(%servers))) {  
                 next if ($currbalancer{$server});  
                 $datatable .= '<option value="'.$server.'">'.$server.'</option>'."\n";  
             }  
             $datatable .=  
                 '</select>'."\n".  
                 '<input type="hidden" name="loadbalancing_prevlonhost_'.$balnum.'" id="loadbalancing_prevlonhost_'.$balnum.'" value="" />&nbsp;</span>'."\n";  
         } else {  
             $datatable .= '<i>'.$lonhost.'</i><br /><span class="LC_nobreak">'.  
                           '<label><input type="checkbox" name="loadbalancing_delete" value="'.$balnum.'" id="loadbalancing_delete_'.$balnum.'" onclick="javascript:balancerDeleteChange('."'$balnum'".');" />&nbsp;'.  
                            &mt('Stop balancing').'</label>'.  
                            '<input type="hidden" name="loadbalancing_lonhost_'.$balnum.'" value="'.$lonhost.'" id="loadbalancing_lonhost_'.$balnum.'" /></span>';  
             $targets_div_style = 'display: block';  
             $disabled_div_style = 'display: none';  
             if ($dom eq &Apache::lonnet::host_domain($lonhost)) {  
                 $homedom_div_style = 'display: block';  
             }  
         }  
         $datatable .= '</p></td><td rowspan="'.$rownum.'" valign="top">'.  
                   '<div id="loadbalancing_disabled_'.$balnum.'" style="'.  
                   $disabled_div_style.'">'.$disabledtext.'</div>'."\n".  
                   '<div id="loadbalancing_targets_'.$balnum.'" style="'.$targets_div_style.'">'.&mt('Offloads to:').'<br />';  
         my ($numspares,@spares) = &count_servers($lonhost,%servers);  
         my @sparestypes = ('primary','default');  
         my %typetitles = &sparestype_titles();  
         foreach my $sparetype (@sparestypes) {  
             my $targettable;  
             for (my $i=0; $i<$numspares; $i++) {  
                 my $checked;  
                 if (ref($currtargets{$lonhost}) eq 'HASH') {  
                     if (ref($currtargets{$lonhost}{$sparetype}) eq 'ARRAY') {  
                         if (grep(/^\Q$spares[$i]\E$/,@{$currtargets{$lonhost}{$sparetype}})) {  
                             $checked = ' checked="checked"';  
                         }  
                     }  
                 }  
                 my ($chkboxval,$disabled);  
                 if (($lonhost ne '') && (exists($servers{$lonhost}))) {  
                     $chkboxval = $spares[$i];  
                 }  
                 if (exists($currbalancer{$spares[$i]})) {  
                     $disabled = ' disabled="disabled"';  
                 }  
                 $targettable .=  
                     '<td><label><input type="checkbox" name="loadbalancing_target_'.$balnum.'_'.$sparetype.'"'.  
                     $checked.$disabled.' value="'.$chkboxval.'" id="loadbalancing_target_'.$balnum.'_'.$sparetype.'_'.$i.'" onclick="checkOffloads('."this,'$balnum','$sparetype'".');" /><span id="loadbalancing_targettxt_'.$balnum.'_'.$sparetype.'_'.$i.'">&nbsp;'.$chkboxval.  
                     '</span></label></td>';  
                 my $rem = $i%($numinrow);  
                 if ($rem == 0) {  
                     if (($i > 0) && ($i < $numspares-1)) {  
                         $targettable .= '</tr>';  
                     }  
                     if ($i < $numspares-1) {  
                         $targettable .= '<tr>';  
                     }                      }
                 }                  }
             }              }
             if ($targettable ne '') {              my $chkboxval;
                 my $rem = $numspares%($numinrow);              if (($currbalancer ne '') && (grep((/^\Q$currbalancer\E$/,keys(%servers))))) {
                 my $colsleft = $numinrow - $rem;                  $chkboxval = $spares[$i];
                 if ($colsleft > 1 ) {              }
                     $targettable .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.              $targettable .= '<td><label><input type="checkbox" name="loadbalancing_target_'.$sparetype.'"'.
                                     '&nbsp;</td>';                        $checked.' value="'.$chkboxval.'" id="loadbalancing_target_'.$sparetype.'_'.$i.'" onclick="checkOffloads('."this,'$sparetype'".');" /><span id="loadbalancing_targettxt_'.$sparetype.'_'.$i.'">&nbsp;'.$chkboxval.
                 } elsif ($colsleft == 1) {                        '</span></label></td>';
                     $targettable .= '<td class="LC_left_item">&nbsp;</td>';              my $rem = $i%($numinrow);
                 }              if ($rem == 0) {
                 $datatable .=  '<i>'.$typetitles{$sparetype}.'</i><br />'.                  if ($i > 0) {
                                '<table><tr>'.$targettable.'</tr></table><br />';                      $targettable .= '</tr>';
             }                  }
         }                  $targettable .= '<tr>';
         $datatable .= '</div></td></tr>'.  
                       &loadbalancing_rules($dom,$intdom,$currrules{$lonhost},  
                                            $othertitle,$usertypes,$types,\%servers,  
                                            \%currbalancer,$lonhost,  
                                            $targets_div_style,$homedom_div_style,  
                                            $css_class[$cssidx],$balnum,$islast);  
         $$rowtotal += $rownum;  
         $balnum ++;  
     }  
     $datatable .= '<input type="hidden" name="loadbalancing_total" id="loadbalancing_total" value="'.$balnum.'" />';  
     return $datatable;  
 }  
   
 sub get_loadbalancers_config {  
     my ($servers,$existing,$currbalancer,$currtargets,$currrules) = @_;  
     return unless ((ref($servers) eq 'HASH') &&  
                    (ref($existing) eq 'HASH') && (ref($currbalancer) eq 'HASH') &&  
                    (ref($currtargets) eq 'HASH') && (ref($currrules) eq 'HASH'));  
     if (keys(%{$existing}) > 0) {  
         my $oldlonhost;  
         foreach my $key (sort(keys(%{$existing}))) {  
             if ($key eq 'lonhost') {  
                 $oldlonhost = $existing->{'lonhost'};  
                 $currbalancer->{$oldlonhost} = 1;  
             } elsif ($key eq 'targets') {  
                 if ($oldlonhost) {  
                     $currtargets->{$oldlonhost} = $existing->{'targets'};  
                 }  
             } elsif ($key eq 'rules') {  
                 if ($oldlonhost) {  
                     $currrules->{$oldlonhost} = $existing->{'rules'};  
                 }  
             } elsif (ref($existing->{$key}) eq 'HASH') {  
                 $currbalancer->{$key} = 1;  
                 $currtargets->{$key} = $existing->{$key}{'targets'};  
                 $currrules->{$key} = $existing->{$key}{'rules'};  
             }              }
         }          }
     } else {          if ($targettable ne '') {
         my ($balancerref,$targetsref) =              my $rem = $numspares%($numinrow);
                 &Apache::lonnet::get_lonbalancer_config($servers);              my $colsleft = $numinrow - $rem;
         if ((ref($balancerref) eq 'HASH') && (ref($targetsref) eq 'HASH')) {              if ($colsleft > 1 ) {
             foreach my $server (sort(keys(%{$balancerref}))) {                  $targettable .= '<td colspan="'.$colsleft.'" class="LC_left_item">'.
                 $currbalancer->{$server} = 1;                                  '&nbsp;</td>';
                 $currtargets->{$server} = $targetsref->{$server};              } elsif ($colsleft == 1) {
                   $targettable .= '<td class="LC_left_item">&nbsp;</td>';
             }              }
               $datatable .=  '<i>'.$typetitles{$sparetype}.'</i><br />'.
                              '<table><tr>'.$targettable.'</table><br />';
         }          }
     }      }
     return;      $datatable .= '</div></td></tr>'.
                     &loadbalancing_rules($dom,$intdom,$currrules,$othertitle,
                                          $usertypes,$types,\%servers,$currbalancer,
                                          $targets_div_style,$homedom_div_style,$css_class);
       $$rowtotal += $rownum;
       return $datatable;
 }  }
   
 sub loadbalancing_rules {  sub loadbalancing_rules {
     my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers,      my ($dom,$intdom,$currrules,$othertitle,$usertypes,$types,$servers,
         $currbalancer,$lonhost,$targets_div_style,$homedom_div_style,          $currbalancer,$targets_div_style,$homedom_div_style,$css_class) = @_;
         $css_class,$balnum,$islast) = @_;  
     my $output;      my $output;
     my $num = 0;      my ($alltypes,$othertypes,$titles) = 
     my ($alltypes,$othertypes,$titles) =  
         &loadbalancing_titles($dom,$intdom,$usertypes,$types);          &loadbalancing_titles($dom,$intdom,$usertypes,$types);
     if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH'))  {      if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH'))  {
         foreach my $type (@{$alltypes}) {          foreach my $type (@{$alltypes}) {
             $num ++;  
             my $current;              my $current;
             if (ref($currrules) eq 'HASH') {              if (ref($currrules) eq 'HASH') {
                 $current = $currrules->{$type};                  $current = $currrules->{$type};
             }              }
             if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) {              if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
                 if ($dom ne &Apache::lonnet::host_domain($lonhost)) {                  if ($dom ne &Apache::lonnet::host_domain($currbalancer)) {
                     $current = '';                      $current = '';
                 }                  }
             }              }
             $output .= &loadbalance_rule_row($type,$titles->{$type},$current,              $output .= &loadbalance_rule_row($type,$titles->{$type},$current,
                                              $servers,$currbalancer,$lonhost,$dom,                                               $servers,$currbalancer,$dom,
                                              $targets_div_style,$homedom_div_style,                                               $targets_div_style,$homedom_div_style,$css_class);
                                              $css_class,$balnum,$num,$islast);  
         }          }
     }      }
     return $output;      return $output;
Line 3178  sub loadbalancing_titles { Line 2881  sub loadbalancing_titles {
            '_LC_author'      => &mt('Users from [_1] with author role',$dom),             '_LC_author'      => &mt('Users from [_1] with author role',$dom),
            '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom),             '_LC_internetdom' => &mt('Users not from [_1], but from [_2]',$dom,$intdom),
            '_LC_external'    => &mt('Users not from [_1]',$intdom),             '_LC_external'    => &mt('Users not from [_1]',$intdom),
            '_LC_ipchangesso' => &mt('SSO users from [_1], with IP mismatch',$dom),  
            '_LC_ipchange'    => &mt('Non-SSO users with IP mismatch'),  
                      );                       );
     my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external','_LC_ipchangesso','_LC_ipchange');      my @alltypes = ('_LC_adv','_LC_author','_LC_internetdom','_LC_external');
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         unshift(@alltypes,@{$types},'default');          unshift(@alltypes,@{$types},'default');
     }      }
Line 3204  sub loadbalancing_titles { Line 2905  sub loadbalancing_titles {
 }  }
   
 sub loadbalance_rule_row {  sub loadbalance_rule_row {
     my ($type,$title,$current,$servers,$currbalancer,$lonhost,$dom,      my ($type,$title,$current,$servers,$currbalancer,$dom,$targets_div_style,
         $targets_div_style,$homedom_div_style,$css_class,$balnum,$num,$islast) = @_;          $homedom_div_style,$css_class) = @_;
     my @rulenames;      my @rulenames = ('default','homeserver');
     my %ruletitles = &offloadtype_text();      my %ruletitles = &offloadtype_text();
     if (($type eq '_LC_ipchangesso') || ($type eq '_LC_ipchange')) {      if ($type eq '_LC_external') {
         @rulenames = ('balancer','offloadedto');          push(@rulenames,'externalbalancer');
     } else {      } else {
         @rulenames = ('default','homeserver');          push(@rulenames,'specific');
         if ($type eq '_LC_external') {  
             push(@rulenames,'externalbalancer');  
         } else {  
             push(@rulenames,'specific');  
         }  
         push(@rulenames,'none');  
     }      }
       push(@rulenames,'none');
     my $style = $targets_div_style;      my $style = $targets_div_style;
     if (($type eq '_LC_external') || ($type eq '_LC_internetdom') || ($type eq '_LC_ipchange')) {      if (($type eq '_LC_external') || ($type eq '_LC_internetdom')) {
         $style = $homedom_div_style;          $style = $homedom_div_style;
     }      }
     my $space;      my $output = 
     if ($islast && $num == 1) {          '<tr'.$css_class.'><td valign="top"><div id="balanceruletitle_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".
         $space = '<div display="inline-block">&nbsp;</div>';          '<td><div id="balancerule_'.$type.'" style="'.$style.'">'."\n";
     }  
     my $output =  
         '<tr class="'.$css_class.'" id="balanceruletr_'.$balnum.'_'.$num.'"><td valign="top">'.$space.  
         '<div id="balanceruletitle_'.$balnum.'_'.$type.'" style="'.$style.'">'.$title.'</div></td>'."\n".  
         '<td valaign="top">'.$space.  
         '<div id="balancerule_'.$balnum.'_'.$type.'" style="'.$style.'">'."\n";  
     for (my $i=0; $i<@rulenames; $i++) {      for (my $i=0; $i<@rulenames; $i++) {
         my $rule = $rulenames[$i];          my $rule = $rulenames[$i];
         my ($checked,$extra);          my ($checked,$extra);
Line 3247  sub loadbalance_rule_row { Line 2937  sub loadbalance_rule_row {
                 unless ($checked) {                  unless ($checked) {
                     $default = ' selected="selected"';                      $default = ' selected="selected"';
                 }                  }
                 $extra =                  $extra = ':&nbsp;<select name="loadbalancing_singleserver_'.$type.
                     ':&nbsp;<select name="loadbalancing_singleserver_'.$balnum.'_'.$type.                           '" id="loadbalancing_singleserver_'.$type.
                     '" id="loadbalancing_singleserver_'.$balnum.'_'.$type.                           '" onchange="singleServerToggle('."'$type'".')">'."\n".
                     '" onchange="singleServerToggle('."'$balnum','$type'".')">'."\n".                           '<option value=""'.$default.'></option>'."\n";
                     '<option value=""'.$default.'></option>'."\n";                  foreach my $lonhost (sort(keys(%{$servers}))) {
                 foreach my $server (sort(keys(%{$servers}))) {                      next if ($lonhost eq $currbalancer);
                     if (ref($currbalancer) eq 'HASH') {  
                         next if (exists($currbalancer->{$server}));  
                     }  
                     my $selected;                      my $selected;
                     if ($server eq $current) {                      if ($lonhost eq $current) {
                         $selected = ' selected="selected"';                          $selected = ' selected="selected"';
                     }                      }
                     $extra .= '<option value="'.$server.'"'.$selected.'>'.$server.'</option>';                      $extra .= '<option value="'.$lonhost.'"'.$selected.'>'.$lonhost.'</option>';
                 }                  }
                 $extra .= '</select>';                  $extra .= '</select>';
             }              }
Line 3268  sub loadbalance_rule_row { Line 2955  sub loadbalance_rule_row {
             $checked = ' checked="checked"';              $checked = ' checked="checked"';
         }          }
         $output .= '<span class="LC_nobreak"><label>'.          $output .= '<span class="LC_nobreak"><label>'.
                    '<input type="radio" name="loadbalancing_rules_'.$balnum.'_'.$type.                     '<input type="radio" name="loadbalancing_rules_'.$type.
                    '" id="loadbalancing_rules_'.$balnum.'_'.$type.'_'.$i.'" value="'.                     '" id="loadbalancing_rules_'.$type.'_'.$i.'" value="'.
                    $rule.'" onclick="balanceruleChange('."this.form,'$balnum','$type'".                     $rule.'" onclick="balanceruleChange('."this.form,'$type'".
                    ')"'.$checked.' />&nbsp;'.$ruletitles{$rulenames[$i]}.                     ')"'.$checked.' />&nbsp;'.$ruletitles{$rulenames[$i]}.
                    '</label>'.$extra.'</span><br />'."\n";                     '</label>'.$extra.'</span><br />'."\n";
     }      }
Line 3285  sub offloadtype_text { Line 2972  sub offloadtype_text {
            'externalbalancer' => "Offloads to Load Balancer in user's domain",             'externalbalancer' => "Offloads to Load Balancer in user's domain",
            'specific'         => 'Offloads to specific server',             'specific'         => 'Offloads to specific server',
            'none'             => 'No offload',             'none'             => 'No offload',
            'balancer'         => 'Session hosted on Load Balancer, after re-authentication',  
            'offloadedto'      => 'Session hosted on offload server, after re-authentication',  
     );      );
     return %ruletitles;      return %ruletitles;
 }  }
Line 3308  sub contact_titles { Line 2993  sub contact_titles {
                    'helpdeskmail' => 'Helpdesk requests to be e-mailed to',                     'helpdeskmail' => 'Helpdesk requests to be e-mailed to',
                    'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',                     'lonstatusmail' => 'E-mail from nightly status check (warnings/errors)',
                    'requestsmail' => 'E-mail from course requests requiring approval',                     'requestsmail' => 'E-mail from course requests requiring approval',
                    'updatesmail'  => 'E-mail from nightly check of LON-CAPA module integrity/updates',  
                    'idconflictsmail' => 'E-mail from bi-nightly check for multiple users sharing same student/employee ID',  
                  );                   );
     my %short_titles = &Apache::lonlocal::texthash (      my %short_titles = &Apache::lonlocal::texthash (
                            adminemail   => 'Admin E-mail address',                             adminemail   => 'Admin E-mail address',
Line 3320  sub contact_titles { Line 3003  sub contact_titles {
   
 sub tool_titles {  sub tool_titles {
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
                      aboutme    => 'Personal web page',                       aboutme    => 'Personal Information Page',
                      blog       => 'Blog',                       blog       => 'Blog',
                      webdav     => 'WebDAV',  
                      portfolio  => 'Portfolio',                       portfolio  => 'Portfolio',
                      official   => 'Official courses (with institutional codes)',                       official   => 'Official courses (with institutional codes)',
                      unofficial => 'Unofficial courses',                       unofficial => 'Unofficial courses',
Line 3345  sub courserequest_titles { Line 3027  sub courserequest_titles {
     return %titles;      return %titles;
 }  }
   
 sub authorrequest_titles {  
     my %titles = &Apache::lonlocal::texthash (  
                                    norequest  => 'Not allowed',  
                                    approval   => 'Approval by Dom. Coord.',  
                                    automatic  => 'Automatic approval',  
                  );  
     return %titles;  
 }  
   
 sub courserequest_conditions {  sub courserequest_conditions {
     my %conditions = &Apache::lonlocal::texthash (      my %conditions = &Apache::lonlocal::texthash (
        approval    => '(Processing of request subject to approval by Domain Coordinator).',         approval    => '(Processing of request subject to approval by Domain Coordinator).',
        validate   => '(Processing of request subject to institutional validation).',         validate   => '(Processing of request subject to instittutional validation).',
                  );                   );
     return %conditions;      return %conditions;
 }  }
Line 3483  sub print_usercreation { Line 3156  sub print_usercreation {
         }          }
         my ($othertitle,$usertypes,$types) =          my ($othertitle,$usertypes,$types) =
             &Apache::loncommon::sorted_inst_types($dom);              &Apache::loncommon::sorted_inst_types($dom);
         my $createsettings;  
         if (ref($settings) eq 'HASH') {  
             $createsettings = $settings->{cancreate};  
         }  
         if (ref($usertypes) eq 'HASH') {          if (ref($usertypes) eq 'HASH') {
             if (keys(%{$usertypes}) > 0) {              if (keys(%{$usertypes}) > 0) {
                   my $createsettings;
                   if (ref($settings) eq 'HASH') {
                       $createsettings = $settings->{cancreate};
                   }
                 $datatable .= &insttypes_row($createsettings,$types,$usertypes,                  $datatable .= &insttypes_row($createsettings,$types,$usertypes,
                                              $dom,$numinrow,$othertitle,                                               $dom,$numinrow,$othertitle,
                                              'statustocreate');                                               'statustocreate');
                 $$rowtotal ++;                  $$rowtotal ++;
                 $rownum ++;  
             }              }
         }          }
         $datatable .= &captcha_choice('cancreate',$createsettings,$rownum);  
     } else {      } else {
         my @contexts = ('author','course','domain');          my @contexts = ('author','course','domain');
         my @authtypes = ('int','krb4','krb5','loc');          my @authtypes = ('int','krb4','krb5','loc');
Line 3548  sub print_usercreation { Line 3219  sub print_usercreation {
     return $datatable;      return $datatable;
 }  }
   
 sub captcha_choice {  
     my ($context,$settings,$itemcount) = @_;  
     my ($keyentry,$currpub,$currpriv,%checked,$rowname,$pubtext,$privtext);  
     my %lt = &captcha_phrases();  
     $keyentry = 'hidden';  
     if ($context eq 'cancreate') {  
         $rowname = &mt('CAPTCHA validation (e-mail as username)');  
     } elsif ($context eq 'login') {  
         $rowname =  &mt('"Contact helpdesk" CAPTCHA validation');  
     }  
     if (ref($settings) eq 'HASH') {  
         if ($settings->{'captcha'}) {  
             $checked{$settings->{'captcha'}} = ' checked="checked"';  
         } else {  
             $checked{'original'} = ' checked="checked"';  
         }  
         if ($settings->{'captcha'} eq 'recaptcha') {  
             $pubtext = $lt{'pub'};  
             $privtext = $lt{'priv'};  
             $keyentry = 'text';  
         }  
         if (ref($settings->{'recaptchakeys'}) eq 'HASH') {  
             $currpub = $settings->{'recaptchakeys'}{'public'};  
             $currpriv = $settings->{'recaptchakeys'}{'private'};  
         }  
     } else {  
         $checked{'original'} = ' checked="checked"';  
     }  
     my $css_class = $itemcount%2?' class="LC_odd_row"':'';  
     my $output = '<tr'.$css_class.'>'.  
                  '<td class="LC_left_item">'.$rowname.'</td><td class="LC_left_item" colspan="2">'."\n".  
                  '<table><tr><td>'."\n";  
     foreach my $option ('original','recaptcha','notused') {  
         $output .= '<span class="LC_nobreak"><label><input type="radio" name="'.$context.'_captcha" value="'.  
                    $option.'" '.$checked{$option}.' onchange="javascript:updateCaptcha('."this,'$context'".');" />'.  
                    $lt{$option}.'</label></span>';  
         unless ($option eq 'notused') {  
             $output .= ('&nbsp;'x2)."\n";  
         }  
     }  
 #  
 # Note: If reCAPTCHA is to be used for LON-CAPA servers in a domain, a domain coordinator should visit:  
 # https://www.google.com/recaptcha and generate a Public and Private key. For domains with multiple  
 # servers a single key pair will be used for all servers, so the internet domain (e.g., yourcollege.edu)  
 # specified for use with the key should be broad enough to accommodate all servers in the LON-CAPA domain.  
 #  
     $output .= '</td></tr>'."\n".  
                '<tr><td>'."\n".  
                '<span class="LC_nobreak"><span id="'.$context.'_recaptchapubtxt">'.$pubtext.'</span>&nbsp;'."\n".  
                '<input type="'.$keyentry.'" id="'.$context.'_recaptchapub" name="'.$context.'_recaptchapub" value="'.  
                $currpub.'" size="40" /></span><br />'."\n".  
                '<span class="LC_nobreak"><span id="'.$context.'_recaptchaprivtxt">'.$privtext.'</span>&nbsp;'."\n".  
                '<input type="'.$keyentry.'" id="'.$context.'_recaptchapriv" name="'.$context.'_recaptchapriv" value="'.  
                $currpriv.'" size="40" /></span></td></tr></table>'."\n".  
                '</td></tr>';  
     return $output;  
 }  
   
 sub user_formats_row {  sub user_formats_row {
     my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;      my ($type,$settings,$rules,$ruleorder,$numinrow,$rowcount) = @_;
     my $output;      my $output;
Line 3740  sub print_usermodification { Line 3353  sub print_usermodification {
 }  }
   
 sub print_defaults {  sub print_defaults {
     my ($dom,$settings,$rowtotal) = @_;      my ($dom,$rowtotal) = @_;
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def',
                  'datelocale_def','portal_def');                   'datelocale_def','portal_def');
     my %defaults;      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     if (ref($settings) eq 'HASH') {  
         %defaults = %{$settings};  
     } else {  
         my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);  
         foreach my $item (@items) {  
             $defaults{$item} = $domdefaults{$item};  
         }  
     }  
     my $titles = &defaults_titles($dom);      my $titles = &defaults_titles($dom);
     my $rownum = 0;      my $rownum = 0;
     my ($datatable,$css_class);      my ($datatable,$css_class);
Line 3775  sub print_defaults { Line 3380  sub print_defaults {
             my %authnames = &authtype_names();              my %authnames = &authtype_names();
             foreach my $auth (@authtypes) {              foreach my $auth (@authtypes) {
                 my $checked = ' ';                  my $checked = ' ';
                 if ($defaults{$item} eq $auth) {                  if ($domdefaults{$item} eq $auth) {
                     $checked = ' checked="checked" ';                      $checked = ' checked="checked" ';
                 }                  }
                 $datatable .= '<label><input type="radio" name="'.$item.                  $datatable .= '<label><input type="radio" name="'.$item.
Line 3784  sub print_defaults { Line 3389  sub print_defaults {
             }              }
         } elsif ($item eq 'timezone_def') {          } elsif ($item eq 'timezone_def') {
             my $includeempty = 1;              my $includeempty = 1;
             $datatable .= &Apache::loncommon::select_timezone($item,$defaults{$item},undef,$includeempty);              $datatable .= &Apache::loncommon::select_timezone($item,$domdefaults{$item},undef,$includeempty);
         } elsif ($item eq 'datelocale_def') {          } elsif ($item eq 'datelocale_def') {
             my $includeempty = 1;              my $includeempty = 1;
             $datatable .= &Apache::loncommon::select_datelocale($item,$defaults{$item},undef,$includeempty);              $datatable .= &Apache::loncommon::select_datelocale($item,$domdefaults{$item},undef,$includeempty);
         } elsif ($item eq 'lang_def') {  
             my %langchoices = &get_languages_hash();  
             $langchoices{''} = 'No language preference';  
             %langchoices = &Apache::lonlocal::texthash(%langchoices);  
             $datatable .= &Apache::loncommon::select_form($defaults{$item},$item,  
                                                           \%langchoices);  
         } else {          } else {
             my $size;              my $size;
             if ($item eq 'portal_def') {              if ($item eq 'portal_def') {
                 $size = ' size="25"';                  $size = ' size="25"';
             }              }
             $datatable .= '<input type="text" name="'.$item.'" value="'.              $datatable .= '<input type="text" name="'.$item.'" value="'.
                           $defaults{$item}.'"'.$size.' />';                            $domdefaults{$item}.'"'.$size.' />';
         }          }
         $datatable .= '</td></tr>';          $datatable .= '</td></tr>';
         $rownum ++;          $rownum ++;
Line 3809  sub print_defaults { Line 3408  sub print_defaults {
     return $datatable;      return $datatable;
 }  }
   
 sub get_languages_hash {  
     my %langchoices;  
     foreach my $id (&Apache::loncommon::languageids()) {  
         my $code = &Apache::loncommon::supportedlanguagecode($id);  
         if ($code ne '') {  
             $langchoices{$code} =  &Apache::loncommon::plainlanguagedescription($id);  
         }  
     }  
     return %langchoices;  
 }  
   
 sub defaults_titles {  sub defaults_titles {
     my ($dom) = @_;      my ($dom) = @_;
     my %titles = &Apache::lonlocal::texthash (      my %titles = &Apache::lonlocal::texthash (
Line 3952  sub print_scantronformat { Line 3540  sub print_scantronformat {
         $datatable .= '<td>'.&mt('Default in use:').'<br />'.          $datatable .= '<td>'.&mt('Default in use:').'<br />'.
                       '<span class="LC_nobreak">';                        '<span class="LC_nobreak">';
         if ($scantronurl) {          if ($scantronurl) {
             $datatable .= &Apache::loncommon::modal_link($scantronurl,&mt('Default bubblesheet format file'),600,500,              $datatable .= '<a href="'.$scantronurl.'" target="_blank">'.
                                                          undef,undef,undef,undef,'background-color:#ffffff');                            &mt('Default bubblesheet format file').'</a>';
         } else {          } else {
             $datatable = &mt('File unavailable for display');              $datatable = &mt('File unavailable for display');
         }          }
Line 3978  sub print_scantronformat { Line 3566  sub print_scantronformat {
             }               } 
             $datatable .= '<td>'.$errorstr.'</td><td>&nbsp;';              $datatable .= '<td>'.$errorstr.'</td><td>&nbsp;';
         } elsif ($scantronurl) {          } elsif ($scantronurl) {
             my $link =  &Apache::loncommon::modal_link($scantronurl,&mt('Custom bubblesheet format file'),600,500,  
                                                        undef,undef,undef,undef,'background-color:#ffffff');  
             $datatable .= '<td><span class="LC_nobreak">'.              $datatable .= '<td><span class="LC_nobreak">'.
                           $link.                            '<a href="'.$scantronurl.'" target="_blank">'.
                           '<label><input type="checkbox" name="scantronformat_del"'.                            &mt('Custom bubblesheet format file').'</a><label>'.
                           ' value="1" />'.&mt('Delete?').'</label></span></td>'.                            '<input type="checkbox" name="scantronformat_del"'.
                             '" value="1" />'.&mt('Delete?').'</label></span></td>'.
                           '<td><span class="LC_nobreak">&nbsp;'.                            '<td><span class="LC_nobreak">&nbsp;'.
                           &mt('Replace:').'</span><br />';                            &mt('Replace:').'</span><br />';
         }          }
Line 4281  sub print_serverstatuses { Line 3868  sub print_serverstatuses {
   
 sub serverstatus_pages {  sub serverstatus_pages {
     return ('userstatus','lonstatus','loncron','server-status','codeversions',      return ('userstatus','lonstatus','loncron','server-status','codeversions',
             'checksums','clusterstatus','metadata_keywords','metadata_harvest',              'clusterstatus','metadata_keywords','metadata_harvest',
             'takeoffline','takeonline','showenv','toggledebug','ping','domconf');              'takeoffline','takeonline','showenv','toggledebug','ping','domconf');
 }  }
   
Line 4439  sub build_category_rows { Line 4026  sub build_category_rows {
             if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {              if (ref($cats->[$depth]{$parent}) eq 'ARRAY') {
                 my $numchildren = @{$cats->[$depth]{$parent}};                  my $numchildren = @{$cats->[$depth]{$parent}};
                 my $css_class = $itemcount%2?' class="LC_odd_row"':'';                  my $css_class = $itemcount%2?' class="LC_odd_row"':'';
                 $text .= '<td><table class="LC_data_table">';                  $text .= '<td><table class="LC_datatable">';
                 my ($idxnum,$parent_name,$parent_item);                  my ($idxnum,$parent_name,$parent_item);
                 my $higher = $depth - 1;                  my $higher = $depth - 1;
                 if ($higher == 0) {                  if ($higher == 0) {
Line 4596  sub insttypes_row { Line 4183  sub insttypes_row {
     if ($context eq 'cansearch') {      if ($context eq 'cansearch') {
         $showdom = ' ('.$dom.')';          $showdom = ' ('.$dom.')';
     }      }
     my $class = 'LC_left_item';  
     if ($context eq 'statustocreate') {  
         $class = 'LC_right_item';  
     }  
     my $output =  '<tr class="LC_odd_row">'.      my $output =  '<tr class="LC_odd_row">'.
                   '<td>'.$lt{$context}.$showdom.                    '<td>'.$lt{$context}.$showdom.
                   '</td><td class="'.$class.'" colspan="2"><table>';                    '</td><td class="LC_left_item" colspan="2"><table>';
     my $rem;      my $rem;
     if (ref($types) eq 'ARRAY') {      if (ref($types) eq 'ARRAY') {
         for (my $i=0; $i<@{$types}; $i++) {          for (my $i=0; $i<@{$types}; $i++) {
Line 4731  sub usertype_update_row { Line 4314  sub usertype_update_row {
 }  }
   
 sub modify_login {  sub modify_login {
     my ($r,$dom,$confname,$lastactref,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,$colchgtext,%changes,%colchanges,%newfile,%newurl,      my ($resulttext,$errors,$colchgtext,%changes,%colchanges);
         %curr_loginvia,%loginhash,@currlangs,@newlangs,$addedfile,%title,@offon);      my %title = ( coursecatalog => 'Display course catalog',
     %title = ( coursecatalog => 'Display course catalog',                    adminmail => 'Display administrator E-mail address',
                adminmail => 'Display administrator E-mail address',                    newuser => 'Link for visitors to create a user account',
                helpdesk  => 'Display "Contact Helpdesk" link',                    loginheader => 'Log-in box header');
                newuser => 'Link for visitors to create a user account',      my @offon = ('off','on');
                loginheader => 'Log-in box header');      my %curr_loginvia;
     @offon = ('off','on');  
     if (ref($domconfig{login}) eq 'HASH') {      if (ref($domconfig{login}) eq 'HASH') {
         if (ref($domconfig{login}{loginvia}) eq 'HASH') {          if (ref($domconfig{login}{loginvia}) eq 'HASH') {
             foreach my $lonhost (keys(%{$domconfig{login}{loginvia}})) {              foreach my $lonhost (keys(%{$domconfig{login}{loginvia}})) {
Line 4747  sub modify_login { Line 4329  sub modify_login {
             }              }
         }          }
     }      }
       my %loginhash;
     ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],      ($errors,%colchanges) = &modify_colors($r,$dom,$confname,['login'],
                                            \%domconfig,\%loginhash);                                             \%domconfig,\%loginhash);
     my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');      my @toggles = ('coursecatalog','adminmail','newuser');
     foreach my $item (@toggles) {      foreach my $item (@toggles) {
         $loginhash{login}{$item} = $env{'form.'.$item};          $loginhash{login}{$item} = $env{'form.'.$item};
     }      }
Line 4819  sub modify_login { Line 4402  sub modify_login {
                                 $new = '';                                   $new = ''; 
                             }                              }
                         }                          }
   
                         $loginhash{login}{loginvia}{$lonhost}{$item} = $new;                          $loginhash{login}{loginvia}{$lonhost}{$item} = $new;
                     }                      }
                 }                  }
Line 4844  sub modify_login { Line 4428  sub modify_login {
         }          }
     }      }
   
     my $servadm = $r->dir_config('lonAdmEMail');  
     my %langchoices = &Apache::lonlocal::texthash(&get_languages_hash());  
     if (ref($domconfig{'login'}) eq 'HASH') {  
         if (ref($domconfig{'login'}{'helpurl'}) eq 'HASH') {  
             foreach my $lang (sort(keys(%{$domconfig{'login'}{'helpurl'}}))) {  
                 if ($lang eq 'nolang') {  
                     push(@currlangs,$lang);  
                 } elsif (defined($langchoices{$lang})) {  
                     push(@currlangs,$lang);  
                 } else {  
                     next;  
                 }  
             }  
         }  
     }  
     my @delurls = &Apache::loncommon::get_env_multiple('form.loginhelpurl_del');  
     if (@currlangs > 0) {  
         foreach my $lang (@currlangs) {  
             if (grep(/^\Q$lang\E$/,@delurls)) {  
                 $changes{'helpurl'}{$lang} = 1;  
             } elsif ($env{'form.loginhelpurl_'.$lang.'.filename'}) {  
                 $changes{'helpurl'}{$lang} = 1;  
                 $newfile{$lang} = $env{'form.loginhelpurl_'.$lang.'.filename'};  
                 push(@newlangs,$lang);  
             } else {  
                 $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};  
             }  
         }  
     }  
     unless (grep(/^nolang$/,@currlangs)) {  
         if ($env{'form.loginhelpurl_nolang.filename'}) {  
             $changes{'helpurl'}{'nolang'} = 1;  
             $newfile{'nolang'} = $env{'form.loginhelpurl_nolang.filename'};  
             push(@newlangs,'nolang');  
         }  
     }  
     if ($env{'form.loginhelpurl_add_lang'}) {  
         if ((defined($langchoices{$env{'form.loginhelpurl_add_lang'}})) &&  
             ($env{'form.loginhelpurl_add_file.filename'})) {  
             $newfile{$env{'form.loginhelpurl_add_lang'}} = $env{'form.loginhelpurl_add_file.filename'};  
             $addedfile = $env{'form.loginhelpurl_add_lang'};  
         }  
     }  
     if ((@newlangs > 0) || ($addedfile)) {  
         my $error;  
         my ($configuserok,$author_ok,$switchserver) = &config_check($dom,$confname,$servadm);  
         if ($configuserok eq 'ok') {  
             if ($switchserver) {  
                 $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver);  
             } elsif ($author_ok eq 'ok') {  
                 my @allnew = @newlangs;  
                 if ($addedfile ne '') {  
                     push(@allnew,$addedfile);  
                 }  
                 foreach my $lang (@allnew) {  
                     my $formelem = 'loginhelpurl_'.$lang;  
                     if ($lang eq $env{'form.loginhelpurl_add_lang'}) {  
                         $formelem = 'loginhelpurl_add_file';  
                     }  
                     (my $result,$newurl{$lang}) = &publishlogo($r,'upload',$formelem,$dom,$confname,  
                                                                "help/$lang",'','',$newfile{$lang});  
                     if ($result eq 'ok') {  
                         $loginhash{'login'}{'helpurl'}{$lang} = $newurl{$lang};  
                         $changes{'helpurl'}{$lang} = 1;  
                     } else {  
                         my $puberror = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$newfile{$lang},$result);  
                         $errors .= '<li><span class="LC_error">'.$puberror.'</span></li>';  
                         if ((grep(/^\Q$lang\E$/,@currlangs)) &&  
                             (!grep(/^\Q$lang\E$/,@delurls))) {  
   
                             $loginhash{'login'}{'helpurl'}{$lang} = $domconfig{'login'}{'helpurl'}{$lang};  
                         }  
                     }  
                 }  
             } else {  
                 $error = &mt("Upload of custom log-in help file(s) failed because an author role could not be assigned to a Domain Configuration user ([_1]) in domain: [_2].  Error was: [_3].",$confname,$dom,$author_ok);  
             }  
         } else {  
             $error = &mt("Upload of custom log-in help file(s) failed because a Domain Configuration user ([_1]) could not be created in domain: [_2].  Error was: [_3].",$confname,$dom,$configuserok);  
         }  
         if ($error) {  
             &Apache::lonnet::logthis($error);  
             $errors .= '<li><span class="LC_error">'.$error.'</span></li>';  
         }  
     }  
     &process_captcha('login',\%changes,$loginhash{'login'},$domconfig{'login'});  
   
     my $defaulthelpfile = '/adm/loginproblems.html';  
     my $defaulttext = &mt('Default in use');  
   
     my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%loginhash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         my @toggles = ('coursecatalog','adminmail','helpdesk','newuser');          my @toggles = ('coursecatalog','adminmail','newuser');
         my %defaultchecked = (          my %defaultchecked = (
                     'coursecatalog' => 'on',                      'coursecatalog' => 'on',
                     'helpdesk'      => 'on',  
                     'adminmail'     => 'off',                      'adminmail'     => 'off',
                     'newuser'       => 'off',                      'newuser'       => 'off',
         );          );
Line 4969  sub modify_login { Line 4462  sub modify_login {
         }          }
         if (keys(%changes) > 0 || $colchgtext) {          if (keys(%changes) > 0 || $colchgtext) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
             if (ref($lastactref) eq 'HASH') {  
                 $lastactref->{'domainconfig'} = 1;  
             }  
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 if ($item eq 'loginvia') {                  if ($item eq 'loginvia') {
Line 5003  sub modify_login { Line 4493  sub modify_login {
                         }                          }
                         $resulttext .= '</ul></li>';                          $resulttext .= '</ul></li>';
                     }                      }
                 } elsif ($item eq 'helpurl') {  
                     if (ref($changes{$item}) eq 'HASH') {  
                         foreach my $lang (sort(keys(%{$changes{$item}}))) {  
                             if (grep(/^\Q$lang\E$/,@delurls)) {  
                                 my ($chg,$link);  
                                 $link = &Apache::loncommon::modal_link($defaulthelpfile,$defaulttext,600,500);  
                                 if ($lang eq 'nolang') {  
                                     $chg = &mt('custom log-in help file removed for no preferred language; [_1]',$link);  
                                 } else {  
                                     $chg = &mt('custom log-in help file removed for specific language: [_1]; [_2]',$langchoices{$lang},$link);  
                                 }  
                                 $resulttext .= '<li>'.$chg.'</li>';  
                             } else {  
                                 my $chg;  
                                 if ($lang eq 'nolang') {  
                                     $chg = &mt('custom log-in help file for no preferred language');  
                                 } else {  
                                     $chg = &mt('custom log-in help file for specific language: [_1]',$langchoices{$lang});  
                                 }  
                                 $resulttext .= '<li>'.&Apache::loncommon::modal_link(  
                                                       $loginhash{'login'}{'helpurl'}{$lang}.  
                                                       '?inhibitmenu=yes',$chg,600,500).  
                                                '</li>';  
                             }  
                         }  
                     }  
                 } elsif ($item eq 'captcha') {  
                     if (ref($loginhash{'login'}) eq 'HASH') {  
                         my $chgtxt;  
                         if ($loginhash{'login'}{$item} eq 'notused') {  
                             $chgtxt .= &mt('No CAPTCHA validation in use for helpdesk form.');  
                         } else {  
                             my %captchas = &captcha_phrases();  
                             if ($captchas{$loginhash{'login'}{$item}}) {  
                                 $chgtxt .= &mt("Validation for helpdesk form set to $captchas{$loginhash{'login'}{$item}}.");  
                             } else {  
                                 $chgtxt .= &mt('Validation for helpdesk form set to unknown type.');  
                             }  
                         }  
                         $resulttext .= '<li>'.$chgtxt.'</li>';  
                     }  
                 } elsif ($item eq 'recaptchakeys') {  
                     if (ref($loginhash{'login'}) eq 'HASH') {  
                         my ($privkey,$pubkey);  
                         if (ref($loginhash{'login'}{$item}) eq 'HASH') {  
                             $pubkey = $loginhash{'login'}{$item}{'public'};  
                             $privkey = $loginhash{'login'}{$item}{'private'};  
                         }  
                         my $chgtxt .= &mt('ReCAPTCHA keys changes').'<ul>';  
                         if (!$pubkey) {  
                             $chgtxt .= '<li>'.&mt('Public key deleted').'</li>';  
                         } else {  
                             $chgtxt .= '<li>'.&mt('Public key set to [_1]',$pubkey).'</li>';  
                         }  
                         if (!$privkey) {  
                             $chgtxt .= '<li>'.&mt('Private key deleted').'</li>';  
                         } else {  
                             $chgtxt .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';  
                         }  
                         $chgtxt .= '</ul>';  
                         $resulttext .= '<li>'.$chgtxt.'</li>';  
                     }  
                 } else {                  } else {
                     $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';                      $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
                 }                  }
Line 5092  sub color_font_choices { Line 4520  sub color_font_choices {
             links => "Link colors",              links => "Link colors",
             images => "Images",              images => "Images",
             font => "Font color",              font => "Font color",
             fontmenu => "Font menu",              fontmenu => "Font Menu",
             pgbg => "Page",              pgbg => "Page",
             tabbg => "Header",              tabbg => "Header",
             sidebg => "Border",              sidebg => "Border",
Line 5104  sub color_font_choices { Line 4532  sub color_font_choices {
 }  }
   
 sub modify_rolecolors {  sub modify_rolecolors {
     my ($r,$dom,$confname,$roles,$lastactref,%domconfig) = @_;      my ($r,$dom,$confname,$roles,%domconfig) = @_;
     my ($resulttext,%rolehash);      my ($resulttext,%rolehash);
     $rolehash{'rolecolors'} = {};      $rolehash{'rolecolors'} = {};
     if (ref($domconfig{'rolecolors'}) ne 'HASH') {      if (ref($domconfig{'rolecolors'}) ne 'HASH') {
Line 5119  sub modify_rolecolors { Line 4547  sub modify_rolecolors {
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);              &Apache::loncommon::devalidate_domconfig_cache($dom);
             if (ref($lastactref) eq 'HASH') {  
                 $lastactref->{'domainconfig'} = 1;  
             }  
             $resulttext = &display_colorchgs($dom,\%changes,$roles,              $resulttext = &display_colorchgs($dom,\%changes,$roles,
                                              $rolehash{'rolecolors'});                                               $rolehash{'rolecolors'});
         } else {          } else {
Line 5147  sub modify_colors { Line 4572  sub modify_colors {
     my @images;      my @images;
     my $servadm = $r->dir_config('lonAdmEMail');      my $servadm = $r->dir_config('lonAdmEMail');
     my $errors;      my $errors;
     my %defaults;  
     foreach my $role (@{$roles}) {      foreach my $role (@{$roles}) {
         if ($role eq 'login') {          if ($role eq 'login') {
             %choices = &login_choices();              %choices = &login_choices();
             @logintext = ('textcol','bgcol');              @logintext = ('textcol','bgcol');
         } else {          } else {
             %choices = &color_font_choices();              %choices = &color_font_choices();
               $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};
         }          }
         if ($role eq 'login') {          if ($role eq 'login') {
             @images = ('img','logo','domlogo','login');              @images = ('img','logo','domlogo','login');
             @bgs = ('pgbg','mainbg','sidebg');              @bgs = ('pgbg','mainbg','sidebg');
         } else {          } else {
             @images = ('img');              @images = ('img');
             @bgs = ('pgbg','tabbg','sidebg');              @bgs = ('pgbg','tabbg','sidebg'); 
         }  
         my %defaults = &role_defaults($role,\@bgs,\@links,\@images,\@logintext);  
         unless ($env{'form.'.$role.'_font'} eq $defaults{'font'}) {  
             $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};  
         }  
         if ($role eq 'login') {  
             foreach my $item (@logintext) {  
                 unless ($env{'form.'.$role.'_'.$item} eq  $defaults{'logintext'}{$item}) {  
                     $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};  
                 }  
             }  
         } else {  
             unless($env{'form.'.$role.'_fontmenu'} eq $defaults{'fontmenu'}) {  
                 $confhash->{$role}{'fontmenu'} = $env{'form.'.$role.'_fontmenu'};  
             }  
         }          }
         foreach my $item (@bgs) {          $confhash->{$role}{'font'} = $env{'form.'.$role.'_font'};
             unless ($env{'form.'.$role.'_'.$item} eq $defaults{'bgs'}{$item} ) {          foreach my $item (@bgs,@links,@logintext) {
                 $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};              $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};
             }  
         }  
         foreach my $item (@links) {  
             unless ($env{'form.'.$role.'_'.$item} eq  $defaults{'links'}{$item}) {  
                 $confhash->{$role}{$item} = $env{'form.'.$role.'_'.$item};  
             }  
         }          }
         my ($configuserok,$author_ok,$switchserver) =           my ($configuserok,$author_ok,$switchserver) = 
             &config_check($dom,$confname,$servadm);              &config_check($dom,$confname,$servadm);
Line 5533  sub publishlogo { Line 4937  sub publishlogo {
 # See if there is anything left  # See if there is anything left
     unless ($fname) { return ('error: no uploaded file'); }      unless ($fname) { return ('error: no uploaded file'); }
     $fname="$subdir/$fname";      $fname="$subdir/$fname";
     my $docroot=$r->dir_config('lonDocRoot');      my $filepath=$r->dir_config('lonDocRoot')."/priv/$dom/$confname";
     my $filepath="$docroot/priv";  
     my $relpath = "$dom/$confname";  
     my ($fnamepath,$file,$fetchthumb);      my ($fnamepath,$file,$fetchthumb);
     $file=$fname;      $file=$fname;
     if ($fname=~m|/|) {      if ($fname=~m|/|) {
         ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);          ($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|);
     }      }
     my @parts=split(/\//,"$filepath/$relpath/$fnamepath");      my @parts=split(/\//,$filepath.'/'.$fnamepath);
     my $count;      my $count;
     for ($count=5;$count<=$#parts;$count++) {      for ($count=4;$count<=$#parts;$count++) {
         $filepath.="/$parts[$count]";          $filepath.="/$parts[$count]";
         if ((-e $filepath)!=1) {          if ((-e $filepath)!=1) {
             mkdir($filepath,02770);              mkdir($filepath,02770);
Line 5553  sub publishlogo { Line 4955  sub publishlogo {
     if ($file=~/\.(\w+)$/ &&      if ($file=~/\.(\w+)$/ &&
         (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {          (&Apache::loncommon::fileembstyle($1) eq 'hdn')) {
         $output =           $output = 
             &mt('Invalid file extension ([_1]) - reserved for internal use.',$1);               &mt('Invalid file extension ([_1]) - reserved for LONCAPA use.',$1); 
     } elsif ($file=~/\.(\w+)$/ &&      } elsif ($file=~/\.(\w+)$/ &&
         !defined(&Apache::loncommon::fileembstyle($1))) {          !defined(&Apache::loncommon::fileembstyle($1))) {
         $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);          $output = &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1);
     } elsif ($file=~/\.(\d+)\.(\w+)$/) {      } elsif ($file=~/\.(\d+)\.(\w+)$/) {
         $output = &mt('Filename not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);          $output = &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2);
     } elsif (-d "$filepath/$file") {      } elsif (-d "$filepath/$file") {
         $output = &mt('Filename is a directory name - rename the file and re-upload');          $output = &mt('File name is a directory name - rename the file and re-upload');
     } else {      } else {
         my $source = $filepath.'/'.$file;          my $source = $filepath.'/'.$file;
         my $logfile;          my $logfile;
         if (!open($logfile,">>$source".'.log')) {          if (!open($logfile,">>$source".'.log')) {
             return (&mt('No write permission to Authoring Space'));              return (&mt('No write permission to Construction Space'));
         }          }
         print $logfile          print $logfile
 "\n================= Publish ".localtime()." ================\n".  "\n================= Publish ".localtime()." ================\n".
Line 5590  $env{'user.name'}.':'.$env{'user.domain' Line 4992  $env{'user.name'}.':'.$env{'user.domain'
         close(FH);          close(FH);
         chmod(0660, $source); # Permissions to rw-rw---.          chmod(0660, $source); # Permissions to rw-rw---.
   
           my $docroot=$r->dir_config('lonDocRoot');
         my $targetdir=$docroot.'/res/'.$dom.'/'.$confname .'/'.$fnamepath;          my $targetdir=$docroot.'/res/'.$dom.'/'.$confname .'/'.$fnamepath;
         my $copyfile=$targetdir.'/'.$file;          my $copyfile=$targetdir.'/'.$file;
   
Line 5712  sub write_metadata { Line 5115  sub write_metadata {
         print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;          print $logfile "\nWrite metadata file for ".$targetdir.'/'.$file;
         my $mfh;          my $mfh;
         if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {          if (open($mfh,'>'.$targetdir.'/'.$file.'.meta')) {
             foreach (sort(keys(%metadatafields))) {              foreach (sort keys %metadatafields) {
                 unless ($_=~/\./) {                  unless ($_=~/\./) {
                     my $unikey=$_;                      my $unikey=$_;
                     $unikey=~/^([A-Za-z]+)/;                      $unikey=~/^([A-Za-z]+)/;
Line 5796  sub check_switchserver { Line 5199  sub check_switchserver {
     my @ids=&Apache::lonnet::current_machine_ids();      my @ids=&Apache::lonnet::current_machine_ids();
     foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }      foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } }
     if (!$allowed) {      if (!$allowed) {
  $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&amp;role=dc./'.$dom.'/&amp;destinationurl=/adm/domainprefs">'.&mt('Switch Server').'</a>';   $switchserver='<a href="/adm/switchserver?otherserver='.$home.'&role=dc./'.$dom.'/">'.&mt('Switch Server').'</a>';
     }      }
     return $switchserver;      return $switchserver;
 }  }
   
 sub modify_quotas {  sub modify_quotas {
     my ($dom,$action,$lastactref,%domconfig) = @_;      my ($dom,$action,%domconfig) = @_;
     my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,      my ($context,@usertools,@options,%validations,%titles,%confhash,%toolshash,
         %limithash,$toolregexp,%conditions,$resulttext,%changes);          %limithash,$toolregexp,%conditions,$resulttext,%changes);
     if ($action eq 'quotas') {      if ($action eq 'quotas') {
         $context = 'tools';           $context = 'tools'; 
     } else {      } else { 
         $context = $action;          $context = $action;
     }      }
     if ($context eq 'requestcourses') {      if ($context eq 'requestcourses') {
Line 5817  sub modify_quotas { Line 5220  sub modify_quotas {
         %titles = &courserequest_titles();          %titles = &courserequest_titles();
         $toolregexp = join('|',@usertools);          $toolregexp = join('|',@usertools);
         %conditions = &courserequest_conditions();          %conditions = &courserequest_conditions();
     } elsif ($context eq 'requestauthor') {  
         @usertools = ('author');  
         %titles = &authorrequest_titles();  
     } else {      } else {
         @usertools = ('aboutme','blog','webdav','portfolio');          @usertools = ('aboutme','blog','portfolio');
         %titles = &tool_titles();          %titles = &tool_titles();
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);      my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($dom);
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         if ($context eq 'requestcourses') {          if ($context eq 'requestcourses') {
Line 5837  sub modify_quotas { Line 5237  sub modify_quotas {
                     $confhash{$item}{$type} = $env{$key};                      $confhash{$item}{$type} = $env{$key};
                 }                  }
             }              }
         } elsif ($context eq 'requestauthor') {  
             if ($key =~ /^\Qform.authorreq_\E(.+)$/) {  
                 $confhash{$1} = $env{$key};  
             }  
         } else {          } else {
             if ($key =~ /^form\.quota_(.+)$/) {              if ($key =~ /^form\.quota_(.+)$/) {
                 $confhash{'defaultquota'}{$1} = $env{$key};                  $confhash{'defaultquota'}{$1} = $env{$key};
             } elsif ($key =~ /^form\.authorquota_(.+)$/) {              }
                 $confhash{'authorquota'}{$1} = $env{$key};              if ($key =~ /^form\.\Q$context\E_(.+)$/) {
             } elsif ($key =~ /^form\.\Q$context\E_(.+)$/) {  
                 @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);                  @{$toolshash{$1}} = &Apache::loncommon::get_env_multiple($key);
             }              }
         }          }
     }      }
     if (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      if ($context eq 'requestcourses') {
         my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');          my @approvalnotify = &Apache::loncommon::get_env_multiple('form.reqapprovalnotify');
         @approvalnotify = sort(@approvalnotify);          @approvalnotify = sort(@approvalnotify);
         $confhash{'notify'}{'approval'} = join(',',@approvalnotify);          $confhash{'notify'}{'approval'} = join(',',@approvalnotify);
Line 5872  sub modify_quotas { Line 5267  sub modify_quotas {
         }          }
     } else {      } else {
         $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};          $confhash{'defaultquota'}{'default'} = $env{'form.defaultquota'};
         $confhash{'authorquota'}{'default'} = $env{'form.authorquota'};  
     }      }
     foreach my $item (@usertools) {      foreach my $item (@usertools) {
         foreach my $type (@{$types},'default','_LC_adv') {          foreach my $type (@{$types},'default','_LC_adv') {
Line 5888  sub modify_quotas { Line 5282  sub modify_quotas {
                         $confhash{$item}{$type} .= $limithash{$item}{$type};                          $confhash{$item}{$type} .= $limithash{$item}{$type};
                     }                      }
                 }                  }
             } elsif ($context eq 'requestauthor') {  
                 $unset = '0';  
                 if ($type eq '_LC_adv') {  
                     $unset = '';  
                 }  
             } else {              } else {
                 if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {                  if (grep(/^\Q$type\E$/,@{$toolshash{$item}})) {
                     $confhash{$item}{$type} = 1;                      $confhash{$item}{$type} = 1;
Line 5901  sub modify_quotas { Line 5290  sub modify_quotas {
                 }                  }
             }              }
             if (ref($domconfig{$action}) eq 'HASH') {              if (ref($domconfig{$action}) eq 'HASH') {
                 if ($action eq 'requestauthor') {                  if (ref($domconfig{$action}{$item}) eq 'HASH') {
                     if ($domconfig{$action}{$type} ne $confhash{$type}) {  
                         $changes{$type} = 1;  
                     }  
                 } elsif (ref($domconfig{$action}{$item}) eq 'HASH') {  
                     if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) {                      if ($domconfig{$action}{$item}{$type} ne $confhash{$item}{$type}) {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
                     }                      }
Line 5925  sub modify_quotas { Line 5310  sub modify_quotas {
                     if ($confhash{$item}{$type} ne $unset) {                      if ($confhash{$item}{$type} ne $unset) {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
                     }                      }
                 } elsif ($context eq 'requestauthor') {  
                     if ($confhash{$type} ne $unset) {  
                         $changes{$type} = 1;  
                     }  
                 } else {                  } else {
                     if (!$confhash{$item}{$type}) {                      if (!$confhash{$item}{$type}) {
                         $changes{$item}{$type} = 1;                          $changes{$item}{$type} = 1;
Line 5937  sub modify_quotas { Line 5318  sub modify_quotas {
             }              }
         }          }
     }      }
     unless (($context eq 'requestcourses') || ($context eq 'requestauthor')) {      unless ($context eq 'requestcourses') {
         if (ref($domconfig{'quotas'}) eq 'HASH') {          if (ref($domconfig{'quotas'}) eq 'HASH') {
             if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {              if (ref($domconfig{'quotas'}{'defaultquota'}) eq 'HASH') {
                 foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {                  foreach my $key (keys(%{$domconfig{'quotas'}{'defaultquota'}})) {
Line 5960  sub modify_quotas { Line 5341  sub modify_quotas {
                     }                      }
                 }                  }
             }              }
             if (ref($domconfig{'quotas'}{'authorquota'}) eq 'HASH') {  
                 foreach my $key (keys(%{$domconfig{'quotas'}{'authorquota'}})) {  
                     if (exists($confhash{'authorquota'}{$key})) {  
                         if ($confhash{'authorquota'}{$key} ne $domconfig{'quotas'}{'authorquota'}{$key}) {  
                             $changes{'authorquota'}{$key} = 1;  
                         }  
                     } else {  
                         $confhash{'authorquota'}{$key} = $domconfig{'quotas'}{'authorquota'}{$key};  
                     }  
                 }  
             }  
         }          }
         if (ref($confhash{'defaultquota'}) eq 'HASH') {          if (ref($confhash{'defaultquota'}) eq 'HASH') {
             foreach my $key (keys(%{$confhash{'defaultquota'}})) {              foreach my $key (keys(%{$confhash{'defaultquota'}})) {
Line 5989  sub modify_quotas { Line 5359  sub modify_quotas {
                 }                  }
             }              }
         }          }
         if (ref($confhash{'authorquota'}) eq 'HASH') {  
             foreach my $key (keys(%{$confhash{'authorquota'}})) {  
                 if (ref($domconfig{'quotas'}) eq 'HASH') {  
                     if (ref($domconfig{'quotas'}{'authorquota'}) eq 'HASH') {  
                         if (!exists($domconfig{'quotas'}{'authorquota'}{$key})) {  
                             $changes{'authorquota'}{$key} = 1;  
                         }  
                     } else {  
                         $changes{'authorquota'}{$key} = 1;  
                     }  
                 } else {  
                     $changes{'authorquota'}{$key} = 1;  
                 }  
             }  
         }  
     }      }
   
     if ($context eq 'requestauthor') {      foreach my $key (keys(%confhash)) {
         $domdefaults{'requestauthor'} = \%confhash;          $domdefaults{$key} = $confhash{$key};
     } else {  
         foreach my $key (keys(%confhash)) {  
             $domdefaults{$key} = $confhash{$key};  
         }  
     }      }
      
     my %quotahash = (      my %quotahash = (
                       $action => { %confhash }                        $action => { %confhash }
                     );                      );
Line 6023  sub modify_quotas { Line 5374  sub modify_quotas {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
             if (ref($lastactref) eq 'HASH') {  
                 $lastactref->{'domdefaults'} = 1;  
             }  
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             unless (($context eq 'requestcourses') ||              unless ($context eq 'requestcourses') {
                     ($context eq 'requestauthor')) {  
                 if (ref($changes{'defaultquota'}) eq 'HASH') {                  if (ref($changes{'defaultquota'}) eq 'HASH') {
                     $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';                      $resulttext .= '<li>'.&mt('Portfolio default quotas').'<ul>';
                     foreach my $type (@{$types},'default') {                      foreach my $type (@{$types},'default') {
Line 6042  sub modify_quotas { Line 5390  sub modify_quotas {
                     }                      }
                     $resulttext .= '</ul></li>';                      $resulttext .= '</ul></li>';
                 }                  }
                 if (ref($changes{'authorquota'}) eq 'HASH') {  
                     $resulttext .= '<li>'.&mt('Authoring space default quotas').'<ul>';  
                     foreach my $type (@{$types},'default') {  
                         if (defined($changes{'authorquota'}{$type})) {  
                             my $typetitle = $usertypes->{$type};  
                             if ($type eq 'default') {  
                                 $typetitle = $othertitle;  
                             }  
                             $resulttext .= '<li>'.&mt('[_1] set to [_2] Mb',$typetitle,$confhash{'authorquota'}{$type}).'</li>';  
                         }  
                     }  
                     $resulttext .= '</ul></li>';  
                 }  
             }              }
             my %newenv;              my %newenv;
             foreach my $item (@usertools) {              foreach my $item (@usertools) {
                 my (%haschgs,%inconf);                  if (ref($changes{$item}) eq 'HASH') {
                 if ($context eq 'requestauthor') {  
                     %haschgs = %changes;  
                     %inconf = %confhash;  
                 } else {  
                     if (ref($changes{$item}) eq 'HASH') {  
                         %haschgs = %{$changes{$item}};  
                     }  
                     if (ref($confhash{$item}) eq 'HASH') {  
                         %inconf = %{$confhash{$item}};  
                     }  
                 }  
                 if (keys(%haschgs) > 0) {  
                     my $newacc =                       my $newacc = 
                         &Apache::lonnet::usertools_access($env{'user.name'},                          &Apache::lonnet::usertools_access($env{'user.name'},
                                                           $env{'user.domain'},                                                            $env{'user.domain'},
                                                           $item,'reload',$context);                                                            $item,'reload',$context);
                     if (($context eq 'requestcourses') ||                      if ($context eq 'requestcourses') {
                         ($context eq 'requestauthor')) {  
                         if ($env{'environment.canrequest.'.$item} ne $newacc) {                          if ($env{'environment.canrequest.'.$item} ne $newacc) {
                             $newenv{'environment.canrequest.'.$item} = $newacc;                              $newenv{'environment.canrequest.'.$item} = $newacc;
                         }                          }
Line 6085  sub modify_quotas { Line 5407  sub modify_quotas {
                             $newenv{'environment.availabletools.'.$item} = $newacc;                              $newenv{'environment.availabletools.'.$item} = $newacc;
                         }                          }
                     }                      }
                     unless ($context eq 'requestauthor') {                      $resulttext .= '<li>'.$titles{$item}.'<ul>';
                         $resulttext .= '<li>'.$titles{$item}.'<ul>';  
                     }  
                     foreach my $type (@{$types},'default','_LC_adv') {                      foreach my $type (@{$types},'default','_LC_adv') {
                         if ($haschgs{$type}) {                          if ($changes{$item}{$type}) {
                             my $typetitle = $usertypes->{$type};                              my $typetitle = $usertypes->{$type};
                             if ($type eq 'default') {                              if ($type eq 'default') {
                                 $typetitle = $othertitle;                                  $typetitle = $othertitle;
                             } elsif ($type eq '_LC_adv') {                              } elsif ($type eq '_LC_adv') {
                                 $typetitle = 'LON-CAPA Advanced Users';                                   $typetitle = 'LON-CAPA Advanced Users'; 
                             }                              }
                             if ($inconf{$type}) {                              if ($confhash{$item}{$type}) {
                                 if ($context eq 'requestcourses') {                                  if ($context eq 'requestcourses') {
                                     my $cond;                                      my $cond;
                                     if ($inconf{$type} =~ /^autolimit=(\d*)$/) {                                      if ($confhash{$item}{$type} =~ /^autolimit=(\d*)$/) {
                                         if ($1 eq '') {                                          if ($1 eq '') {
                                             $cond = &mt('(Automatic processing of any request).');                                              $cond = &mt('(Automatic processing of any request).');
                                         } else {                                          } else {
                                             $cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1);                                              $cond = &mt('(Automatic processing of requests up to limit of [quant,_1,request] per user).',$1);
                                         }                                          }
                                     } else {                                       } else { 
                                         $cond = $conditions{$inconf{$type}};                                          $cond = $conditions{$confhash{$item}{$type}};
                                     }                                      }
                                     $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';                                      $resulttext .= '<li>'.&mt('Set to be available to [_1].',$typetitle).' '.$cond.'</li>';
                                 } elsif ($context eq 'requestauthor') {  
                                     $resulttext .= '<li>'.&mt('Set to "[_1]" for "[_2]".',  
                                                              $titles{$inconf{$type}},$typetitle);  
   
                                 } else {                                  } else {
                                     $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';                                      $resulttext .= '<li>'.&mt('Set to be available to [_1]',$typetitle).'</li>';
                                 }                                  }
                             } else {                              } else {
                                 if ($type eq '_LC_adv') {                                  if ($type eq '_LC_adv') {
                                     if ($inconf{$type} eq '0') {                                      if ($confhash{$item}{$type} eq '0') {
                                         $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';                                          $resulttext .= '<li>'.&mt('Set to be unavailable to [_1]',$typetitle).'</li>';
                                     } else {                                       } else { 
                                         $resulttext .= '<li>'.&mt('No override set for [_1]',$typetitle).'</li>';                                          $resulttext .= '<li>'.&mt('No override set for [_1]',$typetitle).'</li>';
Line 6129  sub modify_quotas { Line 5445  sub modify_quotas {
                             }                              }
                         }                          }
                     }                      }
                     unless ($context eq 'requestauthor') {                      $resulttext .= '</ul></li>';
                         $resulttext .= '</ul></li>';  
                     }  
                 }                  }
             }              }
             if (($action eq 'requestcourses') || ($action eq 'requestauthor')) {              if ($action eq 'requestcourses') {
                 if (ref($changes{'notify'}) eq 'HASH') {                  if (ref($changes{'notify'}) eq 'HASH') {
                     if ($changes{'notify'}{'approval'}) {                      if ($changes{'notify'}{'approval'}) {
                         if (ref($confhash{'notify'}) eq 'HASH') {                          if (ref($confhash{'notify'}) eq 'HASH') {
                             if ($confhash{'notify'}{'approval'}) {                              if ($confhash{'notify'}{'approval'}) {
                                 $resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>';                                  $resulttext .= '<li>'.&mt('Notification of requests requiring approval will be sent to: ').$confhash{'notify'}{'approval'}.'</li>';
                             } else {                              } else {
                                 $resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of requests requiring approval.').'</li>';                                  $resulttext .= '<li>'.&mt('No Domain Coordinators will receive notification of course requests requiring approval.').'</li>';
                             }                              }
                         }                          }
                     }                      }
Line 6154  sub modify_quotas { Line 5468  sub modify_quotas {
         } else {          } else {
             if ($context eq 'requestcourses') {              if ($context eq 'requestcourses') {
                 $resulttext = &mt('No changes made to rights to request creation of courses.');                  $resulttext = &mt('No changes made to rights to request creation of courses.');
             } elsif ($context eq 'requestauthor') {  
                 $resulttext = &mt('No changes made to rights to request author space.');  
             } else {              } else {
                 $resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas');                  $resulttext = &mt('No changes made to availability of personal information pages, blogs, portfolios or default quotas');
             }              }
Line 6168  sub modify_quotas { Line 5480  sub modify_quotas {
 }  }
   
 sub modify_autoenroll {  sub modify_autoenroll {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%changes);      my ($resulttext,%changes);
     my %currautoenroll;      my %currautoenroll;
     if (ref($domconfig{'autoenroll'}) eq 'HASH') {      if (ref($domconfig{'autoenroll'}) eq 'HASH') {
Line 6236  sub modify_autoenroll { Line 5548  sub modify_autoenroll {
             if ($changes{'coowners'}) {              if ($changes{'coowners'}) {
                 $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';                  $resulttext .= '<li>'.&mt("$title{'coowners'} set to $offon[$env{'form.autoassign_coowners'}]").'</li>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                 if (ref($lastactref) eq 'HASH') {  
                     $lastactref->{'domainconfig'} = 1;  
                 }  
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6489  sub modify_autocreate { Line 5798  sub modify_autocreate {
             foreach my $item (@types) {              foreach my $item (@types) {
                 if ($changes{$item}) {                  if ($changes{$item}) {
                     my $newtxt = $offon[$newvals{$item}];                      my $newtxt = $offon[$newvals{$item}];
                     $resulttext .= '<li>'.                      $resulttext .= '<li>'.&mt("$title{$item} set to [_1]$newtxt [_2]",'<b>','</b>').'</li>';
                                    &mt("$title{$item} set to [_1]$newtxt [_2]",  
                                        '<b>','</b>').  
                                    '</li>';  
                 }                  }
             }              }
             if ($changes{'xmldc'}) {              if ($changes{'xmldc'}) {
                 my ($dcname,$dcdom) = split(':',$newvals{'xmldc'});                  my ($dcname,$dcdom) = split(':',$newvals{'xmldc'});
                 my $newtxt = &Apache::loncommon::plainname($dcname,$dcdom);                  my $newtxt = &Apache::loncommon::plainname($dcname,$dcdom);
                 $resulttext .= '<li>'.&mt("$title{'xmldc'} set to [_1]",'<b>'.$newtxt.'</b>').'</li>';                   $resulttext .= '<li>'.&mt("$title{'xmldc'} set to [_1]$newtxt [_2]",'<b>','</b>').'</li>'; 
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6644  sub modify_directorysrch { Line 5950  sub modify_directorysrch {
                         } else {                          } else {
                             $chgtext =~ s/\; $//;                              $chgtext =~ s/\; $//;
                         }                          }
                         $resulttext .=                          $resulttext .= '<li>'.&mt("Users from domain '<span class=\"LC_cusr_emph\">[_1]</span>' permitted to search the institutional directory set to: [_2]",$dom,$chgtext).'</li>';
                             '<li>'.  
                             &mt("Users from domain '[_1]' permitted to search the institutional directory set to: [_2]",  
                                 '<span class="LC_cusr_emph">'.$dom.'</span>',$chgtext).  
                             '</li>';  
                     }                      }
                 }                  }
             }              }
Line 6676  sub modify_directorysrch { Line 5978  sub modify_directorysrch {
                     }                      }
                 }                  }
                 $chgtext =~ s/\; $//;                  $chgtext =~ s/\; $//;
                 $resulttext .= '<li>'.&mt($title{'searchtypes'}.' set to: "[_1]"',$chgtext).'</li>';                  $resulttext .= '<li>'.&mt("$title{'searchtypes'} set to: \"[_1]\"",$chgtext).'</li>';
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
Line 6690  sub modify_directorysrch { Line 5992  sub modify_directorysrch {
 }  }
   
 sub modify_contacts {  sub modify_contacts {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);      my ($resulttext,%currsetting,%newsetting,%changes,%contacts_hash);
     if (ref($domconfig{'contacts'}) eq 'HASH') {      if (ref($domconfig{'contacts'}) eq 'HASH') {
         foreach my $key (keys(%{$domconfig{'contacts'}})) {          foreach my $key (keys(%{$domconfig{'contacts'}})) {
Line 6700  sub modify_contacts { Line 6002  sub modify_contacts {
     my (%others,%to,%bcc);      my (%others,%to,%bcc);
     my @contacts = ('supportemail','adminemail');      my @contacts = ('supportemail','adminemail');
     my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',      my @mailings = ('errormail','packagesmail','helpdeskmail','lonstatusmail',
                     'requestsmail','updatesmail','idconflictsmail');                      'requestsmail');
     my @toggles = ('reporterrors','reportupdates');  
     foreach my $type (@mailings) {      foreach my $type (@mailings) {
         @{$newsetting{$type}} =           @{$newsetting{$type}} = 
             &Apache::loncommon::get_env_multiple('form.'.$type);              &Apache::loncommon::get_env_multiple('form.'.$type);
Line 6723  sub modify_contacts { Line 6024  sub modify_contacts {
         $to{$item} = $env{'form.'.$item};          $to{$item} = $env{'form.'.$item};
         $contacts_hash{'contacts'}{$item} = $to{$item};          $contacts_hash{'contacts'}{$item} = $to{$item};
     }      }
     foreach my $item (@toggles) {  
         if ($env{'form.'.$item} =~ /^(0|1)$/) {  
             $contacts_hash{'contacts'}{$item} = $env{'form.'.$item};  
         }  
     }  
     if (keys(%currsetting) > 0) {      if (keys(%currsetting) > 0) {
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
             if ($to{$item} ne $currsetting{$item}) {              if ($to{$item} ne $currsetting{$item}) {
Line 6762  sub modify_contacts { Line 6058  sub modify_contacts {
         $default{'helpdeskmail'} = 'supportemail';          $default{'helpdeskmail'} = 'supportemail';
         $default{'lonstatusmail'} = 'adminemail';          $default{'lonstatusmail'} = 'adminemail';
         $default{'requestsmail'} = 'adminemail';          $default{'requestsmail'} = 'adminemail';
         $default{'updatesmail'} = 'adminemail';  
         foreach my $item (@contacts) {          foreach my $item (@contacts) {
            if ($to{$item} ne $default{$item}) {             if ($to{$item} ne $default{$item}) {
               $changes{$item} = 1;                $changes{$item} = 1;
            }             } 
         }          }
         foreach my $type (@mailings) {          foreach my $type (@mailings) {
             if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {              if ((@{$newsetting{$type}} != 1) || ($newsetting{$type}[0] ne $default{$type})) {
Line 6783  sub modify_contacts { Line 6078  sub modify_contacts {
             }              }
         }          }
     }      }
     foreach my $item (@toggles) {  
         if (($env{'form.'.$item} == 1) && ($currsetting{$item} == 0)) {  
             $changes{$item} = 1;  
         } elsif ((!$env{'form.'.$item}) &&  
                  (($currsetting{$item} eq '') || ($currsetting{$item} == 1))) {  
             $changes{$item} = 1;  
         }  
     }  
     my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%contacts_hash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             &Apache::loncommon::devalidate_domconfig_cache($dom);  
             if (ref($lastactref) eq 'HASH') {  
                 $lastactref->{'domainconfig'} = 1;  
             }  
             my ($titles,$short_titles)  = &contact_titles();              my ($titles,$short_titles)  = &contact_titles();
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (@contacts) {              foreach my $item (@contacts) {
Line 6829  sub modify_contacts { Line 6112  sub modify_contacts {
                     $resulttext .= '</li>';                      $resulttext .= '</li>';
                 }                  }
             }              }
             my @offon = ('off','on');  
             if ($changes{'reporterrors'}) {  
                 $resulttext .= '<li>'.  
                                &mt('E-mail error reports to [_1] set to "'.  
                                    $offon[$env{'form.reporterrors'}].'".',  
                                    &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                        &mt('LON-CAPA core group - MSU'),600,500)).  
                                '</li>';  
             }  
             if ($changes{'reportupdates'}) {  
                 $resulttext .= '<li>'.  
                                 &mt('E-mail record of completed LON-CAPA updates to [_1] set to "'.  
                                     $offon[$env{'form.reportupdates'}].'".',  
                                     &Apache::loncommon::modal_link('http://loncapa.org/core.html',  
                                         &mt('LON-CAPA core group - MSU'),600,500)).  
                                 '</li>';  
             }  
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
         } else {          } else {
             $resulttext = &mt('No changes made to contact information');              $resulttext = &mt('No changes made to contact information');
Line 6873  sub modify_usercreation { Line 6139  sub modify_usercreation {
     foreach my $item(@contexts) {      foreach my $item(@contexts) {
         if ($item eq 'selfcreate') {          if ($item eq 'selfcreate') {
             @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);              @{$cancreate{$item}} = &Apache::loncommon::get_env_multiple('form.can_createuser_'.$item);
             my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);              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 (ref($cancreate{$item}) eq 'ARRAY') {                   if (ref($cancreate{$item}) eq 'ARRAY') { 
                     if (grep(/^login$/,@{$cancreate{$item}})) {                      if (grep(/^login$/,@{$cancreate{$item}})) {
Line 6896  sub modify_usercreation { Line 6162  sub modify_usercreation {
         }          }
         push(@contexts,'statustocreate');          push(@contexts,'statustocreate');
     }      }
     &process_captcha('cancreate',\%changes,\%cancreate,\%curr_usercreation);  
     if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {      if (ref($curr_usercreation{'cancreate'}) eq 'HASH') {
         foreach my $item (@contexts) {          foreach my $item (@contexts) {
             if (($item eq 'selfcreate') || ($item eq 'statustocreate')) {              if (($item eq 'selfcreate') || ($item eq 'statustocreate')) {
Line 7079  sub modify_usercreation { Line 6344  sub modify_usercreation {
                 my %lt = &usercreation_types();                  my %lt = &usercreation_types();
                 foreach my $type (@{$changes{'cancreate'}}) {                  foreach my $type (@{$changes{'cancreate'}}) {
                     my $chgtext;                      my $chgtext;
                     unless (($type eq 'statustocreate') || ($type eq 'captcha') || ($type eq 'recaptchakeys')) {                      unless ($type eq 'statustocreate') {
                         $chgtext = $lt{$type}.', ';                          $chgtext = $lt{$type}.', ';
                     }                      }
                     if ($type eq 'selfcreate') {                      if ($type eq 'selfcreate') {
Line 7138  sub modify_usercreation { Line 6403  sub modify_usercreation {
                                 }                                  }
                             }                              }
                         }                          }
                     } elsif ($type eq 'captcha') {  
                         if ($cancreate{$type} eq 'notused') {  
                             $chgtext .= &mt('No CAPTCHA validation in use for self-creation screen.');  
                         } else {  
                             my %captchas = &captcha_phrases();  
                             if ($captchas{$cancreate{$type}}) {  
                                 $chgtext .= &mt("Validation for self-creation screen set to $captchas{$cancreate{$type}}.");  
                             } else {  
                                 $chgtext .= &mt('Validation for self-creation screen set to unknown type.');  
                             }  
                         }  
                     } elsif ($type eq 'recaptchakeys') {  
                         my ($privkey,$pubkey);  
                         if (ref($cancreate{$type}) eq 'HASH') {  
                             $pubkey = $cancreate{$type}{'public'};  
                             $privkey = $cancreate{$type}{'private'};  
                         }  
                         $chgtext .= &mt('ReCAPTCHA keys changes').'<ul>';  
                         if (!$pubkey) {  
                             $chgtext .= '<li>'.&mt('Public key deleted').'</li>';  
                         } else {  
                             $chgtext .= '<li>'.&mt('Public key set to [_1]',$pubkey).'</li>';  
                         }  
                         if (!$privkey) {  
                             $chgtext .= '<li>'.&mt('Private key deleted').'</li>';  
                         } else {  
                             $chgtext .= '<li>'.&mt('Private key set to [_1]',$pubkey).'</li>';  
                         }  
                         $chgtext .= '</ul>';  
                     } else {                      } else {
                         if ($cancreate{$type} eq 'none') {                          if ($cancreate{$type} eq 'none') {
                             $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');                              $chgtext .= &mt('creation of new users is not permitted, except by a Domain Coordinator.');
Line 7266  sub modify_usercreation { Line 6502  sub modify_usercreation {
     return $resulttext;      return $resulttext;
 }  }
   
 sub process_captcha {  
     my ($container,$changes,$newsettings,$current) = @_;  
     return unless ((ref($changes) eq 'HASH') && (ref($newsettings) eq 'HASH') || (ref($current) eq 'HASH'));  
     $newsettings->{'captcha'} = $env{'form.'.$container.'_captcha'};  
     unless ($newsettings->{'captcha'} eq 'recaptcha' || $newsettings->{'captcha'} eq 'notused') {  
         $newsettings->{'captcha'} = 'original';  
     }  
     if ($current->{'captcha'} ne $newsettings->{'captcha'}) {  
         if ($container eq 'cancreate') {  
             if (ref($changes->{'cancreate'}) eq 'ARRAY') {  
                 push(@{$changes->{'cancreate'}},'captcha');  
             } elsif (!defined($changes->{'cancreate'})) {  
                 $changes->{'cancreate'} = ['captcha'];  
             }  
         } else {  
             $changes->{'captcha'} = 1;  
         }  
     }  
     my ($newpub,$newpriv,$currpub,$currpriv);  
     if ($newsettings->{'captcha'} eq 'recaptcha') {  
         $newpub = $env{'form.'.$container.'_recaptchapub'};  
         $newpriv = $env{'form.'.$container.'_recaptchapriv'};  
         $newpub =~ s/\W//g;  
         $newpriv =~ s/\W//g;  
         $newsettings->{'recaptchakeys'} = {  
                                              public  => $newpub,  
                                              private => $newpriv,  
                                           };  
     }  
     if (ref($current->{'recaptchakeys'}) eq 'HASH') {  
         $currpub = $current->{'recaptchakeys'}{'public'};  
         $currpriv = $current->{'recaptchakeys'}{'private'};  
         unless ($newsettings->{'captcha'} eq 'recaptcha') {  
             $newsettings->{'recaptchakeys'} = {  
                                                  public  => '',  
                                                  private => '',  
                                               }  
         }  
     }  
     if (($newpub ne $currpub) || ($newpriv ne $currpriv)) {  
         if ($container eq 'cancreate') {  
             if (ref($changes->{'cancreate'}) eq 'ARRAY') {  
                 push(@{$changes->{'cancreate'}},'recaptchakeys');  
             } elsif (!defined($changes->{'cancreate'})) {  
                 $changes->{'cancreate'} = ['recaptchakeys'];  
             }  
         } else {  
             $changes->{'recaptchakeys'} = 1;  
         }  
     }  
     return;  
 }  
   
 sub modify_usermodification {  sub modify_usermodification {
     my ($dom,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,%curr_usermodification,%changes);      my ($resulttext,%curr_usermodification,%changes);
Line 7440  sub modify_usermodification { Line 6623  sub modify_usermodification {
 }  }
   
 sub modify_defaults {  sub modify_defaults {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,$r) = @_;
     my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);      my ($resulttext,$mailmsgtxt,%newvalues,%changes,@errors);
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');      my @items = ('auth_def','auth_arg_def','lang_def','timezone_def','datelocale_def','portal_def');
     my @authtypes = ('internal','krb4','krb5','localauth');      my @authtypes = ('internal','krb4','krb5','localauth');
     foreach my $item (@items) {      foreach my $item (@items) {
Line 7502  sub modify_defaults { Line 6685  sub modify_defaults {
     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>';
             my $version = &Apache::lonnet::get_server_loncaparev($dom);              my $version = $r->dir_config('lonVersion');
             my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";              my $mailmsgtext = "Changes made to domain settings in a LON-CAPA installation - domain: $dom (running version: $version) - dns_domain.tab needs to be updated with the following changes, to support legacy 2.4, 2.5 and 2.6 versions of LON-CAPA.\n\n";
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
                 my $value = $env{'form.'.$item};                  my $value = $env{'form.'.$item};
Line 7525  sub modify_defaults { Line 6708  sub modify_defaults {
             $mailmsgtext .= "\n";              $mailmsgtext .= "\n";
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
             if (ref($lastactref) eq 'HASH') {  
                 $lastactref->{'domdefaults'} = 1;  
             }  
             if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {              if ($changes{'auth_def'} || $changes{'auth_arg_def'} || $changes{'lang_def'} || $changes{'datelocale_def'}) {
                 my $notify = 1;                  my $sysmail = $r->dir_config('lonSysEMail');
                 if (ref($domconfig{'contacts'}) eq 'HASH') {                  &Apache::lonmsg::sendemail($sysmail,"LON-CAPA Domain Settings Change - $dom",$mailmsgtext);
                     if ($domconfig{'contacts'}{'reportupdates'} == 0) {  
                         $notify = 0;  
                     }  
                 }  
                 if ($notify) {  
                     &Apache::lonmsg::sendemail('installrecord@loncapa.org',  
                                                "LON-CAPA Domain Settings Change - $dom",  
                                                $mailmsgtext);  
                 }  
             }              }
         } else {          } else {
             $resulttext = &mt('No changes made to default authentication/language/timezone settings');              $resulttext = &mt('No changes made to default authentication/language/timezone settings');
Line 7559  sub modify_defaults { Line 6730  sub modify_defaults {
 }  }
   
 sub modify_scantron {  sub modify_scantron {
     my ($r,$dom,$confname,$lastactref,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,%confhash,%changes,$errors);      my ($resulttext,%confhash,%changes,$errors);
     my $custom = 'custom.tab';      my $custom = 'custom.tab';
     my $default = 'default.tab';      my $default = 'default.tab';
Line 7620  sub modify_scantron { Line 6791  sub modify_scantron {
                 }                  }
                 $resulttext .= '</ul>';                  $resulttext .= '</ul>';
                 &Apache::loncommon::devalidate_domconfig_cache($dom);                  &Apache::loncommon::devalidate_domconfig_cache($dom);
                 if (ref($lastactref) eq 'HASH') {  
                     $lastactref->{'domainconfig'} = 1;  
                 }  
             } else {              } else {
                 $resulttext = &mt('No changes made to bubblesheet format file');                  $resulttext = &mt('No changes made to bubblesheet format file');
             }              }
Line 7990  sub modify_serverstatuses { Line 7158  sub modify_serverstatuses {
   
 sub modify_helpsettings {  sub modify_helpsettings {
     my ($r,$dom,$confname,%domconfig) = @_;      my ($r,$dom,$confname,%domconfig) = @_;
     my ($resulttext,$errors,%changes,%helphash);    my ($resulttext,$errors,%changes,%helphash);
     my %defaultchecked = ('submitbugs' => 'on');   
     my @offon = ('off','on');    my $customhelpfile  = $env{'form.loginhelpurl.filename'};
       my $defaulthelpfile = 'defaulthelp.html';
     my $servadm = $r->dir_config('lonAdmEMail');
       my ($configuserok,$author_ok,$switchserver) = 
           &config_check($dom,$confname,$servadm);
    
     my %defaultchecked = ('submitbugs' => 'on');
     my @offon = ('off','on');
       my %title = ( submitbugs     => 'Display link for users to submit a bug', 
        loginhelpurl  => 'Unauthenticated login help page set to custom file');
        
     my @toggles = ('submitbugs');      my @toggles = ('submitbugs');
   
       $helphash{'helpsettings'} = {};
       
       if (ref($domconfig{'helpsettings'}) ne 'HASH') {
           if ($domconfig{'helpsettings'} eq '') {
               $domconfig{'helpsettings'} = {};
           }
       }
       
     if (ref($domconfig{'helpsettings'}) eq 'HASH') {      if (ref($domconfig{'helpsettings'}) eq 'HASH') {
      
         foreach my $item (@toggles) {          foreach my $item (@toggles) {
             if ($defaultchecked{$item} eq 'on') {          
                 if ($domconfig{'helpsettings'}{$item} eq '') {   if ($defaultchecked{$item} eq 'on') { 
                     if ($env{'form.'.$item} eq '0') {   if (($domconfig{'helpsettings'}{$item} eq '') &&
                         $changes{$item} = 1;   ($env{'form.'.$item} eq '0')) {
                     }   $changes{$item} = 1;
                 } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {   } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
                     $changes{$item} = 1;   $changes{$item} = 1;
                 }   }
             } elsif ($defaultchecked{$item} eq 'off') {   } elsif ($defaultchecked{$item} eq 'off') {
                 if ($domconfig{'helpsettings'}{$item} eq '') {   if (($domconfig{'helpsettings'}{$item} eq '') &&
                     if ($env{'form.'.$item} eq '1') {   ($env{'form.'.$item} eq '1')) {
                         $changes{$item} = 1;   $changes{$item} = 1;
                     }   } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {
                 } elsif ($domconfig{'helpsettings'}{$item} ne $env{'form.'.$item}) {   $changes{$item} = 1;
                     $changes{$item} = 1;   }
                 }   }
             }   $helphash{'helpsettings'}{$item} = $env{'form.'.$item};
             if (($env{'form.'.$item} eq '0') || ($env{'form.'.$item} eq '1')) {   }
                 $helphash{'helpsettings'}{$item} = $env{'form.'.$item};  
    if ($customhelpfile ne '') {
    my $error;
    if ($configuserok eq 'ok') {
    if ($switchserver) {
    $error = &mt("Upload of custom help file is not permitted to this server: [_1]",$switchserver);
    } else {
    if ($author_ok eq 'ok') {
    my ($result,$loginhelpurl) =
    &publishlogo($r,'upload','loginhelpurl',$dom,
    $confname,'help','','',$customhelpfile);
    if ($result eq 'ok') {
    $helphash{'helpsettings'}{'loginhelpurl'} = $loginhelpurl;
    $changes{'loginhelpurl'} = 1;
    } else {
    $error = &mt("Upload of [_1] failed because an error occurred publishing the file in RES space. Error was: [_2].",$customhelpfile,$result);
    }
    } else {
    $error = &mt("Upload of [_1] failed because an author role could not be assigned to a Domain Configuration user ([_2]) in domain: [_3].  Error was: [_4].",$customhelpfile,$confname,$dom,$author_ok);
    }
    }
    } else {
    $error = &mt("Upload of [_1] failed because a Domain Configuration user ([_2]) could not be created in domain: [_3].  Error was: [_4].",$customhelpfile,$confname,$dom,$configuserok);
    }
    if ($error) {
    &Apache::lonnet::logthis($error);
    $errors .= '<li><span class="LC_error">'.$error.'</span></li>';
    }
    }
   
           if ($domconfig{'helpsettings'}{'loginhelpurl'} ne '') {
               if ($env{'form.loginhelpurl_del'}) {
                   $helphash{'helpsettings'}{'loginhelpurl'} = '';
                   $changes{'loginhelpurl'} = 1;
             }              }
         }          }
     }      }
       
       
     my $putresult;      my $putresult;
       
     if (keys(%changes) > 0) {      if (keys(%changes) > 0) {
         $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);      $putresult = &Apache::lonnet::put_dom('configuration',\%helphash,$dom);
         if ($putresult eq 'ok') {      } else {
             $resulttext = &mt('Changes made:').'<ul>';      $putresult = 'ok';
             foreach my $item (sort(keys(%changes))) {      }
                 if ($item eq 'submitbugs') {                                               
                     $resulttext .= '<li>'.&mt('Display link to: [_1] set to "'.$offon[$env{'form.'.$item}].'".',      if ($putresult eq 'ok') {
                                               &Apache::loncommon::modal_link('http://bugs.loncapa.org',          if (keys(%changes) > 0) {
                                               &mt('LON-CAPA bug tracker'),600,500)).'</li>';   $resulttext = &mt('Changes made:').'<ul>';
                 }   foreach my $item (sort(keys(%changes))) {
             }   if ($item eq 'submitbugs') {
             $resulttext .= '</ul>';   $resulttext .= '<li>'.&mt("$title{$item} set to $offon[$env{'form.'.$item}]").'</li>';
         } else {   }
             $resulttext = &mt('No changes made to help settings');   if ($item eq 'loginhelpurl') {
             $errors .= '<li><span class="LC_error">'.   if ($helphash{'helpsettings'}{'loginhelpurl'} eq '') {
                        &mt('An error occurred storing the settings: [_1]',                          $resulttext .= '<li>'.&mt('[_1] help file removed; [_2] file will be used for the unathorized help page in this domain.',$customhelpfile,$defaulthelpfile).'</li>';
                            $putresult).'</span></li>';                      } else {
         }                          $resulttext .= '<li>'.&mt("$title{$item} [_1]",$customhelpfile).'</li>';
                       }
    }
    }
    $resulttext .= '</ul>';
    } else {
    $resulttext = &mt('No changes made to help settings');
    }
       } else {
           $resulttext = '<span class="LC_error">'.
       &mt('An error occurred: [_1]',$putresult).'</span>';
     }      }
     if ($errors) {      if ($errors) {
         $resulttext .= '<br />'.&mt('The following errors occurred: ').'<ul>'.          $resulttext .= &mt('The following errors occurred: ').'<ul>'.
                        $errors.'</ul>';                         $errors.'</ul>';
     }      }
     return $resulttext;      return $resulttext;
 }  }
   
 sub modify_coursedefaults {  sub modify_coursedefaults {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my ($resulttext,$errors,%changes,%defaultshash);      my ($resulttext,$errors,%changes,%defaultshash);
     my %defaultchecked = ('canuse_pdfforms' => 'off');      my %defaultchecked = ('canuse_pdfforms' => 'off');
       my @offon = ('off','on');
     my @toggles = ('canuse_pdfforms');      my @toggles = ('canuse_pdfforms');
     my @numbers = ('anonsurvey_threshold','uploadquota_official','uploadquota_unofficial',  
                    'uploadquota_community');  
     my @types = ('official','unofficial','community');  
     my %staticdefaults = (  
                            anonsurvey_threshold => 10,  
                            uploadquota          => 500,  
                          );  
   
     $defaultshash{'coursedefaults'} = {};      $defaultshash{'coursedefaults'} = {};
   
Line 8072  sub modify_coursedefaults { Line 7300  sub modify_coursedefaults {
                 if (($domconfig{'coursedefaults'}{$item} eq '') &&                  if (($domconfig{'coursedefaults'}{$item} eq '') &&
                     ($env{'form.'.$item} eq '0')) {                      ($env{'form.'.$item} eq '0')) {
                     $changes{$item} = 1;                      $changes{$item} = 1;
                 } elsif ($domconfig{'coursedefaults'}{$item} ne $env{'form.'.$item}) {                  } elsif ($domconfig{'coursdefaults'}{$item} ne $env{'form.'.$item}) {
                     $changes{$item} = 1;                      $changes{$item} = 1;
                 }                  }
             } elsif ($defaultchecked{$item} eq 'off') {              } elsif ($defaultchecked{$item} eq 'off') {
Line 8085  sub modify_coursedefaults { Line 7313  sub modify_coursedefaults {
             }              }
             $defaultshash{'coursedefaults'}{$item} = $env{'form.'.$item};              $defaultshash{'coursedefaults'}{$item} = $env{'form.'.$item};
         }          }
         foreach my $item (@numbers) {          my $currdefresponder = $domconfig{'coursedefaults'}{'anonsurvey_threshold'};
             my ($currdef,$newdef);          my $newdefresponder = $env{'form.anonsurvey_threshold'};
             $newdef = $env{'form.'.$item};          $newdefresponder =~ s/\D//g;
             if ($item eq 'anonsurvey_threshold') {          if ($newdefresponder eq '' || $newdefresponder < 1) {
                 $currdef = $domconfig{'coursedefaults'}{$item};              $newdefresponder = 1;
                 $newdef =~ s/\D//g;          }
                 if ($newdef eq '' || $newdef < 1) {          $defaultshash{'coursedefaults'}{'anonsurvey_threshold'} = $newdefresponder;
                     $newdef = 1;          if ($currdefresponder ne $newdefresponder) {
                 }              unless ($currdefresponder eq '' && $newdefresponder == 10) {
                 $defaultshash{'coursedefaults'}{$item} = $newdef;                  $changes{'anonsurvey_threshold'} = 1;
             } else {  
                 my ($type) = ($item =~ /^\Quploadquota_\E(\w+)$/);  
                 if (ref($domconfig{'coursedefaults'}{'uploadquota'}) eq 'HASH') {  
                     $currdef = $domconfig{'coursedefaults'}{'uploadquota'}{$type};  
                 }  
                 $newdef =~ s/[^\w.\-]//g;  
                 $defaultshash{'coursedefaults'}{'uploadquota'}{$type} = $newdef;  
             }  
             if ($currdef ne $newdef) {  
                 my $staticdef;  
                 if ($item eq 'anonsurvey_threshold') {  
                     unless (($currdef eq '') && ($newdef == $staticdefaults{$item})) {  
                         $changes{$item} = 1;  
                     }  
                 } else {  
                     unless (($currdef eq '') && ($newdef == $staticdefaults{'uploadquota'})) {  
                         $changes{'uploadquota'} = 1;  
                     }  
                 }  
             }  
         }  
         my $officialcreds = $env{'form.official_credits'};  
         $officialcreds =~ s/^[^\d\.]//g;  
         my $unofficialcreds = $env{'form.unofficial_credits'};  
         $unofficialcreds =~ s/^[^\d\.]//g;  
         if (ref($domconfig{'coursedefaults'}{'coursecredits'} ne 'HASH') &&  
                 ($env{'form.coursecredits'} eq '1')) {  
                 $changes{'coursecredits'} = 1;  
         } else {  
             if (($domconfig{'coursedefaults'}{'coursecredits'}{'official'} ne $officialcreds)  ||  
                 ($domconfig{'coursedefaults'}{'coursecredits'}{'unofficial'} ne $unofficialcreds)) {  
                 $changes{'coursecredits'} = 1;  
             }              }
         }          }
         $defaultshash{'coursedefaults'}{'coursecredits'} = {  
             official   => $officialcreds,  
             unofficial => $unofficialcreds,  
         }  
     }      }
     my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,      my $putresult = &Apache::lonnet::put_dom('configuration',\%defaultshash,
                                              $dom);                                               $dom);
     if ($putresult eq 'ok') {      if ($putresult eq 'ok') {
         if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);              if ($changes{'canuse_pdfforms'}) {
             if (($changes{'canuse_pdfforms'}) || ($changes{'coursecredits'}) || ($changes{'uploadquota'})) {                  my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
                 if ($changes{'canuse_pdfforms'}) {                  $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};
                     $domdefaults{'canuse_pdfforms'}=$defaultshash{'coursedefaults'}{'canuse_pdfforms'};  
                 }  
                 if ($changes{'coursecredits'}) {  
                     if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {  
                         $domdefaults{'officialcredits'} =  
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'official'};  
                         $domdefaults{'unofficialcredits'} =  
                             $defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'};  
                     }  
                 }  
                 if ($changes{'uploadquota'}) {  
                     if (ref($defaultshash{'coursedefaults'}{'uploadquota'}) eq 'HASH') {  
                         foreach my $type (@types) {  
                             $domdefaults{$type.'quota'}=$defaultshash{'coursedefaults'}{'uploadquota'}{$type};  
                         }  
                     }  
                 }  
                 my $cachetime = 24*60*60;                  my $cachetime = 24*60*60;
                 &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);                  &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
                 if (ref($lastactref) eq 'HASH') {  
                     $lastactref->{'domdefaults'} = 1;  
                 }  
             }              }
             $resulttext = &mt('Changes made:').'<ul>';              $resulttext = &mt('Changes made:').'<ul>';
             foreach my $item (sort(keys(%changes))) {              foreach my $item (sort(keys(%changes))) {
Line 8173  sub modify_coursedefaults { Line 7345  sub modify_coursedefaults {
                         $resulttext .= '<li>'.&mt('Course/Community users can create/upload PDF forms set to "off"').'</li>';                          $resulttext .= '<li>'.&mt('Course/Community users can create/upload PDF forms set to "off"').'</li>';
                     }                      }
                 } elsif ($item eq 'anonsurvey_threshold') {                  } elsif ($item eq 'anonsurvey_threshold') {
                     $resulttext .= '<li>'.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'</li>';                          $resulttext .= '<li>'.&mt('Responder count required for display of anonymous survey submissions set to [_1].',$defaultshash{'coursedefaults'}{'anonsurvey_threshold'}).'</li>';
                 } elsif ($item eq 'uploadquota') {  
                     if (ref($defaultshash{'coursedefaults'}{'uploadquota'}) eq 'HASH') {  
                         $resulttext .= '<li>'.&mt('Default quota for content uploaded to a course/community via Course Editor set as follows:').'<ul>'.  
                                        '<li>'.&mt('Official courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'official'}.'</b>').'</li>'.  
                                        '<li>'.&mt('Unofficial courses: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'unofficial'}.'</b>').'</li>'.  
                                        '<li>'.&mt('Communities: [_1] MB','<b>'.$defaultshash{'coursedefaults'}{'uploadquota'}{'community'}.'</b>').'</li>'.  
                                        '</ul>'.  
                                        '</li>';  
                     } else {  
                         $resulttext .= '<li>'.&mt('Default quota for content uploaded via Course Editor remains default: [_1] MB',$staticdefaults{'uploadquota'}).'</li>';  
                     }  
                 } elsif ($item eq 'coursecredits') {  
                     if (ref($defaultshash{'coursedefaults'}{'coursecredits'}) eq 'HASH') {  
                         if (($domdefaults{'officialcredits'} eq '') &&  
                             ($domdefaults{'unofficialcredits'} eq '')) {  
                             $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';  
                         } else {  
                             $resulttext .= '<li>'.&mt('Student credits can be set per course by a Domain Coordinator, with the following defaults applying:').'<ul>'.  
                                            '<li>'.&mt('Official courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'official'}).'</li>'.  
                                            '<li>'.&mt('Unofficial courses: [_1]',$defaultshash{'coursedefaults'}{'coursecredits'}{'unofficial'}).'</li>'.  
                                            '</ul>'.  
                                            '</li>';  
                         }  
                     } else {  
                         $resulttext .= '<li>'.&mt('Student credits not in use for courses in this domain').'</li>';  
                     }  
                 }                  }
             }              }
             $resulttext .= '</ul>';              $resulttext .= '</ul>';
Line 8214  sub modify_coursedefaults { Line 7360  sub modify_coursedefaults {
 }  }
   
 sub modify_usersessions {  sub modify_usersessions {
     my ($dom,$lastactref,%domconfig) = @_;      my ($dom,%domconfig) = @_;
     my @hostingtypes = ('version','excludedomain','includedomain');      my @hostingtypes = ('version','excludedomain','includedomain');
     my @offloadtypes = ('primary','default');      my @offloadtypes = ('primary','default');
     my %types = (      my %types = (
Line 8231  sub modify_usersessions { Line 7377  sub modify_usersessions {
     foreach my $prefix (@prefixes) {      foreach my $prefix (@prefixes) {
         $defaultshash{'usersessions'}{$prefix} = {};          $defaultshash{'usersessions'}{$prefix} = {};
     }      }
     my %domdefaults = &Apache::lonnet::get_domain_defaults($dom,1);      my %domdefaults = &Apache::lonnet::get_domain_defaults($dom);
     my $resulttext;      my $resulttext;
     my %iphost = &Apache::lonnet::get_iphost();      my %iphost = &Apache::lonnet::get_iphost();
     foreach my $prefix (@prefixes) {      foreach my $prefix (@prefixes) {
Line 8407  sub modify_usersessions { Line 7553  sub modify_usersessions {
             }              }
             my $cachetime = 24*60*60;              my $cachetime = 24*60*60;
             &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);              &Apache::lonnet::do_cache_new('domdefaults',$dom,\%domdefaults,$cachetime);
             if (ref($lastactref) eq 'HASH') {  
                 $lastactref->{'domdefaults'} = 1;  
             }  
             if (keys(%changes) > 0) {              if (keys(%changes) > 0) {
                 my %lt = &usersession_titles();                  my %lt = &usersession_titles();
                 $resulttext = &mt('Changes made:').'<ul>';                  $resulttext = &mt('Changes made:').'<ul>';
Line 8421  sub modify_usersessions { Line 7564  sub modify_usersessions {
                                 foreach my $lonhost (sort(keys(%{$changes{$prefix}}))) {                                  foreach my $lonhost (sort(keys(%{$changes{$prefix}}))) {
                                     $resulttext .= '<li><b>'.$lonhost.'</b> ';                                      $resulttext .= '<li><b>'.$lonhost.'</b> ';
                                     my $lonhostdom = &Apache::lonnet::host_domain($lonhost);                                      my $lonhostdom = &Apache::lonnet::host_domain($lonhost);
                                     my $cachekey = &escape('spares').':'.&escape($lonhostdom);                                      &Apache::lonnet::remote_devalidate_cache($lonhost,'spares',$lonhostdom);
                                     &Apache::lonnet::remote_devalidate_cache($lonhost,[$cachekey]);  
                                     if (ref($changes{$prefix}{$lonhost}) eq 'HASH') {                                      if (ref($changes{$prefix}{$lonhost}) eq 'HASH') {
                                         foreach my $type (@{$types{$prefix}}) {                                          foreach my $type (@{$types{$prefix}}) {
                                             if ($changes{$prefix}{$lonhost}{$type}) {                                              if ($changes{$prefix}{$lonhost}{$type}) {
Line 8496  sub modify_loadbalancing { Line 7638  sub modify_loadbalancing {
     my @sparestypes = ('primary','default');      my @sparestypes = ('primary','default');
     my %typetitles = &sparestype_titles();      my %typetitles = &sparestype_titles();
     my $resulttext;      my $resulttext;
     my (%currbalancer,%currtargets,%currrules,%existing);      if (keys(%servers) > 1) {
     if (ref($domconfig{'loadbalancing'}) eq 'HASH') {          my ($currbalancer,$currtargets,$currrules);
         %existing = %{$domconfig{'loadbalancing'}};          if (ref($domconfig{'loadbalancing'}) eq 'HASH') {
     }              $currbalancer = $domconfig{'loadbalancing'}{'lonhost'};
     &get_loadbalancers_config(\%servers,\%existing,\%currbalancer,              $currtargets = $domconfig{'loadbalancing'}{'targets'};
                               \%currtargets,\%currrules);              $currrules = $domconfig{'loadbalancing'}{'rules'};
     my ($saveloadbalancing,%defaultshash,%changes);          } else {
     my ($alltypes,$othertypes,$titles) =              ($currbalancer,$currtargets) = 
         &loadbalancing_titles($dom,$intdom,$usertypes,$types);                  &Apache::lonnet::get_lonbalancer_config(\%servers);
     my %ruletitles = &offloadtype_text();          }
     my @deletions = &Apache::loncommon::get_env_multiple('form.loadbalancing_delete');          my ($saveloadbalancing,%defaultshash,%changes);
     for (my $i=0; $i<$env{'form.loadbalancing_total'}; $i++) {          my ($alltypes,$othertypes,$titles) =
         my $balancer = $env{'form.loadbalancing_lonhost_'.$i};              &loadbalancing_titles($dom,$intdom,$usertypes,$types);
         if ($balancer eq '') {          my %ruletitles = &offloadtype_text();
             next;          my $balancer = $env{'form.loadbalancing_lonhost'};
         }          if (!$servers{$balancer}) {
         if (!exists($servers{$balancer})) {              undef($balancer);
             if (exists($currbalancer{$balancer})) {          }
                 push(@{$changes{'delete'}},$balancer);          if ($currbalancer ne $balancer) {
               $changes{'lonhost'} = 1;
           }
           $defaultshash{'loadbalancing'}{'lonhost'} = $balancer;
           if ($balancer ne '') {
               unless (ref($domconfig{'loadbalancing'}) eq 'HASH') {
                   $saveloadbalancing = 1;
             }              }
             next;              foreach my $sparetype (@sparestypes) {
         }                  my @targets = &Apache::loncommon::get_env_multiple('form.loadbalancing_target_'.$sparetype);
         if ((@deletions > 0) && (grep(/^\Q$i\E$/,@deletions))) {                  my @offloadto;
             push(@{$changes{'delete'}},$balancer);                  foreach my $target (@targets) {
             next;                      if (($servers{$target}) && ($target ne $balancer)) {
         }                          if ($sparetype eq 'default') {
         if (!exists($currbalancer{$balancer})) {                              if (ref($defaultshash{'loadbalancing'}{'targets'}{'primary'}) eq 'ARRAY') {
             push(@{$changes{'add'}},$balancer);                                  next if (grep(/^\Q$target\E$/,@{$defaultshash{'loadbalancing'}{'targets'}{'primary'}}));
         }                              }
         $defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'} = [];                          }
         $defaultshash{'loadbalancing'}{$balancer}{'targets'}{'default'} = [];                          unless(grep(/^\Q$target\E$/,@offloadto)) {
         $defaultshash{'loadbalancing'}{$balancer}{'rules'} = {};                              push(@offloadto,$target);
         unless (ref($domconfig{'loadbalancing'}) eq 'HASH') {  
             $saveloadbalancing = 1;  
         }  
         foreach my $sparetype (@sparestypes) {  
             my @targets = &Apache::loncommon::get_env_multiple('form.loadbalancing_target_'.$i.'_'.$sparetype);  
             my @offloadto;  
             foreach my $target (@targets) {  
                 if (($servers{$target}) && ($target ne $balancer)) {  
                     if ($sparetype eq 'default') {  
                         if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'}) eq 'ARRAY') {  
                             next if (grep(/^\Q$target\E$/,@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{'primary'}}));  
                         }                          }
                     }                      }
                     unless(grep(/^\Q$target\E$/,@offloadto)) {                      $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = \@offloadto;
                         push(@offloadto,$target);  
                     }  
                 }                  }
                 $defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype} = \@offloadto;              }
           } else {
               foreach my $sparetype (@sparestypes) {
                   $defaultshash{'loadbalancing'}{'targets'}{$sparetype} = [];
             }              }
         }          }
         if (ref($currtargets{$balancer}) eq 'HASH') {          if (ref($currtargets) eq 'HASH') {
             foreach my $sparetype (@sparestypes) {              foreach my $sparetype (@sparestypes) {
                 if (ref($currtargets{$balancer}{$sparetype}) eq 'ARRAY') {                  if (ref($currtargets->{$sparetype}) eq 'ARRAY') {
                     my @targetdiffs = &Apache::loncommon::compare_arrays($currtargets{$balancer}{$sparetype},$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype});                      my @targetdiffs = &Apache::loncommon::compare_arrays($currtargets->{$sparetype},$defaultshash{'loadbalancing'}{'targets'}{$sparetype});
                     if (@targetdiffs > 0) {                      if (@targetdiffs > 0) {
                         $changes{'curr'}{$balancer}{'targets'} = 1;                          $changes{'targets'} = 1;
                     }                      }
                 } elsif (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {                  } elsif (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
                     if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {                      if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
                         $changes{'curr'}{$balancer}{'targets'} = 1;                          $changes{'targets'} = 1;
                     }                      }
                 }                  }
             }              }
         } else {          } else {
             if (ref($defaultshash{'loadbalancing'}{$balancer}) eq 'HASH') {              foreach my $sparetype (@sparestypes) {
                 foreach my $sparetype (@sparestypes) {                  if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
                     if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {                      if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
                         if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {                          $changes{'targets'} = 1;  
                             $changes{'curr'}{$balancer}{'targets'} = 1;  
                         }  
                     }                      }
                 }                  }
             }              }  
         }          }
         my $ishomedom;          my $ishomedom;
         if (&Apache::lonnet::host_domain($balancer) eq $dom) {          if ($balancer ne '') {
             $ishomedom = 1;              if (&Apache::lonnet::host_domain($balancer) eq $dom) {
                   $ishomedom = 1;
               }
         }          }
         if (ref($alltypes) eq 'ARRAY') {          if (ref($alltypes) eq 'ARRAY') {
             foreach my $type (@{$alltypes}) {              foreach my $type (@{$alltypes}) {
                 my $rule;                  my $rule;
                 unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) &&                  if ($balancer ne '') {
                       unless ((($type eq '_LC_external') || ($type eq '_LC_internetdom')) && 
                          (!$ishomedom)) {                           (!$ishomedom)) {
                     $rule = $env{'form.loadbalancing_rules_'.$i.'_'.$type};                          $rule = $env{'form.loadbalancing_rules_'.$type};
                 }                      }
                 if ($rule eq 'specific') {                      if ($rule eq 'specific') {
                     $rule = $env{'form.loadbalancing_singleserver_'.$i.'_'.$type};                          $rule = $env{'form.loadbalancing_singleserver_'.$type};
                       }
                 }                  }
                 $defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type} = $rule;                  $defaultshash{'loadbalancing'}{'rules'}{$type} = $rule;
                 if (ref($currrules{$balancer}) eq 'HASH') {                  if (ref($currrules) eq 'HASH') {
                     if ($rule ne $currrules{$balancer}{$type}) {                      if ($rule ne $currrules->{$type}) {
                         $changes{'curr'}{$balancer}{'rules'}{$type} = 1;                          $changes{'rules'}{$type} = 1;
                     }                      }
                 } elsif ($rule ne '') {                  } elsif ($rule ne '') {
                     $changes{'curr'}{$balancer}{'rules'}{$type} = 1;                      $changes{'rules'}{$type} = 1;
                 }                  }
             }              }
         }          }
     }          my $nochgmsg = &mt('No changes made to Load Balancer settings.');
     my $nochgmsg = &mt('No changes made to Load Balancer settings.');          if ((keys(%changes) > 0) || ($saveloadbalancing)) {
     if ((keys(%changes) > 0) || ($saveloadbalancing)) {              my $putresult = &Apache::lonnet::put_dom('configuration',
         unless (ref($defaultshash{'loadbalancing'}) eq 'HASH') {                                                       \%defaultshash,$dom);
             $defaultshash{'loadbalancing'} = {};              if ($putresult eq 'ok') {
         }                  if (keys(%changes) > 0) {
         my $putresult = &Apache::lonnet::put_dom('configuration',                      if ($changes{'lonhost'}) {
                                                  \%defaultshash,$dom);                          if ($currbalancer ne '') {
         if ($putresult eq 'ok') {                              &Apache::lonnet::remote_devalidate_cache($currbalancer,'loadbalancing',$dom);
             if (keys(%changes) > 0) {                          }
                 if (ref($changes{'delete'}) eq 'ARRAY') {                          if ($balancer eq '') {
                     foreach my $balancer (sort(@{$changes{'delete'}})) {                              $resulttext .= '<li>'.&mt('Load Balancing with dedicated server discontinued').'</li>'; 
                         $resulttext .= '<li>'.&mt('Load Balancing discontinued for: [_1]',$balancer).'</li>';                          } else {
                         my $cachekey = &escape('loadbalancing').':'.&escape($dom);                              &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
                         &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]);                              $resulttext .= '<li>'.&mt('Dedicated Load Balancer server set to [_1]',$balancer);
                     }                          }
                 }                      } else {
                 if (ref($changes{'add'}) eq 'ARRAY') {                          &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
                     foreach my $balancer (sort(@{$changes{'add'}})) {                      }
                         $resulttext .= '<li>'.&mt('Load Balancing enabled for: [_1]',$balancer);                      if (($changes{'targets'}) && ($balancer ne '')) {
                     }                          my %offloadstr;
                 }                          foreach my $sparetype (@sparestypes) {
                 if (ref($changes{'curr'}) eq 'HASH') {                              if (ref($defaultshash{'loadbalancing'}{'targets'}{$sparetype}) eq 'ARRAY') {
                     foreach my $balancer (sort(keys(%{$changes{'curr'}}))) {                                  if (@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}} > 0) {
                         if (ref($changes{'curr'}{$balancer}) eq 'HASH') {                                      $offloadstr{$sparetype} = join(', ',@{$defaultshash{'loadbalancing'}{'targets'}{$sparetype}});
                             if ($changes{'curr'}{$balancer}{'targets'}) {  
                                 my %offloadstr;  
                                 foreach my $sparetype (@sparestypes) {  
                                     if (ref($defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}) eq 'ARRAY') {  
                                         if (@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}} > 0) {  
                                             $offloadstr{$sparetype} = join(', ',@{$defaultshash{'loadbalancing'}{$balancer}{'targets'}{$sparetype}});  
                                         }  
                                     }  
                                 }                                  }
                                 if (keys(%offloadstr) == 0) {                              }
                                     $resulttext .= '<li>'.&mt("Servers to which Load Balance server offloads set to 'None', by default").'</li>';                          }
                           if (keys(%offloadstr) == 0) {
                               $resulttext .= '<li>'.&mt("Servers to which Load Balance server offloads set to 'None', by default").'</li>';
                           } else {
                               my $showoffload;
                               foreach my $sparetype (@sparestypes) {
                                   $showoffload .= '<i>'.$typetitles{$sparetype}.'</i>:&nbsp;';
                                   if (defined($offloadstr{$sparetype})) {
                                       $showoffload .= $offloadstr{$sparetype};
                                 } else {                                  } else {
                                     my $showoffload;                                      $showoffload .= &mt('None');
                                     foreach my $sparetype (@sparestypes) {  
                                         $showoffload .= '<i>'.$typetitles{$sparetype}.'</i>:&nbsp;';  
                                         if (defined($offloadstr{$sparetype})) {  
                                             $showoffload .= $offloadstr{$sparetype};  
                                         } else {  
                                             $showoffload .= &mt('None');  
                                         }  
                                         $showoffload .= ('&nbsp;'x3);  
                                     }  
                                     $resulttext .= '<li>'.&mt('By default, Load Balancer: [_1] set to offload to - [_2]',$balancer,$showoffload).'</li>';  
                                 }                                  }
                                   $showoffload .= ('&nbsp;'x3);
                             }                              }
                               $resulttext .= '<li>'.&mt('By default, Load Balancer server set to offload to: [_1]',$showoffload).'</li>';
                         }                          }
                         if (ref($changes{'curr'}{$balancer}{'rules'}) eq 'HASH') {                      }
                             if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {                      if ((ref($changes{'rules'}) eq 'HASH') && ($balancer ne '')) {
                                 foreach my $type (@{$alltypes}) {                          if ((ref($alltypes) eq 'ARRAY') && (ref($titles) eq 'HASH')) {
                                     if ($changes{'curr'}{$balancer}{'rules'}{$type}) {                              foreach my $type (@{$alltypes}) {
                                         my $rule = $defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type};                                  if ($changes{'rules'}{$type}) {
                                         my $balancetext;                                      my $rule = $defaultshash{'loadbalancing'}{'rules'}{$type};
                                         if ($rule eq '') {                                      my $balancetext;
                                             $balancetext =  $ruletitles{'default'};                                      if ($rule eq '') {
                                         } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer') ||                                          $balancetext =  $ruletitles{'default'};
                                                  ($rule eq 'balancer') || ($rule eq 'offloadedto')) {                                      } elsif (($rule eq 'homeserver') || ($rule eq 'externalbalancer')) {
                                             $balancetext =  $ruletitles{$rule};                                          $balancetext =  $ruletitles{$rule};
                                         } else {                                      } else {
                                             $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{$balancer}{'rules'}{$type});                                          $balancetext = &mt('offload to [_1]',$defaultshash{'loadbalancing'}{'rules'}{$type});
                                         }  
                                         $resulttext .= '<li>'.&mt('Load Balancer: [_1] -- balancing for [_2] set to - "[_3]"',$balancer,$titles->{$type},$balancetext).'</li>';  
                                     }                                      }
                                       $resulttext .= '<li>'.&mt('Load Balancing for [_1] set to: [_2]',$titles->{$type},$balancetext).'</li>';     
                                 }                                  }
                             }                              }
                         }                          }
                         my $cachekey = &scape('loadbalancing').':'.&escape($dom);  
                         &Apache::lonnet::remote_devalidate_cache($balancer,[$cachekey]);  
                     }                      }
                 }                      if ($resulttext ne '') {
                 if ($resulttext ne '') {                          $resulttext = &mt('Changes made:').'<ul>'.$resulttext.'</ul>';
                     $resulttext = &mt('Changes made:').'<ul>'.$resulttext.'</ul>';                      } else {
                           $resulttext = $nochgmsg;
                       }
                 } else {                  } else {
                     $resulttext = $nochgmsg;                      $resulttext = $nochgmsg;
                       if ($balancer ne '') {
                           &Apache::lonnet::remote_devalidate_cache($balancer,'loadbalancing',$dom);
                       }
                 }                  }
             } else {              } else {
                 $resulttext = $nochgmsg;                  $resulttext = '<span class="LC_error">'.
                                 &mt('An error occurred: [_1]',$putresult).'</span>';
             }              }
         } else {          } else {
             $resulttext = '<span class="LC_error">'.              $resulttext = $nochgmsg;
                           &mt('An error occurred: [_1]',$putresult).'</span>';  
         }          }
     } else {      } else {
         $resulttext = $nochgmsg;          $resulttext =  &mt('Load Balancing unavailable as this domain only has one server.');
     }      }
     return $resulttext;      return $resulttext;
 }  }
Line 8722  sub recurse_cat_deletes { Line 7856  sub recurse_cat_deletes {
                 delete($coursecategories->{$subitem});                  delete($coursecategories->{$subitem});
                 $deletions->{$subitem} = 1;                  $deletions->{$subitem} = 1;
                 &recurse_cat_deletes($subitem,$coursecategories,$deletions);                  &recurse_cat_deletes($subitem,$coursecategories,$deletions);
             }              }  
         }          }
     }      }
     return;      return;
Line 8730  sub recurse_cat_deletes { Line 7864  sub recurse_cat_deletes {
   
 sub get_active_dcs {  sub get_active_dcs {
     my ($dom) = @_;      my ($dom) = @_;
     my $now = time;      my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc']);
     my %dompersonnel = &Apache::lonnet::get_domain_roles($dom,['dc'],$now,$now);  
     my %domcoords;      my %domcoords;
     my $numdcs = 0;      my $numdcs = 0;
       my $now = time;
     foreach my $server (keys(%dompersonnel)) {      foreach my $server (keys(%dompersonnel)) {
         foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {          foreach my $user (sort(keys(%{$dompersonnel{$server}}))) {
             my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);              my ($trole,$uname,$udom,$runame,$rudom,$rsec) = split(/:/,$user);
             $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user};              my ($end,$start) = split(':',$dompersonnel{$server}{$user});
               if (($end eq '') || ($end == 0) || ($end > $now)) {
                   if ($start <= $now) {
                       $domcoords{$uname.':'.$udom} = $dompersonnel{$server}{$user};
                   }
               }
         }          }
     }      }
     return %domcoords;      return %domcoords;
 }  }
   
 sub active_dc_picker {  sub active_dc_picker {
     my ($dom,$numinrow,$inputtype,$name,%currhash) = @_;      my ($dom,$curr_dc) = @_;
     my %domcoords = &get_active_dcs($dom);       my %domcoords = &get_active_dcs($dom); 
     my @domcoord = keys(%domcoords);      my @dcs = sort(keys(%domcoords));
     if (keys(%currhash)) {      my $numdcs = scalar(@dcs); 
         foreach my $dc (keys(%currhash)) {      my $datatable;
             unless (exists($domcoords{$dc})) {      my $numinrow = 2;
                 push(@domcoord,$dc);  
             }  
         }  
     }  
     @domcoord = sort(@domcoord);  
     my $numdcs = scalar(@domcoord);  
     my $rows = 0;  
     my $table;  
     if ($numdcs > 1) {      if ($numdcs > 1) {
         $table = '<table>';          $datatable = '<table>';
         for (my $i=0; $i<@domcoord; $i++) {          for (my $i=0; $i<@dcs; $i++) {
             my $rem = $i%($numinrow);              my $rem = $i%($numinrow);
             if ($rem == 0) {              if ($rem == 0) {
                 if ($i > 0) {                  if ($i > 0) {
                     $table .= '</tr>';                      $datatable .= '</tr>';
                 }                  }
                 $table .= '<tr>';                  $datatable .= '<tr>';
                 $rows ++;  
             }              }
             my $check = '';              my $check = ' ';
             if ($inputtype eq 'radio') {              if ($curr_dc eq '') {
                 if (keys(%currhash) == 0) {                  if (!$i) { 
                     if (!$i) {                      $check = ' checked="checked" ';
                         $check = ' checked="checked"';  
                     }  
                 } elsif (exists($currhash{$domcoord[$i]})) {  
                     $check = ' checked="checked"';  
                 }  
             } else {  
                 if (exists($currhash{$domcoord[$i]})) {  
                     $check = ' checked="checked"';  
                 }                  }
               } elsif ($dcs[$i] eq $curr_dc) {
                   $check = ' checked="checked" ';
             }              }
             if ($i == @domcoord - 1) {              if ($i == @dcs - 1) {
                 my $colsleft = $numinrow - $rem;                  my $colsleft = $numinrow - $rem;
                 if ($colsleft > 1) {                  if ($colsleft > 1) {
                     $table .= '<td class="LC_left_item" colspan="'.$colsleft.'">';                      $datatable .= '<td colspan="'.$colsleft.'">';
                 } else {                  } else {
                     $table .= '<td class="LC_left_item">';                      $datatable .= '<td>';
                 }                  }
             } else {              } else {
                 $table .= '<td class="LC_left_item">';                  $datatable .= '<td>';
             }  
             my ($dcname,$dcdom) = split(':',$domcoord[$i]);  
             my $user = &Apache::loncommon::plainname($dcname,$dcdom);  
             $table .= '<span class="LC_nobreak"><label>'.  
                       '<input type="'.$inputtype.'" name="'.$name.'"'.  
                       ' value="'.$domcoord[$i].'"'.$check.' />'.$user;  
             if ($user ne $dcname.':'.$dcdom) {  
                 $table .=  ' ('.$dcname.':'.$dcdom.')'.  
                            '</label></span></td>';  
             }  
         }  
         $table .= '</tr></table>';  
     } elsif ($numdcs == 1) {  
         if ($inputtype eq 'radio') {  
             $table .= '<input type="hidden" name="'.$name.'" value="'.$domcoord[0].'" />';  
         } else {  
             my $check;  
             if (exists($currhash{$domcoord[0]})) {  
                 $check = ' checked="checked"';  
             }              }
             $table .= '<input type="checkbox" name="'.$name.'" '.              my ($dcname,$dcdom) = split(':',$dcs[$i]);
                       'value="'.$domcoord[0].'"'.$check.' />';              $datatable .= '<span class="LC_nobreak"><label>'.
             $rows ++;                            '<input type="radio" name="autocreate_xmldc"'.
                             ' value="'.$dcs[$i].'"'.$check.'/>'.
                             &Apache::loncommon::plainname($dcname,$dcdom).
                             '</label></span></td>';
         }          }
           $datatable .= '</tr></table>';
       } elsif (@dcs) {
           $datatable .= '<input type="hidden" name="autocreate_dc" value="'.
                         $dcs[0].'" />';
     }      }
     return ($numdcs,$table,$rows);      return ($numdcs,$datatable);
 }  }
   
 sub usersession_titles {  sub usersession_titles {
Line 8861  sub count_servers { Line 7973  sub count_servers {
 }  }
   
 sub lonbalance_targets_js {  sub lonbalance_targets_js {
     my ($dom,$types,$servers,$settings) = @_;      my ($dom,$types,$servers) = @_;
     my $select = &mt('Select');      my $select = &mt('Select');
     my ($alltargets,$allishome,$allinsttypes,@alltypes);      my ($alltargets,$allishome,$allinsttypes,@alltypes);
     if (ref($servers) eq 'HASH') {      if (ref($servers) eq 'HASH') {
Line 8883  sub lonbalance_targets_js { Line 7995  sub lonbalance_targets_js {
     }      }
     push(@alltypes,'default','_LC_adv','_LC_author','_LC_internetdom','_LC_external');      push(@alltypes,'default','_LC_adv','_LC_author','_LC_internetdom','_LC_external');
     $allinsttypes = join("','",@alltypes);      $allinsttypes = join("','",@alltypes);
     my (%currbalancer,%currtargets,%currrules,%existing);  
     if (ref($settings) eq 'HASH') {  
         %existing = %{$settings};  
     }  
     &get_loadbalancers_config($servers,\%existing,\%currbalancer,  
                               \%currtargets,\%currrules);  
     my $balancers = join("','",sort(keys(%currbalancer)));  
     return <<"END";      return <<"END";
   
 <script type="text/javascript">  <script type="text/javascript">
 // <![CDATA[  // <![CDATA[
   
 currBalancers = new Array('$balancers');  function toggleTargets() {
       var balancer = document.display.loadbalancing_lonhost.options[document.display.loadbalancing_lonhost.selectedIndex].value;
 function toggleTargets(balnum) {  
     var lonhostitem = document.getElementById('loadbalancing_lonhost_'+balnum);  
     var prevhostitem = document.getElementById('loadbalancing_prevlonhost_'+balnum);  
     var balancer = lonhostitem.options[lonhostitem.selectedIndex].value;  
     var prevbalancer = prevhostitem.value;  
     var baltotal = document.getElementById('loadbalancing_total').value;  
     prevhostitem.value = balancer;  
     if (prevbalancer != '') {  
         var prevIdx = currBalancers.indexOf(prevbalancer);  
         if (prevIdx != -1) {  
             currBalancers.splice(prevIdx,1);  
         }  
     }  
     if (balancer == '') {      if (balancer == '') {
         hideSpares(balnum);          hideSpares();
     } else {      } else {
         var currIdx = currBalancers.indexOf(balancer);  
         if (currIdx == -1) {  
             currBalancers.push(balancer);  
         }  
         var homedoms = new Array('$allishome');          var homedoms = new Array('$allishome');
         var ishomedom = homedoms[lonhostitem.selectedIndex];          var ishomedom = homedoms[document.display.loadbalancing_lonhost.selectedIndex];
         showSpares(balancer,ishomedom,balnum);          showSpares(balancer,ishomedom);
     }      }
     balancerChange(balnum,baltotal,'change',prevbalancer,balancer);  
     return;      return;
 }  }
   
 function showSpares(balancer,ishomedom,balnum) {  function showSpares(balancer,ishomedom) {
     var alltargets = new Array('$alltargets');      var alltargets = new Array('$alltargets');
     var insttypes = new Array('$allinsttypes');      var insttypes = new Array('$allinsttypes');
     var offloadtypes = new Array('primary','default');      var offloadtypes = new Array('primary','default');
   
     document.getElementById('loadbalancing_targets_'+balnum).style.display='block';      document.getElementById('loadbalancing_targets').style.display='block';
     document.getElementById('loadbalancing_disabled_'+balnum).style.display='none';      document.getElementById('loadbalancing_disabled').style.display='none';
     
     for (var i=0; i<offloadtypes.length; i++) {      for (var i=0; i<offloadtypes.length; i++) {
         var count = 0;          var count = 0;
         for (var j=0; j<alltargets.length; j++) {          for (var j=0; j<alltargets.length; j++) {
             if (alltargets[j] != balancer) {              if (alltargets[j] != balancer) {
                 var item = document.getElementById('loadbalancing_target_'+balnum+'_'+offloadtypes[i]+'_'+count);                  document.getElementById('loadbalancing_target_'+offloadtypes[i]+'_'+count).value = alltargets[j];
                 item.value = alltargets[j];                  document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+count).style.textAlign='left';
                 item.style.textAlign='left';                  document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+count).style.textFace='normal';
                 item.style.textFace='normal';                  document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+count).innerHTML = alltargets[j];
                 document.getElementById('loadbalancing_targettxt_'+balnum+'_'+offloadtypes[i]+'_'+count).innerHTML = alltargets[j];  
                 if (currBalancers.indexOf(alltargets[j]) == -1) {  
                     item.disabled = '';  
                 } else {  
                     item.disabled = 'disabled';  
                     item.checked = false;  
                 }  
                 count ++;                  count ++;
             }              }
         }          }
Line 8955  function showSpares(balancer,ishomedom,b Line 8035  function showSpares(balancer,ishomedom,b
     for (var k=0; k<insttypes.length; k++) {      for (var k=0; k<insttypes.length; k++) {
         if ((insttypes[k] == '_LC_external') || (insttypes[k] == '_LC_internetdom')) {          if ((insttypes[k] == '_LC_external') || (insttypes[k] == '_LC_internetdom')) {
             if (ishomedom == 1) {              if (ishomedom == 1) {
                 document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';                  document.getElementById('balanceruletitle_'+insttypes[k]).style.display='block';
                 document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='block';                  document.getElementById('balancerule_'+insttypes[k]).style.display='block';
             } else {              } else {
                 document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balanceruletitle_'+insttypes[k]).style.display='none';
                 document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';                  document.getElementById('balancerule_'+insttypes[k]).style.display='none';
   
             }              }
         } else {          } else {
             document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='block';              document.getElementById('balanceruletitle_'+insttypes[k]).style.display='block';
             document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='block';              document.getElementById('balancerule_'+insttypes[k]).style.display='block';
         }          }
         if ((insttypes[k] != '_LC_external') &&           if ((insttypes[k] != '_LC_external') && 
             ((insttypes[k] != '_LC_internetdom') ||              ((insttypes[k] != '_LC_internetdom') ||
              ((insttypes[k] == '_LC_internetdom') && (ishomedom == 1)))) {               ((insttypes[k] == '_LC_internetdom') && (ishomedom == 1)))) {
             var item = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]);              document.getElementById('loadbalancing_singleserver_'+insttypes[k]).options[0] = new Option("","",true,true);
             item.options.length = 0;  
             item.options[0] = new Option("","",true,true);  
             var idx = 0;  
             for (var m=0; m<alltargets.length; m++) {              for (var m=0; m<alltargets.length; m++) {
                 if ((currBalancers.indexOf(alltargets[m]) == -1) && (alltargets[m] != balancer)) {                  var idx = m+1;
                     idx ++;                  if (alltargets[m] != balancer) {
                     item.options[idx] = new Option(alltargets[m],alltargets[m],false,false);                      document.getElementById('loadbalancing_singleserver_'+insttypes[k]).options[idx] = new Option(alltargets[m],alltargets[m],false,false);
                 }                  }
             }              }
         }          }
Line 8983  function showSpares(balancer,ishomedom,b Line 8061  function showSpares(balancer,ishomedom,b
     return;      return;
 }  }
   
 function hideSpares(balnum) {  function hideSpares() {
     var alltargets = new Array('$alltargets');      var alltargets = new Array('$alltargets');
     var insttypes = new Array('$allinsttypes');      var insttypes = new Array('$allinsttypes');
     var offloadtypes = new Array('primary','default');      var offloadtypes = new Array('primary','default');
   
     document.getElementById('loadbalancing_targets_'+balnum).style.display='none';      document.getElementById('loadbalancing_targets').style.display='none';
     document.getElementById('loadbalancing_disabled_'+balnum).style.display='block';      document.getElementById('loadbalancing_disabled').style.display='block';
   
     var total = alltargets.length - 1;      var total = alltargets.length - 1;
     for (var i=0; i<offloadtypes; i++) {      for (var i=0; i<offloadtypes; i++) {
         for (var j=0; j<total; j++) {          for (var j=0; j<total; j++) {
            document.getElementById('loadbalancing_target_'+balnum+'_'+offloadtypes[i]+'_'+j).checked = false;             document.getElementById('loadbalancing_target_'+offloadtypes[i]+'_'+j).checked = false;
            document.getElementById('loadbalancing_target_'+balnum+'_'+offloadtypes[i]+'_'+j).value = '';             document.getElementById('loadbalancing_target_'+offloadtypes[i]+'_'+j).value = '';
            document.getElementById('loadbalancing_targettxt_'+balnum+'_'+offloadtypes[i]+'_'+j).innerHTML = '';             document.getElementById('loadbalancing_targettxt_'+offloadtypes[i]+'_'+j).innerHTML = '';
         }          }
     }      }
     for (var k=0; k<insttypes.length; k++) {      for (var k=0; k<insttypes.length; k++) {
         document.getElementById('balanceruletitle_'+balnum+'_'+insttypes[k]).style.display='none';          document.getElementById('balanceruletitle_'+insttypes[k]).style.display='none';
         document.getElementById('balancerule_'+balnum+'_'+insttypes[k]).style.display='none';          document.getElementById('balancerule_'+insttypes[k]).style.display='none';
         if (insttypes[k] != '_LC_external') {          if (insttypes[k] != '_LC_external') {
             document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]).length = 0;              document.getElementById('loadbalancing_singleserver_'+insttypes[k]).length = 0;
             document.getElementById('loadbalancing_singleserver_'+balnum+'_'+insttypes[k]).options[0] = new Option("","",true,true);              document.getElementById('loadbalancing_singleserver_'+insttypes[k]).options[0] = new Option("","",true,true);
         }          }
     }      }
     return;      return;
 }  }
   
 function checkOffloads(item,balnum,type) {  function checkOffloads(item,type) {
     var alltargets = new Array('$alltargets');      var alltargets = new Array('$alltargets');
     var offloadtypes = new Array('primary','default');      var offloadtypes = new Array('primary','default');
     if (item.checked) {      if (item.checked) {
Line 9022  function checkOffloads(item,balnum,type) Line 8100  function checkOffloads(item,balnum,type)
             other = offloadtypes[0];              other = offloadtypes[0];
         }          }
         for (var i=0; i<total; i++) {          for (var i=0; i<total; i++) {
             var server = document.getElementById('loadbalancing_target_'+balnum+'_'+other+'_'+i).value;              var server = document.getElementById('loadbalancing_target_'+other+'_'+i).value;
             if (server == item.value) {              if (server == item.value) {
                 if (document.getElementById('loadbalancing_target_'+balnum+'_'+other+'_'+i).checked) {                  if (document.getElementById('loadbalancing_target_'+other+'_'+i).checked) {
                     document.getElementById('loadbalancing_target_'+balnum+'_'+other+'_'+i).checked = false;                      document.getElementById('loadbalancing_target_'+other+'_'+i).checked = false;
                 }                  }
             }              }
         }          }
Line 9033  function checkOffloads(item,balnum,type) Line 8111  function checkOffloads(item,balnum,type)
     return;      return;
 }  }
   
 function singleServerToggle(balnum,type) {  function singleServerToggle(type) {
     var offloadtoSelIdx = document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).selectedIndex;      var offloadtoSelIdx = document.getElementById('loadbalancing_singleserver_'+type).selectedIndex;
     if (offloadtoSelIdx == 0) {      if (offloadtoSelIdx == 0) {
         document.getElementById('loadbalancing_rules_'+balnum+'_'+type+'_0').checked = true;          document.getElementById('loadbalancing_rules_'+type+'_0').checked = true;
         document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '';          document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '';
   
     } else {      } else {
         document.getElementById('loadbalancing_rules_'+balnum+'_'+type+'_2').checked = true;          document.getElementById('loadbalancing_rules_'+type+'_2').checked = true;
         document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '$select';          document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '$select';
     }      }
     return;      return;
 }  }
   
 function balanceruleChange(formname,balnum,type) {  function balanceruleChange(formname,type) {
     if (type == '_LC_external') {      if (type == '_LC_external') {
         return;          return; 
     }      }
     var typesRules = getIndicesByName(formname,'loadbalancing_rules_'+balnum+'_'+type);      var typesRules = getIndicesByName(formname,'loadbalancing_rules_'+type);
     for (var i=0; i<typesRules.length; i++) {      for (var i=0; i<typesRules.length; i++) {
         if (formname.elements[typesRules[i]].checked) {          if (formname.elements[typesRules[i]].checked) {
             if (formname.elements[typesRules[i]].value != 'specific') {              if (formname.elements[typesRules[i]].value != 'specific') {
                 document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).selectedIndex = 0;                  document.getElementById('loadbalancing_singleserver_'+type).selectedIndex = 0;
                 document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '';                  document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '';
             } else {              } else {
                 document.getElementById('loadbalancing_singleserver_'+balnum+'_'+type).options[0].text = '$select';                  document.getElementById('loadbalancing_singleserver_'+type).options[0].text = '$select';
             }  
         }  
     }  
     return;  
 }  
   
 function balancerDeleteChange(balnum) {  
     var hostitem = document.getElementById('loadbalancing_lonhost_'+balnum);  
     var baltotal = document.getElementById('loadbalancing_total').value;  
     var addtarget;  
     var removetarget;  
     var action = 'delete';  
     if (document.getElementById('loadbalancing_delete_'+balnum)) {  
         var lonhost = hostitem.value;  
         var currIdx = currBalancers.indexOf(lonhost);  
         if (document.getElementById('loadbalancing_delete_'+balnum).checked) {  
             if (currIdx != -1) {  
                 currBalancers.splice(currIdx,1);  
             }  
             addtarget = lonhost;  
         } else {  
             if (currIdx == -1) {  
                 currBalancers.push(lonhost);  
             }  
             removetarget = lonhost;  
             action = 'undelete';  
         }  
         balancerChange(balnum,baltotal,action,addtarget,removetarget);  
     }  
     return;  
 }  
   
 function balancerChange(balnum,baltotal,action,addtarget,removetarget) {  
     if (baltotal > 1) {  
         var offloadtypes = new Array('primary','default');  
         var alltargets = new Array('$alltargets');  
         var insttypes = new Array('$allinsttypes');  
         for (var i=0; i<baltotal; i++) {  
             if (i != balnum) {  
                 for (var j=0; j<offloadtypes.length; j++) {  
                     var total = alltargets.length - 1;  
                     for (var k=0; k<total; k++) {  
                         var serveritem = document.getElementById('loadbalancing_target_'+i+'_'+offloadtypes[j]+'_'+k);  
                         var server = serveritem.value;  
                         if ((action == 'delete') || (action == 'change' && addtarget != ''))  {  
                             if (server == addtarget) {  
                                 serveritem.disabled = '';  
                             }  
                         }  
                         if ((action == 'undelete') || (action == 'change' && removetarget != '')) {  
                             if (server == removetarget) {  
                                 serveritem.disabled = 'disabled';  
                                 serveritem.checked = false;  
                             }  
                         }  
                     }  
                 }  
                 for (var j=0; j<insttypes.length; j++) {  
                     if (insttypes[j] != '_LC_external') {  
                         if (document.getElementById('loadbalancing_singleserver_'+i+'_'+insttypes[j])) {  
                             var singleserver = document.getElementById('loadbalancing_singleserver_'+i+'_'+insttypes[j]);  
                             var currSel = singleserver.selectedIndex;  
                             var currVal = singleserver.options[currSel].value;  
                             if ((action == 'delete') || (action == 'change' && addtarget != '')) {  
                                 var numoptions = singleserver.options.length;  
                                 var needsnew = 1;  
                                 for (var k=0; k<numoptions; k++) {  
                                     if (singleserver.options[k] == addtarget) {  
                                         needsnew = 0;  
                                         break;  
                                     }  
                                 }  
                                 if (needsnew == 1) {  
                                     singleserver.options[numoptions] = new Option(addtarget,addtarget,false,false);  
                                 }  
                             }  
                             if ((action == 'undelete') || (action == 'change' && removetarget != '')) {  
                                 singleserver.options.length = 0;  
                                 if ((currVal) && (currVal != removetarget)) {  
                                     singleserver.options[0] = new Option("","",false,false);  
                                 } else {  
                                     singleserver.options[0] = new Option("","",true,true);  
                                 }  
                                 var idx = 0;  
                                 for (var m=0; m<alltargets.length; m++) {  
                                     if (currBalancers.indexOf(alltargets[m]) == -1) {  
                                         idx ++;  
                                         if (currVal == alltargets[m]) {  
                                             singleserver.options[idx] = new Option(alltargets[m],alltargets[m],true,true);  
                                         } else {  
                                             singleserver.options[idx] = new Option(alltargets[m],alltargets[m],false,false);  
                                         }  
                                     }  
                                 }  
                             }  
                         }  
                     }  
                 }  
             }              }
         }          }
     }      }
Line 9287  END Line 8267  END
   
 }  }
   
 sub recaptcha_js {  
     my %lt = &captcha_phrases();  
     return <<"END";  
   
 <script type="text/javascript">  
 // <![CDATA[  
   
 function updateCaptcha(caller,context) {  
     var privitem;  
     var pubitem;  
     var privtext;  
     var pubtext;  
     if (document.getElementById(context+'_recaptchapub')) {  
         pubitem = document.getElementById(context+'_recaptchapub');  
     } else {  
         return;  
     }  
     if (document.getElementById(context+'_recaptchapriv')) {  
         privitem = document.getElementById(context+'_recaptchapriv');  
     } else {  
         return;  
     }  
     if (document.getElementById(context+'_recaptchapubtxt')) {  
         pubtext = document.getElementById(context+'_recaptchapubtxt');  
     } else {  
         return;  
     }  
     if (document.getElementById(context+'_recaptchaprivtxt')) {  
         privtext = document.getElementById(context+'_recaptchaprivtxt');  
     } else {  
         return;  
     }  
     if (caller.checked) {  
         if (caller.value == 'recaptcha') {  
             pubitem.type = 'text';  
             privitem.type = 'text';  
             pubitem.size = '40';  
             privitem.size = '40';  
             pubtext.innerHTML = "$lt{'pub'}";  
             privtext.innerHTML = "$lt{'priv'}";  
         } else {  
             pubitem.type = 'hidden';  
             privitem.type = 'hidden';  
             pubtext.innerHTML = '';  
             privtext.innerHTML = '';  
         }  
     }  
     return;  
 }  
   
 // ]]>  
 </script>  
   
 END  
   
 }  
   
 sub credits_js {  
     return <<"END";  
   
 <script type="text/javascript">  
 // <![CDATA[  
   
 function toggleCredits(domForm) {  
     if (document.getElementById('credits')) {  
         creditsitem = document.getElementById('credits');  
         var creditsLength = domForm.coursecredits.length;  
         if (creditsLength) {  
             var currval;  
             for (var i=0; i<creditsLength; i++) {  
                 if (domForm.coursecredits[i].checked) {  
                    currval = domForm.coursecredits[i].value;  
                 }  
             }  
             if (currval == 1) {  
                 creditsitem.style.display = 'block';  
             } else {  
                 creditsitem.style.display = 'none';  
             }  
         }  
     }  
     return;  
 }  
   
 // ]]>  
 </script>  
   
 END  
   
 }  
   
 sub captcha_phrases {  
     return &Apache::lonlocal::texthash (  
                  priv => 'Private key',  
                  pub  => 'Public key',  
                  original  => 'original (CAPTCHA)',  
                  recaptcha => 'successor (ReCAPTCHA)',  
                  notused   => 'unused',  
     );  
 }  
   
 sub devalidate_remote_domconfs {  
     my ($dom,$cachekeys) = @_;  
     return unless (ref($cachekeys) eq 'HASH');  
     my %servers = &Apache::lonnet::internet_dom_servers($dom);  
     my %thismachine;  
     map { $thismachine{$_} = 1; } &Apache::lonnet::current_machine_ids();  
     my @posscached = ('domainconfig','domdefaults');  
     if (keys(%servers) > 1) {  
         foreach my $server (keys(%servers)) {  
             next if ($thismachine{$server});  
             my @cached;  
             foreach my $name (@posscached) {  
                 if ($cachekeys->{$name}) {  
                     push(@cached,&escape($name).':'.&escape($dom));  
                 }  
             }  
             if (@cached) {  
                 &Apache::lonnet::remote_devalidate_cache($server,\@cached);  
             }  
         }  
     }  
     return;  
 }  
   
 1;  1;

Removed from v.1.160.6.27  
changed lines
  Added in v.1.161


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