Diff for /loncom/interface/lonpreferences.pm between versions 1.99 and 1.225

version 1.99, 2007/04/17 18:28:44 version 1.225, 2018/04/27 20:14:16
Line 36  use strict; Line 36  use strict;
 use LONCAPA;  use LONCAPA;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::File;  use Apache::File;
 use Crypt::DES;  
 use DynaLoader; # for Crypt::DES version  
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonnet;  use Apache::lonnet;
   use LONCAPA::lonauthcgi();
 use LONCAPA();  use LONCAPA();
   
 #  
 # Write lonnet::passwd to do the call below.  
 # Use:  
 #   my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver);  
 #  
 ##################################################  
 #          password associated functions         #  
 ##################################################  
 sub des_keys {  
     # Make a new key for DES encryption.  
     # Each key has two parts which are returned separately.  
     # Please note:  Each key must be passed through the &hex function  
     # before it is output to the web browser.  The hex versions cannot  
     # be used to decrypt.  
     my @hexstr=('0','1','2','3','4','5','6','7',  
                 '8','9','a','b','c','d','e','f');  
     my $lkey='';  
     for (0..7) {  
         $lkey.=$hexstr[rand(15)];  
     }  
     my $ukey='';  
     for (0..7) {  
         $ukey.=$hexstr[rand(15)];  
     }  
     return ($lkey,$ukey);  
 }  
   
 sub des_decrypt {  
     my ($key,$cyphertext) = @_;  
     my $keybin=pack("H16",$key);  
     my $cypher;  
     if ($Crypt::DES::VERSION>=2.03) {  
         $cypher=new Crypt::DES $keybin;  
     } else {  
         $cypher=new DES $keybin;  
     }  
     my $plaintext=  
  $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,0,16))));  
     $plaintext.=  
  $cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,16,16))));  
     $plaintext=substr($plaintext,1,ord(substr($plaintext,0,1)) );  
     return $plaintext;  
 }  
   
 ################################################################  ################################################################
 #                       Handler subroutines                    #  #                       Handler subroutines                    #
 ################################################################  ################################################################
Line 98  sub des_decrypt { Line 53  sub des_decrypt {
   
 sub wysiwygchanger {  sub wysiwygchanger {
     my $r = shift;      my $r = shift;
       Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changewysiwyg',
                   text => 'Change WYSIWYG Preferences'});
       $r->print(Apache::loncommon::start_page('Content Display Settings'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Change WYSIWYG Preferences'));
   
     my %userenv = &Apache::lonnet::get      my %userenv = &Apache::lonnet::get
         ('environment',['wysiwygeditor']);          ('environment',['wysiwygeditor']);
     my $onselect='checked="checked"';      my $onselect='checked="checked"';
Line 108  sub wysiwygchanger { Line 69  sub wysiwygchanger {
     }      }
     my $switchoff=&mt('Disable WYSIWYG editor');      my $switchoff=&mt('Disable WYSIWYG editor');
     my $switchon=&mt('Enable WYSIWYG editor');      my $switchon=&mt('Enable WYSIWYG editor');
       my $warning='';
       if ($env{'user.adv'}) {
          $warning.='<p class="LC_warning">'.&mt("The WYSIWYG editor only supports simple HTML and is in many cases unsuited for advanced authoring. In a number of cases, it may destroy advanced authoring involving LaTeX and script function calls.")."</p>";
       }
     $r->print(<<ENDLSCREEN);      $r->print(<<ENDLSCREEN);
 <form name="prefs" action="/adm/preferences" method="post">  <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="set_wysiwyg" />  <input type="hidden" name="action" value="set_wysiwyg" />
   $warning
 <br />  <br />
 <label><input type="radio" name="wysiwyg" value="off" $onselect /> $switchoff</label><br />  <label><input type="radio" name="wysiwyg" value="off" $onselect /> $switchoff</label><br />
 <label><input type="radio" name="wysiwyg" value="on" $offselect /> $switchon</label>  <label><input type="radio" name="wysiwyg" value="on" $offselect /> $switchon</label>
 ENDLSCREEN  ENDLSCREEN
     $r->print('<br /><input type="submit" value="'.&mt('Change').'" />');      $r->print('<br /><input type="submit" value="'.&mt('Save').'" />');
 }  }
   
   
Line 123  sub verify_and_change_wysiwyg { Line 89  sub verify_and_change_wysiwyg {
     my $r = shift;      my $r = shift;
     my $newsetting=$env{'form.wysiwyg'};      my $newsetting=$env{'form.wysiwyg'};
     &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting});      &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting});
     &Apache::lonnet::appenv('environment.wysiwygeditor' => $newsetting);      &Apache::lonnet::appenv({'environment.wysiwygeditor' => $newsetting});
     $r->print('<p>'.&mt('Setting WYSIWYG editor to:').' '.&mt($newsetting).'</p>');      my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('WYSIWYG Editor').'</i>','<tt>'.&mt($newsetting).'</tt>'));
       $message=&Apache::loncommon::confirmwrapper($message);
       &print_main_menu($r,$message);
 }  }
   
 ################################################################  ################################################################
Line 132  sub verify_and_change_wysiwyg { Line 100  sub verify_and_change_wysiwyg {
 ################################################################  ################################################################
 sub languagechanger {  sub languagechanger {
     my $r = shift;      my $r = shift;
     my $user       = $env{'user.name'};      
     my $domain     = $env{'user.domain'};      Apache::lonhtmlcommon::add_breadcrumb(
     my %userenv = &Apache::lonnet::get      { href => '/adm/preferences?action=changelanguages',
         ('environment',['languages']);                  text => 'Change Language'});
       $r->print(Apache::loncommon::start_page('Content Display Settings'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Language')); 
       my %userenv = &Apache::lonnet::get('environment',['languages']);
     my $language=$userenv{'languages'};      my $language=$userenv{'languages'};
   
     my $pref=&mt('Preferred language');      $r->print(
     my %langchoices=('' => 'No language preference');          '<form name="prefs" action="/adm/preferences" method="post">'."\n".
     foreach (&Apache::loncommon::languageids()) {          '<input type="hidden" name="action" value="verify_and_change_languages" />'.
  if (&Apache::loncommon::supportedlanguagecode($_)) {          '<br /><span class="LC_nobreak">'.&mt('Preferred language').':&nbsp;'.
     $langchoices{&Apache::loncommon::supportedlanguagecode($_)}          &Apache::loncommon::select_language('language',$language,1).'</span>'."\n".
                = &Apache::loncommon::plainlanguagedescription($_);          '<br /><input type="submit" value="'.&mt('Save').'" /></form>'
  }      );
     }  
     my $selectionbox=&Apache::loncommon::select_form($language,'language',  
      %langchoices);  
     $r->print(<<ENDLSCREEN);  
 <form name="prefs" action="/adm/preferences" method="post">  
 <input type="hidden" name="action" value="verify_and_change_languages" />  
 <br />$pref: $selectionbox  
 ENDLSCREEN  
     $r->print('<br /><input type="submit" value="'.&mt('Change').'" />');  
 }  }
   
   
Line 167  sub verify_and_change_languages { Line 129  sub verify_and_change_languages {
     my $message='';      my $message='';
     if ($newlanguage) {      if ($newlanguage) {
         &Apache::lonnet::put('environment',{'languages' => $newlanguage});          &Apache::lonnet::put('environment',{'languages' => $newlanguage});
         &Apache::lonnet::appenv('environment.languages' => $newlanguage);          &Apache::lonnet::appenv({'environment.languages' => $newlanguage});
         $message='Set new preferred languages to '.$newlanguage;          $message=&Apache::lonhtmlcommon::confirm_success(
               &mt('Set [_1] to [_2]',
                   '<i>'.&mt('Preferred language').'</i>',
                   '<tt>"'.$newlanguage.'"</tt>.'))
              .'<br />'
              .&mt('The change will become active on the next page.');
     } else {      } else {
         &Apache::lonnet::del('environment',['languages']);          &Apache::lonnet::del('environment',['languages']);
         &Apache::lonnet::delenv('environment\.languages');          &Apache::lonnet::delenv('environment.languages');
         $message='Reset preferred language';          $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Preferred language').'</i>'));
     }      }
     $r->print(<<ENDVCSCREEN);      $message=&Apache::loncommon::confirmwrapper($message);
 $message      &Apache::loncommon::flush_langs_cache($user,$domain);
 ENDVCSCREEN      &print_main_menu($r, $message);
 }  }
   
 ################################################################  ################################################################
Line 184  ENDVCSCREEN Line 151  ENDVCSCREEN
 ################################################################  ################################################################
 sub texenginechanger {  sub texenginechanger {
     my $r = shift;      my $r = shift;
       Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changetexenginepref',
                   text => 'Math display settings'});
       $r->print(Apache::loncommon::start_page('Content Display Settings'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Math display settings'));
     my $user       = $env{'user.name'};      my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %userenv = &Apache::lonnet::get('environment',['texengine']);      my %userenv = &Apache::lonnet::get('environment',['texengine']);
     my $texengine=$userenv{'texengine'};      my $texengine=$userenv{'texengine'};
       if (lc($texengine) eq 'jsmath') {
           $texengine = 'MathJax';
       }
   
     my $pref=&mt('Preferred method to display Math');  
     my %mathchoices=('' => 'Default',      my %mathchoices=('' => 'Default',
      'tth' => 'TeX to HTML',       'tth' => 'tth (TeX to HTML)',
      #'ttm' => 'TeX to MathML',       #'ttm' => 'TeX to MathML',
      'jsMath' => 'jsMath',       'MathJax' => 'MathJax',
      'mimetex' => 'Convert to Images'       'mimetex' => 'mimetex (Convert to Images)',
                        'raw' => 'Raw (Screen Reader)'
                      );                       );
     my $selectionbox=&Apache::loncommon::select_form($texengine,'texengine',      %mathchoices = &Apache::lonlocal::texthash(%mathchoices);
      %mathchoices);      my $selectionbox=
     my $jsMath_start=&Apache::lontexconvert::jsMath_header();             &Apache::loncommon::select_form(
     my $change=&mt('Change');                 $texengine,
     $r->print(<<ENDLSCREEN);                 'texengine',
 <br />                 \%mathchoices);
       my $MathJax_start=&Apache::lontexconvert::MathJax_header();
       my %lt=&Apache::lonlocal::texthash(
         'headline' => 'Change how math is displayed',
         'preftxt'  => 'Preferred method to display math',
         'change'   => 'Save',
         'exmpl'    => 'Examples',
         'mathjax'  => 'MathJax:',
         'mathjaxinfo' => 'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.',
         'tth'      => 'tth (TeX to HTML):',
         'mimetex'  => 'mimetex (Convert to Images):',
       );
   
       $r->print(<<ENDLSCREEN);
   <h2>$lt{'headline'}</h2>
 <form name="prefs" action="/adm/preferences" method="post">  <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_texengine" />  <input type="hidden" name="action" value="verify_and_change_texengine" />
 <p>$pref: $selectionbox</p>  <p>
 <p><input type="submit" value="$change" /></p>  $lt{'preftxt'}: $selectionbox 
 </form>  <br />
 Examples:  <input type="submit" value="$lt{'change'}" />
 <p> TeX to HTML <br />   
 <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=tth" width="400" hieght="200"></iframe>  
 </p>  </p>
 <p>jsMath <br />   </form>
 $jsMath_start  <br />
 <script type="text/javascript">  <hr />
 if (jsMath.nofonts == 1) {  $lt{'exmpl'}
     document.writeln  
         ('<center><div style="padding: 10; border-style: solid; border-width:3;'  <h3>$lt{'mathjax'}</h3>
  +' border-color: #DD0000; background-color: #FFF8F8; width: 75%; text-align: left">'  
  +'<small><font color="#AA0000"><b>Warning:</b> '  
  +'It looks like you don\\\'t have the TeX math fonts installed. '  
  +'The jsMath example on this page may not look right without them. '  
  +'The <a href="http://www.math.union.edu/locate/jsMath/" target="_blank"> '  
  +'jsMath Home Page</a> has information on how to download the '  
  +'needed fonts.  In the meantime, jsMath will do the best it can '  
  +'with the fonts you have, but it may not be pretty and some equations '  
  +'may not be rendered correctly. '  
  +'</font></small></div></center>');  
 }  
 </script>  </script>
 <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=jsMath" width="400" hieght="200"></iframe>  <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=MathJax" width="400" height="150"></iframe>
   </p>
   <p>
   $lt{'mathjaxinfo'}
   </p>
   
   <h3>$lt{'mimetex'}</h3>
   <p>
   <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=mimetex" width="400" height="150"></iframe>
 </p>  </p>
 <p> Convert to Images <br />  
 <br />  <h3>$lt{'tth'}</h3>
 <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=mimetex" width="400" hieght="200"></iframe>  <p>
   <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=tth" width="400" height="150"></iframe>
 </p>  </p>
 ENDLSCREEN  ENDLSCREEN
     if ($env{'environment.texengine'} ne 'jsMath') {  
  $r->print('<script type="text/javascript">jsMath.Process()</script>');  
     }  
 }  }
   
   
Line 251  sub verify_and_change_texengine { Line 231  sub verify_and_change_texengine {
 # Screenname  # Screenname
     my $newtexengine  = $env{'form.texengine'};      my $newtexengine  = $env{'form.texengine'};
     $newtexengine=~s/[^\-\w]//g;      $newtexengine=~s/[^\-\w]//g;
       if (lc($newtexengine) eq 'jsmath') {
           $newtexengine = 'MathJax';
       }
     if ($newtexengine eq 'ttm') {      if ($newtexengine eq 'ttm') {
  &Apache::lonnet::appenv('browser.mathml' => 1);   &Apache::lonnet::appenv({'browser.mathml' => 1});
     } else {      } else {
  if ($env{'environment.texengine'} eq 'ttm') {   if ($env{'environment.texengine'} eq 'ttm') {
     &Apache::lonnet::appenv('browser.mathml' => 0);      &Apache::lonnet::appenv({'browser.mathml' => 0});
  }   }
     }      }
     my $message='';      my $message='';
     if ($newtexengine) {      if ($newtexengine) {
         &Apache::lonnet::put('environment',{'texengine' => $newtexengine});          &Apache::lonnet::put('environment',{'texengine' => $newtexengine});
         &Apache::lonnet::appenv('environment.texengine' => $newtexengine);          &Apache::lonnet::appenv({'environment.texengine' => $newtexengine});
         $message='Set new preferred math display to '.$newtexengine;          $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Preferred method to display Math').'</i>','<tt>"'.$newtexengine.'"</tt>'));
     } else {      } else {
         &Apache::lonnet::del('environment',['texengine']);          &Apache::lonnet::del('environment',['texengine']);
         &Apache::lonnet::delenv('environment\.texengine');          &Apache::lonnet::delenv('environment.texengine');
         $message='Reset preferred math display.';          $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Preferred method to display Math').'</i>'));
     }      }
       $message=&Apache::loncommon::confirmwrapper($message);
       &print_main_menu($r, $message);
     $r->print(<<ENDVCSCREEN);  
 $message  
 ENDVCSCREEN  
 }  }
   
 ################################################################  ################################################################
Line 286  sub rolesprefchanger { Line 266  sub rolesprefchanger {
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %userenv = &Apache::lonnet::get      my %userenv = &Apache::lonnet::get
         ('environment',['recentroles','recentrolesn']);          ('environment',['recentroles','recentrolesn']);
       my $brtext = 'Change '.$role.' Page Pref';
       my $brtitle;
       if ($env{'form.returnurl'} eq '/adm/roles') {
           $brtext = 'Configure Hotlist';
       } else {
           $brtitle = $brtext;
       }
       Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changerolespref',
                   text => $brtext});
       $r->print(Apache::loncommon::start_page('Content Display Settings'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs($brtitle));
     my $hotlist_flag=$userenv{'recentroles'};      my $hotlist_flag=$userenv{'recentroles'};
     my $hotlist_n=$userenv{'recentrolesn'};      my $hotlist_n=$userenv{'recentrolesn'};
     my $checked;      my ($checkedon,$checkedoff);
     if ($hotlist_flag) {      if ($hotlist_flag) {
  $checked = 'checked="checked"';   $checkedon = 'checked="checked"';
       } else {
           $checkedoff = 'checked="checked"';
     }      }
           
     if (!$hotlist_n) { $hotlist_n=3; }      if (!$hotlist_n) { $hotlist_n=3; }
Line 317  sub rolesprefchanger { Line 311  sub rolesprefchanger {
     &Apache::loncommon::start_data_table().      &Apache::loncommon::start_data_table().
     &Apache::loncommon::start_data_table_header_row().      &Apache::loncommon::start_data_table_header_row().
     "<th>".&mt('Freeze '.$role)."</th>".      "<th>".&mt('Freeze '.$role)."</th>".
     "<th>".&mt($role)."</td>".      "<th>".&mt($role)."</th>".
     &Apache::loncommon::end_data_table_header_row().      &Apache::loncommon::end_data_table_header_row().
     "\n";      "\n";
  my $count;   my $count;
Line 325  sub rolesprefchanger { Line 319  sub rolesprefchanger {
             my $checked = "";              my $checked = "";
             my $value = $recent_roles{$role_key};              my $value = $recent_roles{$role_key};
             if ($frozen_roles{$role_key}) {              if ($frozen_roles{$role_key}) {
                 $checked = "checked=\"checked\"";                  $checked = ' checked="checked"';
             }              }
     $count++;      $count++;
             $roles_check_list .=              $roles_check_list .=
  &Apache::loncommon::start_data_table_row().   &Apache::loncommon::start_data_table_row().
  '<td class="LC_table_cell_checkbox">'.   '<td class="LC_table_cell_checkbox">'.
  "<input type=\"checkbox\" $checked name=\"freezeroles\"".   "<input type=\"checkbox\"$checked name=\"freezeroles\"".
  " id=\"freezeroles$count\" value=\"$role_key\" /></td>".   " id=\"freezeroles$count\" value=\"$role_key\" /></td>".
  "<td><label for=\"freezeroles$count\">".   "<td><label for=\"freezeroles$count\">".
  "$role_text{$role_key}</label></td>".   "$role_text{$role_key}</label></td>".
Line 340  sub rolesprefchanger { Line 334  sub rolesprefchanger {
         $roles_check_list .= "</table>\n";          $roles_check_list .= "</table>\n";
     }      }
   
       my $actionurl = '/adm/preferences';
       if ($env{'form.returnurl'} eq '/adm/roles') {
           $actionurl = '/adm/roles';
       }
       $r->print('<h3>'.&mt('Recent Roles Hotlist').'</h3>');
       unless ($checkedon) {
           $r->print(&mt('LON-CAPA users with several '.$lc_role.'s may wish to enable the Hotlist.').'<br />');
       }
     $r->print('      $r->print('
 <p>'.&mt('Some LON-CAPA users have a long list of '.$lc_role.'s. The Recent '.$role.'s Hotlist feature keeps track of the last N '.$lc_role.'s which have been visited and places a table of these at the top of the '.$lc_role.'s page. People with very few '.$lc_role.'s should leave this feature disabled.').'  <form name="prefs" action="'.$actionurl.'" method="post">
 </p>  
 <form name="prefs" action="/adm/preferences" method="POST">  
 <input type="hidden" name="action" value="verify_and_change_rolespref" />  <input type="hidden" name="action" value="verify_and_change_rolespref" />
 <br /><label>'.&mt('Enable Recent '.$role.'s Hotlist:').'  <input type="hidden" name="returnurl" value="'.$env{'form.returnurl'}.'" />
 <input type="checkbox" '.$checked.' name="recentroles" value="true" /></label>  <div class="LC_left_float"><h4>'.&mt('Hotlist options').'</h4>
 <br />'.&mt('Number of '.$role.'s in Hotlist:').'  <p>'.
 <select name="recentrolesn" size="1">  &mt('When enabled, the Hotlist keeps track of the last N '.$lc_role.'s visited.').'<br />'.
 '.$options.'  &mt('Those N '.$lc_role.'s are then shown in a table at the top of the '.$lc_role.'s page.').'</p>'.
 </select>  &Apache::lonhtmlcommon::start_pick_box().
 <p>'.&mt('This list below can be used to <q>freeze</q> '.$lc_role.'s on your screen. Those marked as frozen will not be removed from the list, even if they have not been used recently.').'  &Apache::lonhtmlcommon::row_title(&mt('Use Recent '.$role.'s Hotlist')).
   '<span class="LC_nobreak">
   <label><input id="Hotliston" type="radio" '.$checkedon.' name="recentroles" value="1" />'.&mt('Yes').'</label>'.
   ('&nbsp;'x2).
   '<label><input id="Hotlistoff" type="radio" '.$checkedoff.' name="recentroles" value="0" />'.&mt('No').'</label>
   </span>'.
   &Apache::lonhtmlcommon::row_closure().
   &Apache::lonhtmlcommon::row_title('<label for="NumberOfRoles">'.&mt('Number of '.$role.'s in Hotlist').'</label>').
   '<select name="recentrolesn" size="1" id ="NumberOfRoles">'.
   $options.'
   </select>'.
   &Apache::lonhtmlcommon::row_closure(1).
   &Apache::lonhtmlcommon::end_pick_box().'
   </div>');
       if ($roles_check_list) { 
           $r->print('<div class="LC_left_float">
   <h4>'.&mt('Freeze Roles').'</h4>
   <p>'.&mt('The table below can be used to [_1]freeze[_2] '.$lc_role.'s in the Hotlist.','<q>','</q>').'<br />'.
   &mt('Those '.$lc_role.'s marked frozen will not be removed from the list, even if not recently used.').'
 </p>  </p>
 '.$roles_check_list.'  '.$roles_check_list.'
 <br />  </div>');
 <input type="submit" value="'.&mt('Change').'" />       } else {
            $r->print('<br clear="all" />'.
                      &mt('Once the Hotlist contains recently visited '.$lc_role.'s you can return to this page to also set frozen roles.'));
        }
        $r->print('
   <br clear="all" />
   <input type="submit" value="'.&mt('Save').'" />
 </form>');  </form>');
 }  }
   
Line 400  sub verify_and_change_rolespref { Line 424  sub verify_and_change_rolespref {
     my $message='<hr />';      my $message='<hr />';
     if ($hotlist_flag) {      if ($hotlist_flag) {
         &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag});          &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag});
         &Apache::lonnet::appenv('environment.recentroles' => $hotlist_flag);          &Apache::lonnet::appenv({'environment.recentroles' => $hotlist_flag});
         $message=&mt('Recent '.$role.'s Hotlist is Enabled');          $message=&Apache::lonhtmlcommon::confirm_success(&mt('Recent '.$role.'s Hotlist is Enabled.')." ".&mt('Display [_1] Most Recent '.$role.'s.',$hotlist_n));
     } else {      } else {
         &Apache::lonnet::del('environment',['recentroles']);          &Apache::lonnet::del('environment',['recentroles']);
         &Apache::lonnet::delenv('environment\.recentroles');          &Apache::lonnet::delenv('environment.recentroles');
         $message=&mt('Recent '.$role.'s Hotlist is Disabled');          $message=&Apache::lonhtmlcommon::confirm_success(&mt('Recent '.$role.'s Hotlist is Disabled'));
     }      }
     if ($hotlist_n) {      if ($hotlist_n) {
         &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n});          &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n});
         &Apache::lonnet::appenv('environment.recentrolesn' => $hotlist_n);          &Apache::lonnet::appenv({'environment.recentrolesn' => $hotlist_n});
         if ($hotlist_flag) {  
             $message.="<br />".  
  &mt('Display [_1] Most Recent '.$role.'s',$hotlist_n)."\n";  
         }  
     }      }
   
 # Get list of froze roles and list of recent roles  # Get list of froze roles and list of recent roles
Line 434  sub verify_and_change_rolespref { Line 454  sub verify_and_change_rolespref {
 # Unset any roles that were previously frozen but aren't in list  # Unset any roles that were previously frozen but aren't in list
     foreach my $role_key (sort(keys(%recent_roles))) {      foreach my $role_key (sort(keys(%recent_roles))) {
         if (($frozen_roles{$role_key}) && (!exists($freeze{$role_key}))) {          if (($frozen_roles{$role_key}) && (!exists($freeze{$role_key}))) {
     $message .= "<br />".&mt('Unfreezing '.$role.': [_1]',$role_text{$role_key})."\n";      $message .= "<br />".&Apache::lonhtmlcommon::confirm_success(&mt('Unfreezing '.$role.': [_1]','<i>'.$role_text{$role_key}.'</i>'));
     &Apache::lonhtmlcommon::store_recent('roles',$role_key,' ',0);      &Apache::lonhtmlcommon::store_recent('roles',$role_key,' ',0);
         }          }
     }      }
Line 442  sub verify_and_change_rolespref { Line 462  sub verify_and_change_rolespref {
 # Freeze selected roles  # Freeze selected roles
     foreach my $role_key (@freeze_list) {      foreach my $role_key (@freeze_list) {
         if (!$frozen_roles{$role_key}) {          if (!$frozen_roles{$role_key}) {
              $message .= "<br />".&mt('Freezing '.$role.': [_1]',$role_text{$role_key})."\n";               $message .= "<br />".
                &Apache::lonhtmlcommon::confirm_success(&mt('Freezing '.$role.': [_1]','<i>'.$role_text{$role_key}.'</i>'));
              &Apache::lonhtmlcommon::store_recent('roles',               &Apache::lonhtmlcommon::store_recent('roles',
                                           $role_key,' ',1);                                            $role_key,' ',1);
         }          }
     }      }
     $message .= "<hr /><br />\n";      $message=&Apache::loncommon::confirmwrapper($message);
       if ($env{'form.returnurl'} eq '/adm/roles') {
     $r->print(<<ENDRPSCREEN);          return $message;
 $message      } else {
 ENDRPSCREEN          &print_main_menu($r, $message);
       }
 }  }
   
   
   
 ################################################################  ################################################################
 #         Anonymous Discussion Name Change Subroutines         #  #         Anonymous Discussion Name Change Subroutines         #
 ################################################################  ################################################################
Line 467  sub screennamechanger { Line 488  sub screennamechanger {
         ('environment',['screenname','nickname']);          ('environment',['screenname','nickname']);
     my $screenname=$userenv{'screenname'};      my $screenname=$userenv{'screenname'};
     my $nickname=$userenv{'nickname'};      my $nickname=$userenv{'nickname'};
     $r->print(<<ENDSCREEN);      Apache::lonhtmlcommon::add_breadcrumb(
 <form name="prefs" action="/adm/preferences" method="post">   { href => '/adm/preferences?action=changescreenname',
 <input type="hidden" name="action" value="verify_and_change_screenname" />                    text => 'Change Screen Name'});
 <br />New screenname (shown if you post anonymously):      $r->print(Apache::loncommon::start_page('Personal Data'));
 <input type="text" size="20" value="$screenname" name="screenname" />      $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Screen Name'));
 <br />New nickname (shown if you post non-anonymously):      $r->print('<p>'
 <input type="text" size="20" value="$nickname" name="nickname" />               .&mt('Change the name that is displayed in your posts.')
 <input type="submit" value="Change" />               .'</p>'
 </form>      );
 ENDSCREEN      $r->print('<form name="prefs" action="/adm/preferences" method="post">'
                .'<input type="hidden" name="action" value="verify_and_change_screenname" />'
                .&Apache::lonhtmlcommon::start_pick_box()
                .&Apache::lonhtmlcommon::row_title(&mt('Screenname').' '.&mt('(shown if you post anonymously)'))
                .'<input type="text" size="20" value="'.$screenname.'" name="screenname" />'
                .&Apache::lonhtmlcommon::row_closure()
                .&Apache::lonhtmlcommon::row_title(&mt('Nickname').' '.&mt('(shown if you post non-anonymously)'))
                .'<input type="text" size="20" value="'.$nickname.'" name="nickname" />'
                .&Apache::lonhtmlcommon::row_closure()
                .&Apache::lonhtmlcommon::row_title()
                .'<input type="submit" value="'.&mt('Save').'" />'
                .&Apache::lonhtmlcommon::row_closure(1)
                .&Apache::lonhtmlcommon::end_pick_box()
                .'</form>'
       );
 }  }
   
 sub verify_and_change_screenname {  sub verify_and_change_screenname {
Line 489  sub verify_and_change_screenname { Line 524  sub verify_and_change_screenname {
     my $message='';      my $message='';
     if ($newscreen) {      if ($newscreen) {
         &Apache::lonnet::put('environment',{'screenname' => $newscreen});          &Apache::lonnet::put('environment',{'screenname' => $newscreen});
         &Apache::lonnet::appenv('environment.screenname' => $newscreen);          &Apache::lonnet::appenv({'environment.screenname' => $newscreen});
         $message='Set new screenname to '.$newscreen;          $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Screenname').'</i>','<tt>"'.$newscreen.'"</tt>'));
     } else {      } else {
         &Apache::lonnet::del('environment',['screenname']);          &Apache::lonnet::del('environment',['screenname']);
         &Apache::lonnet::delenv('environment\.screenname');          &Apache::lonnet::delenv('environment.screenname');
         $message='Reset screenname';          $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Screenname').'</i>'));
     }      }
 # Nickname  # Nickname
     $message.='<br />';      $message.='<br />';
Line 502  sub verify_and_change_screenname { Line 537  sub verify_and_change_screenname {
     $newscreen=~s/[^ \w]//g;      $newscreen=~s/[^ \w]//g;
     if ($newscreen) {      if ($newscreen) {
         &Apache::lonnet::put('environment',{'nickname' => $newscreen});          &Apache::lonnet::put('environment',{'nickname' => $newscreen});
         &Apache::lonnet::appenv('environment.nickname' => $newscreen);          &Apache::lonnet::appenv({'environment.nickname' => $newscreen});
         $message.='Set new nickname to '.$newscreen;          $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Nickname').'</i>','<tt>"'.$newscreen.'"</tt>'));
     } else {      } else {
         &Apache::lonnet::del('environment',['nickname']);          &Apache::lonnet::del('environment',['nickname']);
         &Apache::lonnet::delenv('environment\.nickname');          &Apache::lonnet::delenv('environment.nickname');
         $message.='Reset nickname';          $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Nickname').'</i>'));
     }      }
     &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain);      &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain);
     $r->print(<<ENDVCSCREEN);      $message=&Apache::loncommon::confirmwrapper($message);
 $message      &print_main_menu($r, $message);
 ENDVCSCREEN  
 }  }
   
 ################################################################  ################################################################
Line 520  ENDVCSCREEN Line 554  ENDVCSCREEN
 ################################################################  ################################################################
 sub iconchanger {  sub iconchanger {
     my $r = shift;      my $r = shift;
       &Apache::lonhtmlcommon::add_breadcrumb(
               {   href => '/adm/preferences?action=changeicons',
                   text => 'Change Menu Display'});
       $r->print(Apache::loncommon::start_page('Page Display Settings'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Menu Display'));
   
     my $user       = $env{'user.name'};      my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %userenv = &Apache::lonnet::get      my %userenv = &Apache::lonnet::get('environment',['icons']);
         ('environment',['icons']);  
     my $iconic='checked="checked"';      my $iconic='checked="checked"';
     my $classic='';      my ($classic,$onlyicon,$iconic_preview,$iconsonly_preview);
     if ($userenv{'icons'} eq 'classic') {      if ($userenv{'icons'} eq 'classic') {
        $classic='checked="checked"';          $iconic='';
           $classic='<div class="LC_info">'.
                    &mt('Your current selection: "Use buttons and text" is deprecated - it is recommended that you change this to "Use icons and text".').'</div>';
       }
       if ($userenv{'icons'} eq 'iconsonly') {
          $onlyicon='checked="checked"';
        $iconic='';         $iconic='';
     }      }
     my $useicons=&mt('Use icons');      my $change=&mt('Save');
     my $usebuttons=&mt('Use classic buttons');      my %lt = &icon_options();
     my $change=&mt('Change');      my ($inlinetools,$toolsorder) = &icon_previews();
       if ((ref($inlinetools) eq 'HASH') && (ref($toolsorder) eq 'ARRAY')) {
           foreach my $tool (@{$toolsorder}) {
               my ($command,$row,$col,$img,$top,$bot,$act,$desc) = 
                   split(/\&/,$inlinetools->{$tool});
               $iconic_preview .= '<li><a title="'.$desc.'" class="LC_menubuttons_link" href=""><img alt="'.$desc.'" src="/res/adm/pages/'.$img.'"  class="LC_icon" /><span class="LC_menubuttons_inline_text">'.$top.('&nbsp;' x 2).'</span></a></li>';
               $iconsonly_preview .= '<li><a title="'.$desc.'" class="LC_menubuttons_link" href=""><img alt="'.$desc.'" src="/res/adm/pages/'.$img.'"  class="LC_icon" />&nbsp;</a></li>';
           }
       }
       $iconsonly_preview = '<ul class="LC_breadcrumb_tools_outerlist"><li>'.
                            '<ul>'.
                            $iconsonly_preview.
                            '</ul></li></ul>';
       $iconic_preview = '<ul class="LC_breadcrumb_tools_outerlist"><li>'.
                         '<ul>'.
                         $iconic_preview.
                         '</ul></li></ul>'; 
     $r->print(<<ENDSCREEN);      $r->print(<<ENDSCREEN);
   $classic
 <form name="prefs" action="/adm/preferences" method="post">  <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_icons" />  <input type="hidden" name="action" value="verify_and_change_icons" />
 <label><input type="radio" name="menumode" value="iconic" $iconic /> $useicons</label><br />  <label><input type="radio" name="menumode" value="iconic" $iconic /> $lt{'iconic'}</label>$iconic_preview<br />
 <label><input type="radio" name="menumode" value="classic" $classic /> $usebuttons</label><br />  <label><input type="radio" name="menumode" value="iconsonly" $onlyicon /> $lt{'iconsonly'}</label>$iconsonly_preview<br />
 <input type="submit" value="$change" />  <input type="submit" value="$change" />
 </form>  </form>
 ENDSCREEN  ENDSCREEN
Line 547  sub verify_and_change_icons { Line 608  sub verify_and_change_icons {
     my $r = shift;      my $r = shift;
     my $user       = $env{'user.name'};      my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my $newicons  = $env{'form.menumode'};      my $newicons   = $env{'form.menumode'};
       my %lt = &icon_options();
       my $newchoice = $newicons;
       if ($lt{$newicons}) {
           $newchoice = $lt{$newicons};
       }
     &Apache::lonnet::put('environment',{'icons' => $newicons});      &Apache::lonnet::put('environment',{'icons' => $newicons});
     &Apache::lonnet::appenv('environment.icons' => $newicons);      &Apache::lonnet::appenv({'environment.icons' => $newicons});
     $r->print(&mt('Set menu mode to [_1].',$newicons));      my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Menu Display').'</i>','<tt>'.$newchoice.'</tt>'));
       $message=&Apache::loncommon::confirmwrapper($message);
       &print_main_menu($r, $message);
   }
   
   sub icon_options {
       return &Apache::lonlocal::texthash(
                                           iconic    => 'Use icons and text',
                                           iconsonly => 'Use icons only',
                                         );
   }
   
   sub icon_previews {
        my %icon_text = (
                         annotate => 'Notes',
                         wishlist => 'Stored Links',
                         catalog  => 'Info',
                         evaluate => 'Evaluate',
                         feedback => 'Communicate',
                         printout => 'Print',
                        );
       my %inlinetools = (
           printout => "s&8&3&prt.png&$icon_text{'printout'}&printout[_1]&gopost('/adm/printout',currentURL)&Prepare a printable document",
           wishlist => "s&9&1&wishlist-link.png&$icon_text{'wishlist'}&wishlistlink[_2]&set_wishlistlink()&Save a link for this resource in your personal Stored Links repository",
           evaluate => "s&8&1&eval.png&$icon_text{'evaluate'}&this[_1]&gopost('/adm/evaluate',currentURL,1)&Provide my evaluation of this resource",
           feedback => "s&8&2&fdbk.png&$icon_text{'feedback'}&discuss[_1]&gopost('/adm/feedback',currentURL,1)&Provide feedback messages or contribute to the course discussion about this resource",
           annotate => "s&9&3&anot.png&$icon_text{'annotate'}&tations[_1]&annotate()&Make notes and annotations about this resource",
           catalog  => "s&6&3&catalog.png&$icon_text{'catalog'}&info[_1]&catalog_info()&Show Metadata",
       );
       my @toolsorder = qw(annotate wishlist evaluate feedback printout catalog);
       return (\%inlinetools,\@toolsorder);
   }
   
   ################################################################
   #                     Clicker Subroutines                      #
   ################################################################
   
   sub clickerchanger {
       my $r = shift;
       &Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changeclicker',
                   text => 'Register Clicker'});
       $r->print(Apache::loncommon::start_page('Other'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Register Clicker'));
       my $user       = $env{'user.name'};
       my $domain     = $env{'user.domain'};
       my %userenv = &Apache::lonnet::get
           ('environment',['clickers']);
       my $clickers=$userenv{'clickers'};
       $clickers=~s/\,/\n/gs;
       my $text=&mt('Enter response device ("clicker") numbers');
       my $change=&mt('Save');
       my $helplink=&Apache::loncommon::help_open_topic('Clicker_Registration',&mt('Locating your clicker ID'));
       $r->print(<<ENDSCREEN);
   <form name="prefs" action="/adm/preferences" method="post">
   <input type="hidden" name="action" value="verify_and_change_clicker" />
   <label>$helplink<br /><br />$text<br />
   <textarea name="clickers" rows="5" cols="20">$clickers</textarea>
   </label>
   <br />
   <input type="submit" value="$change" />
   </form>
   ENDSCREEN
   }
   
   sub verify_and_change_clicker {
       my $r = shift;
       my $user       = $env{'user.name'};
       my $domain     = $env{'user.domain'};
       my $uhome      = $env{'user.home'};
       my $newclickers  = $env{'form.clickers'};
       my $message;
       $newclickers=~s/[^\w\:\-]+/\,/gs;
       $newclickers=~tr/a-z/A-Z/;
       $newclickers=~s/[\:\-]+/\-/g;
       $newclickers=~s/\,+/\,/g;
       $newclickers=~s/^\,//;
       $newclickers=~s/\,$//;
       my @oldclickers = split(/,/,$env{'environment.clickers'});
       my @newclickers = split(/,/,$newclickers);
       my %newuniq;
       map { $newuniq{$_} = 1; }  @newclickers;
       @newclickers = sort(keys(%newuniq));
       my @differences = &Apache::loncommon::compare_arrays(\@oldclickers,\@newclickers);
       if (@differences) {
           my $putres = &Apache::lonnet::put('environment',{'clickers' => $newclickers});
           if ($putres eq 'ok') {
               my @adds = ();
               my @dels = ();
               foreach my $item (@differences) {
                   if (grep(/^\Q$item\E$/,@newclickers)) {
                       push(@adds,$item);
                   } else {
                       push(@dels,$item);
                   }
               }
               if (@dels) {
                    my %delclicker;
                    map { $delclicker{$_} = $user; } @dels;
                    my $putresult = &Apache::lonnet::iddel($domain,\%delclicker,$uhome,'clickers');
               }
               if (@adds) {
                    my %addclicker;
                    map { $addclicker{$_} = $user; } @adds;
                    my $putresult = &Apache::lonnet::updateclickers($domain,'add',\%addclicker,$uhome,1);
               }
               &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
               $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers));
           } else {
               $message=&Apache::lonhtmlcommon::confirm_success(&mt('Error saving clicker ID').1);
           }
       } else {
           $message='<span class="LC_info">'.&mt('Clicker information unchanged').'</span>';
       }
       $message=&Apache::loncommon::confirmwrapper($message);
       &print_main_menu($r, $message);
   }
   
   ################################################################
   #               Domcoord Access Subroutines                    #
   ################################################################
   
   sub domcoordchanger {
       my $r = shift;
       &Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changedomcoord',
                   text => 'Restrict Domain Coordinator Access'});
       $r->print(Apache::loncommon::start_page('Restrict Domain Coordinator Access'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Restrict Domain Coordinator Access'));
       my $user       = $env{'user.name'};
       my $domain     = $env{'user.domain'};
       my %userenv = &Apache::lonnet::get
           ('environment',['domcoord.author']);
       my $constchecked='';
       if ($userenv{'domcoord.author'} eq 'blocked') {
          $constchecked=' checked="checked"';
       }
       my $text=&mt('By default, the Domain Coordinator can enter your Authoring Space.');
       my $construction=&mt('Block access to Authoring Space');
       my $change=&mt('Save');
       my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
       $r->print(<<ENDSCREEN);
   <form name="prefs" action="/adm/preferences" method="post">
   <input type="hidden" name="returnurl" value="$returnurl" />
   <input type="hidden" name="action" value="verify_and_change_domcoord" />
   $text<br />
   <label><input type="checkbox" name="construction"$constchecked />$construction</label><br />
   <input type="submit" value="$change" />
   </form>
   ENDSCREEN
   }
   
   sub verify_and_change_domcoord {
       my $r = shift;
       my $user       = $env{'user.name'};
       my $domain     = $env{'user.domain'};
       my %domcoord=('domcoord.author' => '');
       if ($env{'form.construction'}) { $domcoord{'domcoord.author'}='blocked'; }
       &Apache::lonnet::put('environment',\%domcoord);
       &Apache::lonnet::appenv({'environment.domcoord.author' => $domcoord{'domcoord.author'}});
       my $status='';
       if ($domcoord{'domcoord.author'} eq 'blocked') {
           $status=&mt('on');
       } else {
           $status=&mt('off');
       }
       my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Block access to Authoring Space').'</i>','<tt>'.$status.'</tt>'));
       $message=&Apache::loncommon::confirmwrapper($message);
       if ($env{'form.returnurl'}) {
           &do_redirect($r,$env{'form.returnurl'},$message);
       } else {
           &print_main_menu($r,$message);
       }
   }
   
   #################################################################
   ##                      Lock Subroutines                        #
   #################################################################
   
   sub lockwarning {
       my $r = shift;
       my $title=&mt('Action locked');
       my $texttop=&mt('LON-CAPA is currently performing the following actions:');
       my $textbottom=&mt('Changing roles or logging out may result in data corruption.');
       my ($num,%which)=&Apache::lonnet::get_locks();
       my $which='';
       foreach my $id (keys(%which)) {
          $which.='<li>'.$which{$id}.'</li>';
       }
       my $change=&mt('Override');
       $r->print(<<ENDSCREEN);
   <form name="prefs" action="/adm/preferences" method="post">
   <input type="hidden" name="action" value="verify_and_change_locks" />
   <h1>$title</h1>
   $texttop
   <ul>
   $which
   </ul>
   $textbottom
   <input type="submit" value="$change" />
   </form>
   ENDSCREEN
 }  }
   
   sub verify_and_change_lockwarning {
       my $r = shift;
       &Apache::lonnet::remove_all_locks();
       $r->print(&mt('Cleared locks.'));
   }
   
   
 ################################################################  ################################################################
 #         Message Forward                                      #  #         Message Forward                                      #
 ################################################################  ################################################################
   
 sub msgforwardchanger {  sub msgforwardchanger {
     my $r = shift;      my ($r,$message) = @_;
     my $user       = $env{'user.name'};      my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification']);      my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification','notifywithhtml']);
     my $msgforward=$userenv{'msgforward'};      my $msgforward=$userenv{'msgforward'};
     my $notification=$userenv{'notification'};      my %lt = &Apache::lonlocal::texthash(
     my $critnotification=$userenv{'critnotification'};                                            all   => 'All',
     my $forwardingHelp = Apache::loncommon::help_open_topic("Prefs_Forwarding",                                            crit  => 'Critical only',
     "What are forwarding ".                                            reg   => 'Non-critical only',
     "and notification ".                                            foad  => 'Forward to account(s)',
     "addresses");                                            fwdm  => 'Forward messages to other account(s) in LON-CAPA',
     my $criticalMessageHelp = Apache::loncommon::help_open_topic("Course_Critical_Message",                                            noti  => 'E-mail notification of LON-CAPA messages',
  "What are critical messages");                                            mnot  => 'E-mail address(es) which should be notified about new LON-CAPA messages',
                                             chg   => 'Save',
                                             email => 'The e-mail address entered in row ',
                                             notv => 'is not a valid e-mail address',
                                             toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one", 
                                             prme => 'Back',
                                           );
       $lt{'foad_exmpl'} = &mt('e.g. [_1]userA:domain1,userB:domain2,...[_2]','<tt>','</tt>');
       $lt{'mnot_exmpl'} = &mt('e.g. [_1]joe@doe.com[_2]','<tt>','</tt>');
       Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changemsgforward',
    text => 'Messages & Notifications'});
       $r->print(Apache::loncommon::start_page('Messages &amp; Notifications'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Messages &amp; Notifications'));
       my $forwardingHelp = &Apache::loncommon::help_open_topic("Prefs_Forwarding");
       my $notificationHelp = &Apache::loncommon::help_open_topic("Prefs_Notification");
       my $criticalMessageHelp = &Apache::loncommon::help_open_topic("Course_Critical_Message");
       my @allow_html = split(/,/,$userenv{'notifywithhtml'});
       my %allnot = &get_notifications(\%userenv);
       my $validatescript = &Apache::lonhtmlcommon::javascript_valid_email();
       my $jscript = qq|
   <script type="text/javascript" language="JavaScript">
   function validate() {
       for (var i=0; i<document.prefs.numnotify.value; i++) {
           var checkaddress = 0;
           var addr = document.prefs.elements['address_'+i].value;
           var rownum = i+1;
           if (i < document.prefs.numnotify.value-1) {
               if (document.prefs.elements['modify_notify_'+i].checked) {
                   checkaddress = 1;
               }
           } else {
               if (document.prefs.elements['add_notify_'+i].checked == true) { 
                   checkaddress = 1;
               }
           }
           if (checkaddress == 1)  {
               var addr = document.prefs.elements['address_'+i].value;
               if (validmail(document.prefs.elements['address_'+i]) == false) {
                   var multimsg = '';
                   if (addr.indexOf(",") >= 0) {
                       multimsg = "\\n($lt{'toen'}).";
                   }
                   alert("$lt{'email'} "+rownum+" ('"+addr+"') $lt{'notv'}."+multimsg);
                   return;
               }
           }
       }
       document.prefs.submit();
   }
   
   function address_changes (adnum) {
        if (!document.prefs.elements['del_notify_'+adnum].checked) { 
            document.prefs.elements['modify_notify_'+adnum].checked = true;
        }   
   }
   
   function new_address(adnum) {
        document.prefs.elements['add_notify_'+adnum].checked = true;
   }
   
   function delete_address(adnum) {
        if (document.prefs.elements['del_notify_'+adnum].checked) {
             document.prefs.elements['modify_notify_'+adnum].checked = false;
        }
   }
   
   function modify_address(adnum) {
       if (document.prefs.elements['modify_notify_'+adnum].checked) {
           document.prefs.elements['del_notify_'+adnum].checked = false;
       }
   } 
   
   $validatescript
   </script>
   |;
     $r->print(<<ENDMSG);      $r->print(<<ENDMSG);
 $forwardingHelp <br />  $jscript
   $message
   <h3>$lt{'fwdm'} $forwardingHelp</h3>
 <form name="prefs" action="/adm/preferences" method="post">  <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_msgforward" />  <input type="hidden" name="action" value="verify_and_change_msgforward" />
 New Forwarding Address(es) (<tt>user:domain,user:domain,...</tt>):  $lt{'foad'} ($lt{'foad_exmpl'}):
 <input type="text" size="40" value="$msgforward" name="msgforward" /><hr />  <input type="text" size="40" value="$msgforward" name="msgforward" />
 New Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>):  <br /><br />
 <input type="text" size="40" value="$notification" name="notification" /><hr />  <h3>$lt{'noti'} $notificationHelp</h3>
 New Critical Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>):  $lt{'mnot'} ($lt{'mnot_exmpl'}):<br />
 <input type="text" size="40" value="$critnotification" name="critnotification" />$criticalMessageHelp<hr />  
 <input type="submit" value="Change" />  
 </form>  
 ENDMSG  ENDMSG
       my @sortforwards = sort (keys(%allnot));
       my $output = &Apache::loncommon::start_data_table().
                    &Apache::loncommon::start_data_table_header_row().
                    '<th>&nbsp;</th>'.
                    '<th>'.&mt('Action').'</th>'.
                    '<th>'.&mt('Notification address').'</th><th>'.
                    &mt('Types of message for which notification is sent').
                    $criticalMessageHelp.'</th><th>'.
                    &mt('Excerpt retains HTML tags in message').'</th>'.
                    &Apache::loncommon::end_data_table_header_row();
       my $num = 0;
       my $counter = 1;
       foreach my $item (@sortforwards) {
           $output .= &Apache::loncommon::start_data_table_row().
                      '<td><b>'.$counter.'</b></td>'.
                      '<td><span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="modify_notify_'.
                      $num.'" onclick="javscript:modify_address('."'$num'".')" />'.
                      &mt('Modify').'</label></span>&nbsp;&nbsp; '.
                      '<span class="LC_nobreak"><label>'.
                      '<input type="checkbox" name="del_notify_'.$num.
                      '" onclick="javscript:delete_address('."'$num'".')" />'.
                      &mt('Delete').'</label></span></td>'.
                      '<td><input type="text" value="'.$item.'" name="address_'.
                      $num.'" onfocus="javascript:address_changes('."'$num'".
                      ')" /></td><td>';
           my %chk;
           if (defined($allnot{$item}{'crit'})) {
               if (defined($allnot{$item}{'reg'})) {
                   $chk{'all'} = 'checked="checked" ';
               } else {
                   $chk{'crit'} = 'checked="checked" ';
               }
           } else {
               $chk{'reg'} = 'checked="checked" ';
           }
           foreach my $type ('all','crit','reg') {
               $output .= '<span class="LC_nobreak"><label>'.
                          '<input type="radio" name="notify_type_'.$num. 
                          '" value="'.$type.'" '.$chk{$type}.
                          ' onchange="javascript:address_changes('."'$num'".')" />'.
                          $lt{$type}.'</label></span>'.('&nbsp;' x4);
           }
           my $htmlon = '';
           my $htmloff = '';
           if (grep/^\Q$item\E/,@allow_html) {
               $htmlon = 'checked="checked" '; 
           } else {
               $htmloff = 'checked="checked" ';
           }
           $output .= '</td><td><label><input type="radio" name="html_'.$num.
                      '" value="1" '.$htmlon.
                      ' onchange="javascript:address_changes('."'$num'".')" />'.
                      &mt('Yes').'</label>'.('&nbsp;' x3).
                      '<label><input type="radio" name="html_'.$num.'" value="0" '.
                      $htmloff. ' onchange="javascript:address_changes('."'$num'".
   ')" />'.
                      &mt('No').'</label></td>'.
                      &Apache::loncommon::end_data_table_row();
           $num ++;
           $counter ++;
       }
       my %defchk = (
                      all => 'checked="checked" ',
                      crit => '',
                      reg => '',
                    );
       $output .= &Apache::loncommon::start_data_table_row().
                  '<td><b>'.$counter.'</b></td>'.
                  '<td><span class="LC_nobreak"><label>'.
                  '<input type="checkbox" name="add_notify_'.$num.
                  '" value="1" />'.&mt('Add new address').'</label></span></td>'.
                  '<td><input type="text" value="" name="address_'.$num.
                  '" onfocus="javascript:new_address('."'$num'".')" /></td><td>';
       foreach my $type ('all','crit','reg') {
           $output .= '<span class="LC_nobreak"><label>'.
                      '<input type="radio" name="notify_type_'.$num.
                      '" value="'.$type.'" '.$defchk{$type}.'/>'.
                      $lt{$type}.'</label></span>'.('&nbsp;' x4);
       }
       $output .= '</td><td><label><input type="radio" name="html_'.$num.
                  '" value="1" />'.&mt('Yes').'</label>'.('&nbsp;' x3).
                  '<label><input type="radio" name="html_'.$num.'" value="0" '.
                  ' checked="checked" />'.
                  &mt('No').'</label></td>'.
                  &Apache::loncommon::end_data_table_row().
                  &Apache::loncommon::end_data_table();
       $num ++;
       $r->print($output);
       $r->print(qq|
   <br /><hr />
   <input type="hidden" name="numnotify" value="$num" />
   <input type="button" value="$lt{'prme'}" onclick="location.href='/adm/preferences'" />
   <input type="button" value="$lt{'chg'}" onclick="javascript:validate()" />
   </form>
   |);
   
   }
   
   sub get_notifications {
       my ($userenv) = @_;
       my %allnot;
       my @critnot = split(/,/,$userenv->{'critnotification'});
       my @regnot = split(/,/,$userenv->{'notification'});
       foreach my $item (@critnot) {
           $allnot{$item}{crit} = 1;
       }
       foreach my $item (@regnot) {
           $allnot{$item}{reg} = 1;
       }
       return %allnot;
 }  }
   
 sub verify_and_change_msgforward {  sub verify_and_change_msgforward {
Line 594  sub verify_and_change_msgforward { Line 1051  sub verify_and_change_msgforward {
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my $newscreen  = '';      my $newscreen  = '';
     my $message='';      my $message='';
     foreach (split(/\,/,$env{'form.msgforward'})) {      foreach my $recip (split(/\,/,$env{'form.msgforward'})) {
  my ($msuser,$msdomain)=split(/[\@\:]/,$_);          my ($msuser,$msdomain);
           if ($recip =~ /:/) {
               ($msuser,$msdomain)=split(':',$recip);
           } else {
               ($msuser,$msdomain)=split(/\@/,$recip);
           }
         $msuser = &LONCAPA::clean_username($msuser);          $msuser = &LONCAPA::clean_username($msuser);
         $msdomain = &LONCAPA::clean_domain($msdomain);          $msdomain = &LONCAPA::clean_domain($msdomain);
         if (($msuser) && ($msdomain)) {          if (($msuser) && ($msdomain)) {
     if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') {      if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') {
                $newscreen.=$msuser.':'.$msdomain.',';                  $newscreen.=$msuser.':'.$msdomain.',';
    } else {      } else {
                $message.='No such user: '.$msuser.':'.$msdomain.'<br>';                  $message.= &mt('No such user: ').'<tt>'.$msuser.':'.$msdomain.'</tt><br />';
            }              }
         }          }
     }      }
     $newscreen=~s/\,$//;      $newscreen=~s/\,$//;
     if ($newscreen) {      if ($newscreen) {
         &Apache::lonnet::put('environment',{'msgforward' => $newscreen});          &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
         &Apache::lonnet::appenv('environment.msgforward' => $newscreen);          &Apache::lonnet::appenv({'environment.msgforward' => $newscreen});
         $message.='Set new message forwarding to '.$newscreen.'<br />';          $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Set message forwarding to ').'<tt>"'.$newscreen.'"</tt>.<br />');
     } else {      } else {
         &Apache::lonnet::del('environment',['msgforward']);          &Apache::lonnet::del('environment',['msgforward']);
         &Apache::lonnet::delenv('environment\.msgforward');          &Apache::lonnet::delenv('environment.msgforward');
         $message.='Reset message forwarding<br />';          $message.= &Apache::lonhtmlcommon::confirm_success(&mt("Set message forwarding to 'off'.").'<br />');
     }      }
     my $notification=$env{'form.notification'};      my $critnotification;
       my $notification;
       my $notify_with_html;
       my $lastnotify = $env{'form.numnotify'}-1;
       my $totaladdresses = 0;
       for (my $i=0; $i<$env{'form.numnotify'}; $i++) {
           if ((!defined($env{'form.del_notify_'.$i})) &&  
              ((($i==$lastnotify) && ($env{'form.add_notify_'.$lastnotify} == 1)) ||
               ($i<$lastnotify))) {
               if (defined($env{'form.address_'.$i})) {
                   if ($env{'form.notify_type_'.$i} eq 'all') {
                       $critnotification .= $env{'form.address_'.$i}.',';
                       $notification .= $env{'form.address_'.$i}.',';
                   } elsif ($env{'form.notify_type_'.$i} eq 'crit') {
                       $critnotification .= $env{'form.address_'.$i}.',';
                   } elsif ($env{'form.notify_type_'.$i} eq 'reg') {
                       $notification .= $env{'form.address_'.$i}.','; 
                   }
                   if ($env{'form.html_'.$i} eq '1') {
       $notify_with_html .= $env{'form.address_'.$i}.',';      
                   }
                   $totaladdresses ++;
               }
           }
       }
       $critnotification =~ s/,$//;
       $critnotification=~s/\s//gs;
       $notification =~ s/,$//;
     $notification=~s/\s//gs;      $notification=~s/\s//gs;
       $notify_with_html =~ s/,$//;
       $notify_with_html =~ s/\s//gs;
     if ($notification) {      if ($notification) {
         &Apache::lonnet::put('environment',{'notification' => $notification});          &Apache::lonnet::put('environment',{'notification' => $notification});
         &Apache::lonnet::appenv('environment.notification' => $notification);          &Apache::lonnet::appenv({'environment.notification' => $notification});
         $message.='Set message notification address to '.$notification.'<br />';          $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set non-critical message notification address(es) to ').'<tt>"'.$notification.'"</tt>.<br />');
     } else {      } else {
         &Apache::lonnet::del('environment',['notification']);          &Apache::lonnet::del('environment',['notification']);
         &Apache::lonnet::delenv('environment\.notification');          &Apache::lonnet::delenv('environment.notification');
         $message.='Reset message notification<br />';          $message.=&Apache::lonhtmlcommon::confirm_success(&mt("Set non-critical message notification to 'off'.").'<br />');
     }      }
     my $critnotification=$env{'form.critnotification'};  
     $critnotification=~s/\s//gs;  
     if ($critnotification) {      if ($critnotification) {
         &Apache::lonnet::put('environment',{'critnotification' => $critnotification});          &Apache::lonnet::put('environment',{'critnotification' => $critnotification});
         &Apache::lonnet::appenv('environment.critnotification' => $critnotification);          &Apache::lonnet::appenv({'environment.critnotification' => $critnotification});
         $message.='Set critical message notification address to '.$critnotification;          $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set critical message notification address(es) to ').'<tt>"'.$critnotification.'"</tt>.<br />');
     } else {      } else {
         &Apache::lonnet::del('environment',['critnotification']);          &Apache::lonnet::del('environment',['critnotification']);
         &Apache::lonnet::delenv('environment\.critnotification');          &Apache::lonnet::delenv('environment.critnotification');
         $message.='Reset critical message notification<br />';          $message.=&Apache::lonhtmlcommon::confirm_success(&mt("Set critical message notification to 'off'.").'<br />');
     }      }
     $r->print(<<ENDVCMSG);      if ($critnotification || $notification) {
 $message          if ($notify_with_html) {
 ENDVCMSG              &Apache::lonnet::put('environment',{'notifywithhtml' => $notify_with_html});
               &Apache::lonnet::appenv({'environment.notifywithhtml' => $notify_with_html});
               $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set address(es) to receive excerpts with html retained ').'<tt>"'.$notify_with_html.'"</tt>.');
           } else {
               &Apache::lonnet::del('environment',['notifywithhtml']);
               &Apache::lonnet::delenv('environment.notifywithhtml');
               if ($totaladdresses == 1) {
                   $message.=&Apache::lonhtmlcommon::confirm_success(&mt("Set notification address to receive excerpts with html stripped."));
               } else {
                   $message.=&Apache::lonhtmlcommon::confirm_success(&mt("Set all notification addresses to receive excerpts with html stripped."));
               }
           }
       } else {
           &Apache::lonnet::del('environment',['notifywithhtml']);
           &Apache::lonnet::delenv('environment.notifywithhtml');
       }
       &Apache::loncommon::flush_email_cache($user,$domain);
       $message=&Apache::loncommon::confirmwrapper($message);
       &msgforwardchanger($r,$message);
 }  }
   
 ################################################################  ################################################################
Line 649  ENDVCMSG Line 1156  ENDVCMSG
   
 sub colorschanger {  sub colorschanger {
     my $r = shift;      my $r = shift;
       Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changecolors',
                   text => 'Change Colors'});
       $r->print(Apache::loncommon::start_page('Page Display Settings'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Colors'));
 # figure out colors  # figure out colors
     my $function=&Apache::loncommon::get_users_function();      my $function=&Apache::loncommon::get_users_function();
     my $domain=&Apache::loncommon::determinedomain();      my $domain=&Apache::loncommon::determinedomain();
     my %colortypes=('pgbg'  => 'Page Background',      my %colortypes=&Apache::lonlocal::texthash(
                     'tabbg' => 'Header Background',          'pgbg'     => 'Page Background Color',
                     'sidebg'=> 'Header Border',          'tabbg'    => 'Header Background Color',
                     'font'  => 'Font',          'sidebg'   => 'Header Border Color',
                     'link'  => 'Un-Visited Link',          'font'     => 'Font Color',
                     'vlink' => 'Visited Link',          'fontmenu' => 'Font Menu Color',
                     'alink' => 'Active Link');          'link'     => 'Un-Visited Link Color',
           'vlink'    => 'Visited Link Color',
           'alink'    => 'Active Link Color',
       );
     my $start_data_table = &Apache::loncommon::start_data_table();      my $start_data_table = &Apache::loncommon::start_data_table();
     my $chtable='';      my $chtable='';
     foreach my $item (sort(keys(%colortypes))) {      foreach my $item (sort(keys(%colortypes))) {
        my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);         my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);
        $chtable.=&Apache::loncommon::start_data_table_row().         $chtable.=&Apache::loncommon::start_data_table_row().
    '<td>'.$colortypes{$item}.'</td><td style="background: '.$curcol.     '<td>'.$colortypes{$item}.'<td><input name="'.$item.
         '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><input name="'.$item.          '" class="colorchooser"  size="10" value="'.$curcol.
         '" size="10" value="'.$curcol.  '" /></td>'.
 '" /></td><td><a href="javascript:pjump('."'color_custom','".$colortypes{$item}.  
 "','".$curcol."','"  
     .$item."','parmform.pres','psub'".');">Select</a></td>'.  
     &Apache::loncommon::end_data_table_row()."\n";      &Apache::loncommon::end_data_table_row()."\n";
     }      }
     my $end_data_table = &Apache::loncommon::end_data_table();      my $end_data_table = &Apache::loncommon::end_data_table();
     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();      my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
       my $savebutton = &mt('Save');
       my $resetbutton = &mt('Reset All');
       my $resetbuttondesc = &mt('Reset All Colors to Default');
       my $colorchooser=&Apache::lonhtmlcommon::color_picker();
       $r->print('<script type="text/javascript" language="JavaScript">
   ' . $colorchooser . '
   </script>
   ');
     $r->print(<<ENDCOL);      $r->print(<<ENDCOL);
 <script type="text/javascript">  
   
     function pclose() {  
         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",  
                  "height=350,width=350,scrollbars=no,menubar=no");  
         parmwin.close();  
     }  
   
     $pjump_def  
   
     function psub() {  
         pclose();  
         if (document.parmform.pres_marker.value!='') {  
             if (document.parmform.pres_type.value!='') {  
                 eval('document.prefs.'+  
                      document.parmform.pres_marker.value+  
      '.value=document.parmform.pres_value.value;');  
     }  
         } else {  
             document.parmform.pres_value.value='';  
             document.parmform.pres_marker.value='';  
         }  
     }  
   
   <form name="parmform" action="">
 </script>  
 <form name="parmform">  
 <input type="hidden" name="pres_marker" />  <input type="hidden" name="pres_marker" />
 <input type="hidden" name="pres_type" />  <input type="hidden" name="pres_type" />
 <input type="hidden" name="pres_value" />  <input type="hidden" name="pres_value" />
Line 712  $start_data_table Line 1207  $start_data_table
 $chtable  $chtable
 $end_data_table  $end_data_table
 </table>  </table>
 <input type="submit" value="Change Custom Colors" />  <p>
 <input type="submit" name="resetall" value="Reset All Colors to Default" />  <input type="submit" value="$savebutton" />
   <input type="submit" name="resetall" value="$resetbutton" title="$resetbuttondesc" />
   </p>
 </form>  </form>
 ENDCOL  ENDCOL
 }  }
Line 723  sub verify_and_change_colors { Line 1220  sub verify_and_change_colors {
 # figure out colors  # figure out colors
     my $function=&Apache::loncommon::get_users_function();      my $function=&Apache::loncommon::get_users_function();
     my $domain=&Apache::loncommon::determinedomain();      my $domain=&Apache::loncommon::determinedomain();
     my %colortypes=('pgbg'  => 'Page Background',      my %colortypes=&Apache::lonlocal::texthash(
                     'tabbg' => 'Header Background',          'pgbg'     => 'Page Background Color',
                     'sidebg'=> 'Header Border',          'tabbg'    => 'Header Background Color',
                     'font'  => 'Font',          'sidebg'   => 'Header Border Color',
                     'link'  => 'Un-Visited Link',          'font'     => 'Font Color',
                     'vlink' => 'Visited Link',   'fontmenu' => 'Font Menu Color',
                     'alink' => 'Active Link');          'link'     => 'Un-Visited Link Color',
           'vlink'    => 'Visited Link Color',
           'alink'    => 'Active Link Color',
       );
   
     my $message='';      my $message='';
     foreach my $item (keys %colortypes) {      foreach my $item (keys(%colortypes)) {
         my $color=$env{'form.'.$item};          my $color=$env{'form.'.$item};
    if (!($color =~ /^#/)) {
       $color = '#' . $color;
    }
         my $entry='color.'.$function.'.'.$item;          my $entry='color.'.$function.'.'.$item;
  if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {   if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {
     &Apache::lonnet::put('environment',{$entry => $color});      &Apache::lonnet::put('environment',{$entry => $color});
     &Apache::lonnet::appenv('environment.'.$entry => $color);      &Apache::lonnet::appenv({'environment.'.$entry => $color});
     $message.='Set '.$colortypes{$item}.' to '.$color.'<br />';              $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.$colortypes{$item}.'</i>','<tt>"'.$color.'"</tt>'))
                       .'<br />';
  } else {   } else {
     &Apache::lonnet::del('environment',[$entry]);      &Apache::lonnet::del('environment',[$entry]);
     &Apache::lonnet::delenv('environment\.'.$entry);      &Apache::lonnet::delenv('environment.'.$entry);
     $message.='Reset '.$colortypes{$item}.'<br />';              $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.$colortypes{$item}.'</i>'))
                        .'<br />';
  }   }
     }      }
       $message=&Apache::loncommon::confirmwrapper($message);
   
     my $now = time;      my $now = time;
     &Apache::lonnet::put('environment',{'color.timestamp' => $now});      &Apache::lonnet::put('environment',{'color.timestamp' => $now});
     &Apache::lonnet::appenv('environment.color.timestamp' => $now);      &Apache::lonnet::appenv({'environment.color.timestamp' => $now});
   
     $r->print(<<ENDVCCOL);      &print_main_menu($r, $message);
 $message  
 <form name="client" action="/adm/preferences" method="post">  
 <input type="hidden" name="action" value="changecolors" />  
 </form>  
 ENDVCCOL  
 }  }
   
 ######################################################  ######################################################
Line 765  sub passwordchanger { Line 1267  sub passwordchanger {
     # This function is a bit of a mess....      # This function is a bit of a mess....
     # Passwords are encrypted using londes.js (DES encryption)      # Passwords are encrypted using londes.js (DES encryption)
     $errormessage = ($errormessage || '');      $errormessage = ($errormessage || '');
     my ($user,$domain,$currentpass,$defdom);      my ($user,$domain,$currentpass);
       &Apache::lonhtmlcommon::add_breadcrumb(
    { href => '/adm/preferences?action=changepass',
                     text => 'Change Password'});
       unless ($caller eq 'reset_by_email') {
           $r->print(Apache::loncommon::start_page('Personal Data'));
           $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Password'));
       }
       my ($blocked,$blocktext) =
           &Apache::loncommon::blocking_status('passwd');
       if ($blocked) {
           $r->print('<p class="LC_warning">'.$blocktext.'</p>');
           return;
       }
     if ((!defined($caller)) || ($caller eq 'preferences')) {      if ((!defined($caller)) || ($caller eq 'preferences')) {
         $user = $env{'user.name'};          $user = $env{'user.name'};
         $domain = $env{'user.domain'};          $domain = $env{'user.domain'};
Line 773  sub passwordchanger { Line 1288  sub passwordchanger {
             $caller = 'preferences';              $caller = 'preferences';
         }          }
     } elsif ($caller eq 'reset_by_email') {      } elsif ($caller eq 'reset_by_email') {
             $defdom = $r->dir_config('lonDefDomain');  
             my %data = &Apache::lonnet::tmpget($mailtoken);              my %data = &Apache::lonnet::tmpget($mailtoken);
             if (keys(%data) == 0) {              if (keys(%data) == 0) {
                 $r->print(&mt('Sorry, the URL you provided to complete the reset of your password was invalid.  Either the token included in the URL has been deleted or the URL you provided was invalid. Please submit a <a href="/adm/resetpw">new request</a> for a password reset, and follow the link to the new URL included in the e-mail that will be sent to you, to allow you to enter a new password.'));                  $r->print(
                       '<p class="LC_warning">'
                      .&mt('Sorry, the URL you provided to complete the reset of your password was invalid. Either the token included in the URL has been deleted or the URL you provided was invalid. Please submit a [_1]new request[_2] for a password reset, and follow the link to the new URL included in the e-mail that will be sent to you, to allow you to enter a new password.'
                          ,'<a href="/adm/resetpw">','</a>')
                      .'</p>'
                   );
                 return;                  return;
             }              }
             if (defined($data{time})) {              if (defined($data{time})) {
Line 785  sub passwordchanger { Line 1304  sub passwordchanger {
                     $domain = $data{'domain'};                      $domain = $data{'domain'};
                     $currentpass = $data{'temppasswd'};                      $currentpass = $data{'temppasswd'};
                 } else {                  } else {
                     $r->print(&mt('Sorry, the token generated when you requested a password reset has expired.').'<br />');                      $r->print(
                           '<p class="LC_warning">'
                          .&mt('Sorry, the token generated when you requested'
                              .' a password reset has expired.')
                          .'</p>'
                       );
                     return;                      return;
                 }                  }
             } else {              } else {
                 $r->print(&mt('Sorry, the URL generated when you requested reset of your password contained incomplete information.').'<br />');                  $r->print(
                       '<p class="LC_warning">'
                      .&mt('Sorry, the URL generated when you requested reset of'
                          .' your password contained incomplete information.')
                      .'</p>'
                   );
                 return;                  return;
             }              }
    } else {              if (&Apache::lonnet::domain($domain) eq '') {
         $r->print(&mt('Page requested in unexpected context').'<br />');                  $domain = $r->dir_config('lonDefDomain');
               }
       } else {
           $r->print(
               '<p class="LC_error">'
              .&mt('Page requested in unexpected context')
              .'</p>'
           );
         return;          return;
     }      }
     my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);      my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
Line 801  sub passwordchanger { Line 1337  sub passwordchanger {
     return if ($currentauth !~ /^(unix|internal):/);      return if ($currentauth !~ /^(unix|internal):/);
     #      #
     # Generate keys      # Generate keys
     my ($lkey_cpass ,$ukey_cpass ) = &des_keys();      my ($lkey_cpass ,$ukey_cpass ) = &Apache::loncommon::des_keys();
     my ($lkey_npass1,$ukey_npass1) = &des_keys();      my ($lkey_npass1,$ukey_npass1) = &Apache::loncommon::des_keys();
     my ($lkey_npass2,$ukey_npass2) = &des_keys();      my ($lkey_npass2,$ukey_npass2) = &Apache::loncommon::des_keys();
     # Store the keys in the log files      # Store the keys in the log files
     my $lonhost = $r->dir_config('lonHostID');      my $lonhost = $r->dir_config('lonHostID');
     my $logtoken=Apache::lonnet::reply('tmpput:'      my $logtoken=Apache::lonnet::reply('tmpput:'
Line 836  $errormessage Line 1372  $errormessage
      crappy browser -->       crappy browser -->
 ENDFORM  ENDFORM
     $r->print(&server_form($logtoken,$caller,$mailtoken));      $r->print(&server_form($logtoken,$caller,$mailtoken));
     $r->print(&client_form($caller,\%hexkey,$currentpass,$defdom));      $r->print(&client_form($caller,\%hexkey,$currentpass,$domain));
   
     #      #
     return;      return;
Line 845  ENDFORM Line 1381  ENDFORM
 sub jscript_send {  sub jscript_send {
     my ($caller) = @_;      my ($caller) = @_;
     my $output = qq|      my $output = qq|
 <script language="JavaScript">  <script type="text/javascript" language="JavaScript">
   
     function send() {      function send() {
         uextkey=this.document.client.elements.ukey_cpass.value;          uextkey=this.document.client.elements.ukey_cpass.value;
         lextkey=this.document.client.elements.lkey_cpass.value;          lextkey=this.document.client.elements.lkey_cpass.value;
         initkeys();          initkeys();
           this.document.pserver.elements.currentpass.value =
         this.document.pserver.elements.currentpass.value              getCrypted(this.document.client.elements.currentpass.value);
             =crypted(this.document.client.elements.currentpass.value);  
   
         uextkey=this.document.client.elements.ukey_npass1.value;          uextkey=this.document.client.elements.ukey_npass1.value;
         lextkey=this.document.client.elements.lkey_npass1.value;          lextkey=this.document.client.elements.lkey_npass1.value;
         initkeys();          initkeys();
         this.document.pserver.elements.newpass_1.value          this.document.pserver.elements.newpass_1.value
             =crypted(this.document.client.elements.newpass_1.value);              =getCrypted(this.document.client.elements.newpass_1.value);
   
         uextkey=this.document.client.elements.ukey_npass2.value;          uextkey=this.document.client.elements.ukey_npass2.value;
         lextkey=this.document.client.elements.lkey_npass2.value;          lextkey=this.document.client.elements.lkey_npass2.value;
         initkeys();          initkeys();
         this.document.pserver.elements.newpass_2.value          this.document.pserver.elements.newpass_2.value
             =crypted(this.document.client.elements.newpass_2.value);              =getCrypted(this.document.client.elements.newpass_2.value);
 |;  |;
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         $output .= qq|          $output .= qq|
Line 873  sub jscript_send { Line 1406  sub jscript_send {
                    this.document.client.elements.uname.value;                     this.document.client.elements.uname.value;
         this.document.pserver.elements.udom.value =          this.document.pserver.elements.udom.value =
                    this.document.client.elements.udom.options[this.document.client.elements.udom.selectedIndex].value;                     this.document.client.elements.udom.options[this.document.client.elements.udom.selectedIndex].value;
           this.document.pserver.elements.email.value =
                      this.document.client.elements.email.value;
 |;  |;
     }      }
     $ output .= qq|      $ output .= qq|
         this.document.pserver.submit();          this.document.pserver.submit();
     }      }
   
 </script>  </script>
 |;  |;
 }  }
Line 885  sub jscript_send { Line 1421  sub jscript_send {
 sub client_form {  sub client_form {
     my ($caller,$hexkey,$currentpass,$defdom) = @_;      my ($caller,$hexkey,$currentpass,$defdom) = @_;
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
                 'email' => 'EMail Address',                  'email' => 'E-mail Address',
                 'username' => 'Username',                  'username' => 'Username',
                 'domain' => 'Domain',                  'domain' => 'Domain',
                 'currentpass' => 'Current Password',                  'currentpass' => 'Current Password',
                 'newpass' => 'New Password',                  'newpass' => 'New Password',
                 'confirmpass' => 'Confirm Password',                  'confirmpass' => 'Confirm Password',
                 'changepass' => 'Change Password');                  'changepass' => 'Save',
       );
   
     my $output = qq|      my $output = '<form name="client" action="">'
 <form name="client" >                  .&Apache::lonhtmlcommon::start_pick_box();
 <table>  
 |;  
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         $output .= qq|          my $mobileargs;
 <tr><td class="LC_preferences_labeltext"><label for="email">$lt{'email'}</label>:</td>          (undef,undef,undef,undef,undef,undef,my $clientmobile) =
     <td><input type="text" name="email" size="30" /> </td></tr>              &Apache::loncommon::decode_user_agent();
 <tr><td class="LC_preferences_labeltext"><label for="uname">$lt{'username'}</label>:</td>          if ($clientmobile) {
     <td>              $mobileargs = 'autocapitalize="off" autocorrect="off" ';
      <input type="text" name="uname" size="15" />          }
      <input type="hidden" name="currentpass" value="$currentpass" />          $output .= &Apache::lonhtmlcommon::row_title(
     </td></tr>                         '<label for="email">'.$lt{'email'}.'</label>')
 <tr><td class="LC_preferences_labeltext"><label for="udom">$lt{'udom'}</label>:</td>                    .'<input type="text" name="email" size="30" '.$mobileargs.'/>'
     <td>                    .&Apache::lonhtmlcommon::row_closure()
 |;                    .&Apache::lonhtmlcommon::row_title(
         $output .= &Apache::loncommon::select_dom_form($defdom,'udom').'                         '<label for="uname">'.$lt{'username'}.'</label>')
    </td>                    .'<input type="text" name="uname" size="20" '.$mobileargs.'/>'
 </tr>                    .'<input type="hidden" name="currentpass" value="'.$currentpass.'" />'
 ';                    .&Apache::lonhtmlcommon::row_closure()
                     .&Apache::lonhtmlcommon::row_title(
                          '<label for="udom">'.$lt{'domain'}.'</label>')
                     .&Apache::loncommon::select_dom_form($defdom,'udom')
                     .&Apache::lonhtmlcommon::row_closure();
     } else {      } else {
         $output .= qq|          $output .= &Apache::lonhtmlcommon::row_title(
 <tr><td class="LC_preferences_labeltext"><label for="currentpass">$lt{'currentpass'}</label></td>                         '<label for="currentpass">'.$lt{'currentpass'}.'</label>')
     <td><input type="password" name="currentpass" size="10"/> </td></tr>                    .'<input type="password" name="currentpass" size="20"/>'
 |;                    .&Apache::lonhtmlcommon::row_closure();
     }      }
     $output .= <<"ENDFORM";      $output .= &Apache::lonhtmlcommon::row_title(
 <tr><td class="LC_preferences_labeltext"><label for="newpass_1">$lt{'newpass'}</label></td>                     '<label for="newpass_1">'.$lt{'newpass'}.'</label>')
     <td><input type="password" name="newpass_1" size="10"  /> </td></tr>                .'<input type="password" name="newpass_1" size="20" />'
 <tr><td class="LC_preferences_labeltext"><label for="newpass_2">$lt{'confirmpass'}</label></td>                .&Apache::lonhtmlcommon::row_closure()
     <td><input type="password" name="newpass_2" size="10"  /> </td></tr>                .&Apache::lonhtmlcommon::row_title(
 <tr><td colspan="2" align="center">                     '<label for="newpass_2">'.$lt{'confirmpass'}.'</label>')
     <input type="button" value="$lt{'changepass'}" onClick="send();">                .'<input type="password" name="newpass_2" size="20" />'
 </table>                .&Apache::lonhtmlcommon::row_closure(1)
                 .&Apache::lonhtmlcommon::end_pick_box();
       $output .= '<p><input type="button" value="'.$lt{'changepass'}.'" onclick="send();" /></p>'
                 .qq|
 <input type="hidden" name="ukey_cpass"  value="$hexkey->{'ukey_cpass'}" />  <input type="hidden" name="ukey_cpass"  value="$hexkey->{'ukey_cpass'}" />
 <input type="hidden" name="lkey_cpass"  value="$hexkey->{'lkey_cpass'}" />  <input type="hidden" name="lkey_cpass"  value="$hexkey->{'lkey_cpass'}" />
 <input type="hidden" name="ukey_npass1" value="$hexkey->{'ukey_npass1'}" />  <input type="hidden" name="ukey_npass1" value="$hexkey->{'ukey_npass1'}" />
Line 935  sub client_form { Line 1477  sub client_form {
 <input type="hidden" name="lkey_npass2" value="$hexkey->{'lkey_npass2'}" />  <input type="hidden" name="lkey_npass2" value="$hexkey->{'lkey_npass2'}" />
 </form>  </form>
 </p>  </p>
 ENDFORM  |;
     return $output;      return $output;
 }  }
   
Line 957  sub server_form { Line 1499  sub server_form {
 <input type="hidden" name="token"   value="$mailtoken" />  <input type="hidden" name="token"   value="$mailtoken" />
 <input type="hidden" name="uname"   value="" />  <input type="hidden" name="uname"   value="" />
 <input type="hidden" name="udom"   value="" />  <input type="hidden" name="udom"   value="" />
   <input type="hidden" name="email"   value="" />
   
 |;  |;
     }      }
Line 970  sub server_form { Line 1513  sub server_form {
 sub verify_and_change_password {  sub verify_and_change_password {
     my ($r,$caller,$mailtoken) = @_;      my ($r,$caller,$mailtoken) = @_;
     my ($user,$domain,$homeserver);      my ($user,$domain,$homeserver);
       my ($blocked,$blocktext) =
           &Apache::loncommon::blocking_status('passwd');
       if ($blocked) {
           $r->print('<p class="LC_warning">'.$blocktext.'</p>');
           return;
       }
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         $user       = $env{'form.uname'};          $user       = $env{'form.uname'};
         $domain     = $env{'form.udom'};          $domain     = $env{'form.udom'};
Line 1028  sub verify_and_change_password { Line 1577  sub verify_and_change_password {
         if ($caller eq 'reset_by_email') {          if ($caller eq 'reset_by_email') {
             $tryagain_text = &mt('Please try again later.');              $tryagain_text = &mt('Please try again later.');
         }          }
         my $unable=&mt("Unable to retrieve stored token for password decryption");          my $unable=&mt("Unable to retrieve saved token for password decryption");
  $r->print(<<ENDERROR);   $r->print(<<ENDERROR);
 <p>  <p>
 <span class="LC_error">$unable.  $tryagain_text</span>  <span class="LC_error">$unable.  $tryagain_text</span>
Line 1038  ENDERROR Line 1587  ENDERROR
         return 1;          return 1;
     }      }
     my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);      my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);
     #       #
     $currentpass = &des_decrypt($ckey ,$currentpass);      $currentpass = &Apache::loncommon::des_decrypt($ckey ,$currentpass);
     $newpass1    = &des_decrypt($n1key,$newpass1);      $newpass1    = &Apache::loncommon::des_decrypt($n1key,$newpass1);
     $newpass2    = &des_decrypt($n2key,$newpass2);      $newpass2    = &Apache::loncommon::des_decrypt($n2key,$newpass2);
     #      #
     if ($caller eq 'reset_by_email') {      if ($caller eq 'reset_by_email') {
         my %data = &Apache::lonnet::tmpget($mailtoken);          my %data = &Apache::lonnet::tmpget($mailtoken);
           if (keys(%data) == 0) {
               &passwordchanger($r,
                            '<span class="LC_error">'.
                            &mt('Could not verify current authentication.').'  '.
                            &mt('Please try again.').'</span>',$caller,$mailtoken);
               return 1;
           }
         if ($currentpass ne $data{'temppasswd'}) {          if ($currentpass ne $data{'temppasswd'}) {
             &passwordchanger($r,              &passwordchanger($r,
                          '<span class="LC_error">'.                           '<span class="LC_error">'.
                          &mt('Could not verify current authentication').'.  '.                           &mt('Could not verify current authentication.').'  '.
                          &mt('Please try again').'.</span>',$caller,$mailtoken);                           &mt('Please try again.').'</span>',$caller,$mailtoken);
             return 1;              return 1;
         }          }
     }       } 
     if ($newpass1 ne $newpass2) {      if ($newpass1 ne $newpass2) {
  &passwordchanger($r,   &passwordchanger($r,
  '<span class="LC_error">'.   '<span class="LC_warning">'.
  &mt('The new passwords you entered do not match').'.  '.   &mt('The new passwords you entered do not match.').'  '.
  &mt('Please try again').'.</span>',$caller,$mailtoken);   &mt('Please try again.').'</span>',$caller,$mailtoken);
  return 1;   return 1;
     }      }
     if (length($newpass1) < 7) {      if (length($newpass1) < 7) {
  &passwordchanger($r,   &passwordchanger($r,
  '<span class="LC_error">'.   '<span class="LC_warning">'.
  &mt('Passwords must be a minimum of 7 characters long').'.  '.   &mt('Passwords must be a minimum of 7 characters long.').'  '.
  &mt('Please try again').'</span>.',$caller,$mailtoken);   &mt('Please try again.').'</span>',$caller,$mailtoken);
  return 1;   return 1;
     }      }
     #      #
Line 1075  ENDERROR Line 1631  ENDERROR
     }      }
     if ($badpassword) {      if ($badpassword) {
  # I can't figure out how to enter bad characters on my browser.   # I can't figure out how to enter bad characters on my browser.
  my $errormessage ='<span class="LC_error">'.   my $errormessage ='<span class="LC_warning">'.
            &mt('The password you entered contained illegal characters').'.<br />'.             &mt('The password you entered contained illegal characters.').'<br />'.
            &mt('Valid characters are').(<<"ENDERROR");             &mt('Valid characters are').(<<"ENDERROR");
 : space and <br />  : space and <br />
 <pre>  <pre>
Line 1092  ENDERROR Line 1648  ENDERROR
     my $result = &Apache::lonnet::changepass      my $result = &Apache::lonnet::changepass
  ($user,$domain,$currentpass,$newpass1,$homeserver,$caller);   ($user,$domain,$currentpass,$newpass1,$homeserver,$caller);
     # Inform the user the password has (not?) been changed      # Inform the user the password has (not?) been changed
       my $message;
     if ($result =~ /^ok$/) {      if ($result =~ /^ok$/) {
  $r->print("<h3>".&mt('The password for [_1] was successfully changed',$user)."</h3>");          $message = &Apache::lonhtmlcommon::confirm_success(&mt('The password for user [_1] was successfully changed.','<i>'.$user.'</i>'));
           $message = &Apache::loncommon::confirmwrapper($message);
           if ($caller eq 'reset_by_email') {
               $r->print($message.'<br />');
           } else {
               &print_main_menu($r, $message);
           }
     } else {      } else {
  # error error: run in circles, scream and shout   # error error: run in circles, scream and shout
         $r->print("<h3><span class='LC_error'>".&mt("The password for [_1] was not changed",$user)."</span></h3>".          if ($caller eq 'reset_by_email') {
                   &mt('Please make sure your old password was entered correctly').'.');              if (!$result) {
         return 1;                  return 1;
               } else {
                   return $result;
               }
           } else {
               $message = &Apache::lonhtmlcommon::confirm_success(
                   &mt("The password for user [_1] was not changed.",'<i>'.$user.'</i>').' '.&mt('Please make sure your old password was entered correctly.'),1);
               $message=&Apache::loncommon::confirmwrapper($message);
               &print_main_menu($r, $message);
           }
     }      }
     return;      return;
 }  }
Line 1108  ENDERROR Line 1680  ENDERROR
 ################################################################  ################################################################
 sub discussionchanger {  sub discussionchanger {
     my $r = shift;      my $r = shift;
       Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changediscussions',
                   text => 'Change Discussion Preferences'});
       $r->print(Apache::loncommon::start_page('Change Discussion Preferences'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Discussion Preferences'));
     my $user       = $env{'user.name'};      my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %userenv = &Apache::lonnet::get      my %userenv = &Apache::lonnet::get
Line 1121  sub discussionchanger { Line 1698  sub discussionchanger {
         }          }
     }      }
     if (defined($userenv{'discmarkread'})) {      if (defined($userenv{'discmarkread'})) {
         unless ($userenv{'discdisplay'} eq '') {           unless ($userenv{'discmarkread'} eq '') { 
             $discmark = $userenv{'discmarkread'};              $discmark = $userenv{'discmarkread'};
         }          }
     }      }
Line 1136  sub discussionchanger { Line 1713  sub discussionchanger {
         'pref' => 'Display Preference',          'pref' => 'Display Preference',
         'curr' => 'Current setting ',          'curr' => 'Current setting ',
         'actn' => 'Action',          'actn' => 'Action',
         'sdpf' => 'Set display preferences for discussion posts for both bulletin boards and individual resources in all your courses.',          'sdpf' => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.',
         'prca' => 'Preferences can be set that determine',          'prca' => 'Preferences can be set that determine',
         'whpo' => 'Which posts are displayed when you display a bulletin board or resource, and',          'whpo' => 'Which posts are displayed when you display a discussion board or resource, and',
         'unwh' => 'Under what circumstances posts are identfied as "New"',          'unwh' => 'Under what circumstances posts are identified as "NEW"',
         'allposts' => 'All posts',          'allposts' => 'All posts',
         'unread' => 'New posts only',          'unread' => 'New posts only',
         'ondisp' => 'Once displayed',          'ondisp' => 'Once displayed',
         'onmark' => 'Once marked as read',          'onmark' => 'Once marked not NEW',
         'disa' => 'Posts displayed?',          'disa' => 'Posts displayed?',
         'npmr' => 'New posts cease to be identified as "New"?',          'npmr' => 'New posts cease to be identified as "NEW"?',
         'thde'  => 'The preferences you set here can be overridden within each individual discussion.',          'thde'  => 'The preferences you set here can be overridden within each individual discussion.',
         'chgt' => 'Change to '          'chgt' => 'Change to '
     );      );
Line 1165  sub discussionchanger { Line 1742  sub discussionchanger {
         $currmark = $lt{'ondisp'};          $currmark = $lt{'ondisp'};
         $newmark = 'onmark';          $newmark = 'onmark';
     }      }
       
     $r->print(<<"END");      $r->print(<<"END");
 <form name="prefs" action="/adm/preferences" method="post">  <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_discussion" />  <input type="hidden" name="action" value="verify_and_change_discussion" />
 <br />  <br />
 $lt{'sdpf'}<br /> $lt{'prca'}  <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li></ol>   $lt{'sdpf'}<br /> $lt{'prca'}  <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li></ol> 
 <br />  
 <br />  
 END  END
   
       $r->print('<p class="LC_info">'.$lt{'thde'}.'</p>');
   
     $r->print(&Apache::loncommon::start_data_table());      $r->print(&Apache::loncommon::start_data_table());
     $r->print(<<"END");      $r->print(<<"END");
        <tr>         <tr>
Line 1198  END Line 1776  END
 END  END
     $r->print(&Apache::loncommon::end_data_table_row().      $r->print(&Apache::loncommon::end_data_table_row().
       &Apache::loncommon::end_data_table());        &Apache::loncommon::end_data_table());
     $r->print(<<"END");  
 <br />      $r->print('<br />'
 <br />               .'<input type="submit" name="sub" value="'.&mt('Save').'" />'
 <input type="submit" name="sub" value="Store Changes" />               .'</form>'
 <br />      );
 <br />  
 Note: $lt{'thde'}  
 </form>  
 END  
 }  }
                                                                                                                                                                                                                                   
 sub verify_and_change_discussion {  sub verify_and_change_discussion {
Line 1217  sub verify_and_change_discussion { Line 1791  sub verify_and_change_discussion {
     if (defined($env{'form.discdisp'}) ) {      if (defined($env{'form.discdisp'}) ) {
         my $newdisp  = $env{'form.newdisp'};          my $newdisp  = $env{'form.newdisp'};
         if ($newdisp eq 'unread') {          if ($newdisp eq 'unread') {
             $message .='In discussions: only new posts will be displayed.<br />';              $message .=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: only new posts will be displayed.')).'<br />';
             &Apache::lonnet::put('environment',{'discdisplay' => $newdisp});              &Apache::lonnet::put('environment',{'discdisplay' => $newdisp});
             &Apache::lonnet::appenv('environment.discdisplay' => $newdisp);              &Apache::lonnet::appenv({'environment.discdisplay' => $newdisp});
         } else {          } else {
             $message .= 'In discussions: all posts will be displayed.<br />';              $message .= &Apache::lonhtmlcommon::confirm_success(&mt('In discussions: all posts will be displayed.')).'<br />';
             &Apache::lonnet::del('environment',['discdisplay']);              &Apache::lonnet::del('environment',['discdisplay']);
             &Apache::lonnet::delenv('environment\.discdisplay');              &Apache::lonnet::delenv('environment.discdisplay');
         }          }
     }      }
     if (defined($env{'form.discmark'}) ) {      if (defined($env{'form.discmark'}) ) {
         my $newmark = $env{'form.newmark'};          my $newmark = $env{'form.newmark'};
         if ($newmark eq 'ondisp') {          if ($newmark eq 'ondisp') {
            $message.='In discussions: new posts will be cease to be identified as "new" after display.<br />';              $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will cease to be identified as "NEW" after display.')).'<br />';
             &Apache::lonnet::put('environment',{'discmarkread' => $newmark});              &Apache::lonnet::put('environment',{'discmarkread' => $newmark});
             &Apache::lonnet::appenv('environment.discmarkread' => $newmark);              &Apache::lonnet::appenv({'environment.discmarkread' => $newmark});
         } else {          } else {
             $message.='In discussions: posts will be identified as "new" until marked as read by the reader.<br />';              $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: posts will be identified as "NEW" until marked as not "NEW".')).'<br />';
             &Apache::lonnet::del('environment',['discmarkread']);              &Apache::lonnet::del('environment',['discmarkread']);
             &Apache::lonnet::delenv('environment\.discmarkread');              &Apache::lonnet::delenv('environment.discmarkread');
         }          }
     }      }
     $r->print(<<ENDVCSCREEN);      $message=&Apache::loncommon::confirmwrapper($message);
 $message      &print_main_menu($r, $message);
 ENDVCSCREEN  
 }  }
   
 ################################################################  ################################################################
Line 1248  ENDVCSCREEN Line 1821  ENDVCSCREEN
 ################################################################  ################################################################
 sub coursedisplaychanger {  sub coursedisplaychanger {
     my $r = shift;      my $r = shift;
       &Apache::lonhtmlcommon::add_breadcrumb(
       { href => '/adm/preferences?action=changecourseinit',
                   text => 'Change Course Init. Pref.'});
       $r->print(Apache::loncommon::start_page('Change Course Initialization Preference'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Course Init. Pref.'));
     my $user       = $env{'user.name'};      my $user       = $env{'user.name'};
     my $domain     = $env{'user.domain'};      my $domain     = $env{'user.domain'};
     my %userenv = &Apache::lonnet::get('environment',['course_init_display']);      my %userenv = &Apache::lonnet::get('environment',['course_init_display']);
Line 1261  sub coursedisplaychanger { Line 1839  sub coursedisplaychanger {
     $whatsnewselect = '';      $whatsnewselect = '';
         }          }
     }      }
     my %pagenames = (      my %pagenames = &Apache::lonlocal::texthash(
                        firstres => 'First resource',                         firstres => 'First resource',
                        whatsnew => "What's new page",                         whatsnew => "What's New Page",
                     );                      );
     my $whatsnew_off=&mt('Display the [_1] in the course.','<b>first resource</b>');      my $whatsnew_off=&mt('Display the [_1]first resource[_2] in the course.','<b>','</b>');
     my $whatsnew_on=&mt('Display the "[_1]" page - a summary of items in the course which require attention.',"<b>What's New</b>");      my $whatsnew_on=&mt("Display the [_1]What's New Page[_2] - a summary of items in the course which require attention.",'<b>','</b>');
   
     $r->print('<br /><b>'.&mt('Set the default page to be displayed when you select a course role').'</b>&nbsp;'.&mt('(Currently: [_1])',$pagenames{$currvalue}).'<br />'.&mt('The global user preference you set for your courses can be overridden in an individual course by setting a course specific setting via the "[_1]" page in the course',"<i>What's New</i>").'<br /><br />');      $r->print('<br /><b>'
                .&mt('Set the default page to be displayed when you select a course role')
                .'</b>&nbsp;'
                .&mt('(Currently: [_1])',$pagenames{$currvalue})
                .'<br />'
                .&mt("The global user preference you set for your courses can be overridden in an individual course by setting a course specific setting via the [_1]What's New Page[_2] in the course.",'<i>','</i>')
                .'<br /><br />'
       );
     $r->print(<<ENDLSCREEN);      $r->print(<<ENDLSCREEN);
 <form name="prefs" action="/adm/preferences" method="post">  <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_coursepage" />  <input type="hidden" name="action" value="verify_and_change_coursepage" />
Line 1276  sub coursedisplaychanger { Line 1861  sub coursedisplaychanger {
 <label><input type="radio" name="newdisp" value="firstres" $firstselect /> $whatsnew_off</label><br />  <label><input type="radio" name="newdisp" value="firstres" $firstselect /> $whatsnew_off</label><br />
 <label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label><input type="hidden" name="refpage" value="$env{'form.refpage'}" />  <label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label><input type="hidden" name="refpage" value="$env{'form.refpage'}" />
 ENDLSCREEN  ENDLSCREEN
     $r->print('<br /><br /><input type="submit" value="'.&mt('Change').'" />      $r->print('<br /><br /><input type="submit" value="'.&mt('Save').'" />
 </form>');  </form>');
 }  }
   
Line 1289  sub verify_and_change_coursepage { Line 1874  sub verify_and_change_coursepage {
         'ywbt' => 'you will be taken to the start of the course.',          'ywbt' => 'you will be taken to the start of the course.',
         'apwb' => 'a page will be displayed that lists items in the course that may require action from you.',          'apwb' => 'a page will be displayed that lists items in the course that may require action from you.',
         'gtts' => 'Go to the start of the course',          'gtts' => 'Go to the start of the course',
         'dasp' => "Display the What's New page listing course action items",           'dasp' => "Display the What's New Page", 
     );      );
     my $newdisp  = $env{'form.newdisp'};      my $newdisp  = $env{'form.newdisp'};
     $message = '<b>'.$lt{'defs'}.'</b>: '.$lt{'when'}.', ';      $message = '<b>'.$lt{'defs'}.'</b>: '.$lt{'when'}.', ';
     if ($newdisp eq 'firstres') {      if ($newdisp eq 'firstres') {
         $message .= $lt{'ywbt'}.'<br />';          $message .= $lt{'ywbt'}.'<br />';
         &Apache::lonnet::put('environment',{'course_init_display' => $newdisp});          &Apache::lonnet::put('environment',{'course_init_display' => $newdisp});
         &Apache::lonnet::appenv('environment.course_init_display' => $newdisp);          &Apache::lonnet::appenv({'environment.course_init_display' => $newdisp});
     } else {      } else {
         $message .= $lt{'apwb'}.'<br />';          $message .= $lt{'apwb'}.'<br />';
         &Apache::lonnet::del('environment',['course_init_display']);          &Apache::lonnet::del('environment',['course_init_display']);
         &Apache::lonnet::delenv('environment\.course_init_display');          &Apache::lonnet::delenv('environment.course_init_display');
     }      }
     my $refpage = $env{'form.refpage'};      my $refpage = $env{'form.refpage'};
     if (($env{'request.course.fn'}) && ($env{'request.course.id'})) {      if (($env{'request.course.fn'}) && ($env{'request.course.id'})) {
Line 1309  sub verify_and_change_coursepage { Line 1894  sub verify_and_change_coursepage {
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; 
             my ($furl,$ferr)=              my ($furl,$ferr)=
                 &Apache::lonuserstate::readmap($cdom.'/'.$cnum);                  &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
             $message .= '<br /><font size="+1"><a href="'.$furl.'">'.$lt{'gtts'}.' <i>'.&mt('now').'</i></a></font>';              $message .= '<br /><a href="'.$furl.'">'.$lt{'gtts'}.' <i>'.&mt('now').'</i></a>';
         } else {          } else {
             $message .= '<br /><font size="+1"><a href="/adm/whatsnew?refpage='.              $message .= '<br /><a href="/adm/whatsnew?refpage='.
                         $refpage.'">'.$lt{'dasp'}.'</a></font>';                          $refpage.'">'.$lt{'dasp'}.'</a>';
         }          }
     }      }
     $r->print(<<ENDVCSCREEN);      $message = &Apache::lonhtmlcommon::confirm_success($message);
 $message      $message = &Apache::loncommon::confirmwrapper($message);
 <br /><br />      &print_main_menu($r,$message);
 ENDVCSCREEN  
 }  }
   
   sub author_space_settings {
       my $r = shift;
       &Apache::lonhtmlcommon::add_breadcrumb(
               {   href => '/adm/preferences?action=authorsettings',
                   text => 'Authoring Space Settings'});
       my $user       = $env{'user.name'};
       my $domain     = $env{'user.domain'};
       my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
       if (keys(%author_roles) > 0) {
               $r->print(Apache::loncommon::start_page('Authoring Space Settings'));
               $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings'));
               my %userenv = &Apache::lonnet::get('environment',['nocodemirror']);
               my $constchecked='';
               if ($env{'environment.nocodemirror'}) {
                  $constchecked=' checked="checked"';
               }
               my $text=&mt('By default, CodeMirror an editor with advanced functionality for editing code is activated for authors.');
               my $cmoff=&mt('Deactivate CodeMirror. This can improve performance on slow computers and accessibility.');
               my $change=&mt('Save');
               my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
               $r->print(<<ENDSCREEN);
           <form name="prefs" action="/adm/preferences" method="post">
           <input type="hidden" name="returnurl" value="$returnurl" />
           <input type="hidden" name="action" value="change_authoring_settings" />
           $text<br />
           <label><input type="checkbox" name="cmoff"$constchecked />$cmoff</label><br />
           <input type="submit" value="$change" />
           </form>
   ENDSCREEN
       }
   }
   
   sub change_authoring_settings {
       my $r = shift;
       my $user       = $env{'user.name'};
       my $domain     = $env{'user.domain'};
       my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
       if (keys(%author_roles) > 0) {
               my %ausettings=('environment.nocodemirror' => '');
               if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; }
               &Apache::lonnet::put('environment',\%ausettings);
               &Apache::lonnet::appenv({'environment.nocodemirror' => $ausettings{'environment.nocodemirror'}});
               my $status='';
               if ($ausettings{'environment.nocodemirror'} eq 'yes') {
                   $status=&mt('on');
               } else {
                   $status=&mt('off');
               }
               my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Deactivate CodeMirror in Authoring Space').'</i>','<tt>'.$status.'</tt>'));
               $message=&Apache::loncommon::confirmwrapper($message);
               if ($env{'form.returnurl'}) {
                   &do_redirect($r,$env{'form.returnurl'},$message);
               } else {
                   &print_main_menu($r,$message);
               }
       }
   }
   
   sub lockednameschanger {
       my $r = shift;
       &Apache::lonhtmlcommon::add_breadcrumb(
               {   href => '/adm/preferences?action=changelockednames',
                   text => 'Automatic name changes'});
       $r->print(Apache::loncommon::start_page('Automatic name changes'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Allow/disallow name updates'));
       my %userenv = &Apache::lonnet::get('environment',['lockedname']);
       my $lockedname='';
       if (&can_toggle_namelocking()) {
           if ($userenv{'lockedname'}) {
               $lockedname = ' checked="checked"';
           }
           my %updateable;
           my %domconfig =
               &Apache::lonnet::get_dom('configuration',['autoupdate'],$env{'user.domain'});
           if (ref($domconfig{'autoupdate'}) eq 'HASH') {
               if ($domconfig{'autoupdate'}{'run'}) {
                   my @inststatuses = split(':',$env{'environment.inststatus'});
                   unless (@inststatuses) {
                       @inststatuses = ('default');
                   }
                   %updateable = &updateable_userinfo($domconfig{'autoupdate'},\@inststatuses);
               }
           }
           if (keys(%updateable)) {
               my %longnames = &Apache::lonlocal::texthash (
                                   firstname  => 'First Name',
                                   middlename => 'Middle Name',
                                   lastname   => 'Last Name',
                               );
               my $text=&mt('By default, based on your institutional affiliation, your LON-CAPA account can be automatically updated nightly based on directory information from your institution.').'<br />'.&mt('The following may be updated, unless you disallow updates:').
                        '<ul>';
              foreach my $item ('firstname','middlename','lastname') {
                  if ($updateable{$item}) {
                      $text .= '<li>'.$longnames{$item}.'</li>';
                  }
              }
              $text .= '</ul>'; 
              my $locking=&mt('Disallow automatic updates to name information for your LON-CAPA account');
              my $change=&mt('Save');
              $r->print(<<ENDSCREEN);
   <form name="prefs" action="/adm/preferences" method="post">
   <input type="hidden" name="action" value="verify_and_change_lockednames" />
   $text<br />
   <label><input type="checkbox" value="1" name="lockednames"$lockedname />$locking</label><br />
   <input type="submit" value="$change" />
   </form>
   ENDSCREEN
           } else {
               my $message = &mt('Based on your institutional affiliation no name information is automatically updated for your LON-CAPA account.');
               &print_main_menu($r,$message);
           }
       } else {
           my $message = &mt('You are not permitted to set a user preference for automatic name updates for your LON-CAPA account.');
           &print_main_menu($r,$message);
       }
   }
   
   sub verify_and_change_lockednames {
       my $r = shift;
       my $message;
       if (&can_toggle_namelocking()) {
           my $newlockedname = $env{'form.lockednames'};
           $newlockedname =~ s/\D//g;
           my $currlockedname = $env{'environment.lockedname'};
           if ($newlockedname ne $currlockedname) {
               if ($newlockedname) {
                   if (&Apache::lonnet::put('environment',{lockedname => $newlockedname}) eq 'ok') {
                       &Apache::lonnet::appenv({'environment.lockedname' => $newlockedname});
                   }
               } elsif (&Apache::lonnet::del('environment',['lockedname']) eq 'ok') {
                   &Apache::lonnet::delenv('environment.lockedname');
               }
           }
           my $status='';
           if ($newlockedname) {
               $status=&mt('disallowed');
           } else {
               $status=&mt('allowed');
           }
           $message=&Apache::lonhtmlcommon::confirm_success(&mt('[_1] set to [_2]','<i>'.&mt('Automatic update of first, middle and last names if institutional directory information indicates changes').'</i>','<tt>'.$status.'</tt>'));
           $message=&Apache::loncommon::confirmwrapper($message);
       }
       &print_main_menu($r,$message);
   }
   
   sub print_main_menu {
       my ($r, $message) = @_;
       # Determine current authentication method
       my $user = $env{'user.name'};
       my $domain = $env{'user.domain'};
       my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
   
       # build the data structure for menu generation
   my $aboutmeurl='/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';
   my $role = ($env{'user.adv'} ? 'Roles' : 'Course');
   my %permissions;
   if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) {
       $permissions{'aboutme'} = 'F';
   }
   my @menu=
       ({ categorytitle=>'Personal Data',
    items =>[
       { linktext => 'Personal Information Page',
    url => $aboutmeurl,
    permission => $permissions{'aboutme'},
    #help => 'Prefs_About_Me',
    icon => 'system-users.png',
    linktitle => 'Edit information about yourself that should be displayed on your public profile.'
       },
       { linktext => 'Screen Name',
    url => '/adm/preferences?action=changescreenname',
    permission => 'F',
    #help => 'Prefs_Screen_Name_Nickname',
    icon => 'preferences-desktop-font.png',
    linktitle => 'Change the name that is displayed in your posts.'
       },
    ]
       },
       { categorytitle=>'Content Display Settings',
    items =>[
       { linktext => 'Language',
    url => '/adm/preferences?action=changelanguages',
    permission => 'F',
    #help => 'Prefs_Language',
    icon => 'preferences-desktop-locale.png',
    linktitle => 'Choose the default language for this user.'
       },
       { linktext => $role.' Page',
    url => '/adm/preferences?action=changerolespref',
    permission => 'F',
    #help => '',
    icon => 'role_hotlist.png',
    linktitle => 'Configure the roles hotlist.'
       },
       { linktext => 'Math display settings',
    url => '/adm/preferences?action=changetexenginepref',
    permission => 'F',
    #help => '',
    icon => 'dismath.png',
    linktitle => 'Change how math is displayed.'
       },
    ]
       },
       { categorytitle=>'Page Display Settings',
    items =>[
       { linktext => 'Color Scheme',
    url => '/adm/preferences?action=changecolors',
    permission => 'F',
    #help => 'Change_Colors',
    icon => 'preferences-desktop-theme.png',
    linktitle => 'Change LON-CAPA default colors.'
       },
               {   linktext => 'Menu Display',
                   url => '/adm/preferences?action=changeicons',
                   permission => 'F',
                   #help => '',
                   icon => 'preferences-system-windows.png',
                   linktitle => 'Change whether the menus are displayed with icons or icons and text.'
               }
    ]
       },
       { categorytitle=>'Messages &amp; Notifications',
    items =>[
       { linktext => 'Messages &amp; Notifications',
    url => '/adm/preferences?action=changemsgforward',
    permission => 'F',
    #help => 'Prefs_Messages',
    icon => 'mail-reply-all.png',
    linktitle => 'Change messageforwarding or notifications settings.'
       },
       { linktext => 'Discussion Display',
    url => '/adm/preferences?action=changediscussions',
    permission => 'F',
    #help => 'Change_Discussion_Display',
    icon => 'chat.png',
    linktitle => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.'
       },
    ]
       },
       { categorytitle=>'Other',
    items =>[
       { linktext => 'Register Response Devices (&quot;Clickers&quot;)',
    url => '/adm/preferences?action=changeclicker',
    permission => 'F',
    #help => '',
    icon => 'network-workgroup.png',
    linktitle => 'Register your clicker.'
       },
    ]
       },
       );
   
       if ($currentauth =~ /^(unix|internal):/) {
   push(@{ $menu[0]->{items} }, {
    linktext => 'Password',
    url => '/adm/preferences?action=changepass',
    permission => 'F',
    #help => 'Change_Password',
    icon => 'emblem-readonly.png',
    linktitle => 'Change your password.',
    });
       }
   
       if (&can_toggle_namelocking()) {
           push(@{ $menu[0]->{items} }, {
           linktext => 'Automatic name changes',
           url => '/adm/preferences?action=changelockednames',
           permission => 'F',
           #help => '',
           icon => 'system-lock-screen.png',
           linktitle => 'Allow/disallow propagation of name changes from institutional directory service',
           });
       }
   
       my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
       if (keys(%author_roles) > 0) {
   push(@{ $menu[4]->{items} }, {
    linktext => 'Restrict Domain Coordinator Access',
    url => '/adm/preferences?action=changedomcoord',
    permission => 'F',
    #help => '',
    icon => 'system-lock-screen.png',
    linktitle => 'Restrict domain coordinator access.',
    });
       }
   
       if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
    || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
       .$env{'request.course.sec'})) {
   push(@{ $menu[4]->{items} }, {
    linktext => 'Course Initialization',
    url => '/adm/preferences?action=changecourseinit',
    permission => 'F',
    #help => '',
    icon => 'course_ini.png',
    linktitle => 'Set the default page to be displayed when you select a course role.',
    });
   
       }
   
       my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
       if (keys(%author_coauthor_roles) > 0) {
           push(@{ $menu[4]->{items} }, {
               linktext => 'Authoring Space Configuration',
               url => '/adm/preferences?action=authorsettings',
               permission => 'F',
               icon => 'codemirror.png',
               linktitle => 'Settings for your authoring space.',
           });
       }
   
       if (&can_toggle_debug()) {
   push(@{ $menu[4]->{items} }, {
    linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'),
    url => '/adm/preferences?action=debugtoggle',
    permission => 'F',
    #help => '',
    icon => 'blog.png',
    linktitle => 'Toggle Debug Messages.',
    });
       }
   
       $r->print(&Apache::loncommon::start_page('My Space'));
       $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Preferences'));
       $r->print($message);
       $r->print(Apache::lonhtmlcommon::generate_menu(@menu));
       $r->print(Apache::loncommon::end_page());
   }
   
 ######################################################  ######################################################
 #            other handler subroutines               #  #            other handler subroutines               #
Line 1329  ENDVCSCREEN Line 2241  ENDVCSCREEN
 ################################################################  ################################################################
 #                          Main handler                        #  #                          Main handler                        #
 ################################################################  ################################################################
 sub handler {  sub handler {    
     my $r = shift;      my $r = shift;
     my $user = $env{'user.name'};      Apache::loncommon::content_type($r,'text/html');
     my $domain = $env{'user.domain'};  
     &Apache::loncommon::content_type($r,'text/html');  
     # Some pages contain DES keys and should not be cached.      # Some pages contain DES keys and should not be cached.
     &Apache::loncommon::no_cache($r);      Apache::loncommon::no_cache($r);
     $r->send_http_header;      $r->send_http_header;
     return OK if $r->header_only;      return OK if $r->header_only;
     #      #
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                    ['action','wysiwyg','returnurl','refpage']);                                     ['action','wysiwyg','returnurl','refpage']);
     #      #
     &Apache::lonhtmlcommon::clear_breadcrumbs();      Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb      my ($brlink,$brtxt,$brhelp);
         ({href => '/adm/preferences',      if (($env{'form.action'} eq 'changerolespref') && ($env{'form.returnurl'} eq '/adm/roles')) {
           text => 'Set User Preferences'});          $brlink ='/adm/roles';
           $brtxt = 'User Roles';
     my @Options;      } elsif ((($env{'form.action'} eq 'changedomcoord') ||
     # Determine current authentication method                ($env{'form.action'} eq 'authorsettings')) &&
     my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);               (($env{'form.returnurl'} =~ m{^/(priv/|res($|/))}) ||
     if ($currentauth =~ /^(unix|internal):/) {                ($env{'form.returnurl'} eq '/adm/createuser'))) {
         push (@Options,({ action   => 'changepass',          $brlink = $env{'form.returnurl'};
                           linktext => 'Change Password',          if ($env{'form.returnurl'} eq '/adm/createuser') {
                           href     => '/adm/preferences',              $brtxt = 'User Management';
                           help     => 'Change_Password',          } elsif ($env{'form.returnurl'} =~ m{^/res($\/)}) {
                           subroutine => \&passwordchanger,              $brtxt = 'Browse published resources';
                           breadcrumb =>           } else {
                               { href => '/adm/preferences?action=changepass',              $brtxt = 'Authoring Space';
                                 text => 'Change Password'},  
                           },  
                         { action => 'verify_and_change_pass',  
                           subroutine => \&verify_and_change_password,  
                           breadcrumb =>   
                               { href =>'/adm/preferences?action=changepass',  
                                 text => 'Change Password'},  
                           printmenu => 'not_on_error',  
                           }));  
     }  
     push (@Options,({ action   => 'changescreenname',  
                       linktext => 'Change Screen Name',  
                       href     => '/adm/preferences',  
                       help     => 'Prefs_Screen_Name_Nickname',  
                       subroutine => \&screennamechanger,  
                       breadcrumb =>   
                           { href => '/adm/preferences?action=changescreenname',  
                             text => 'Change Screen Name'},  
                       },  
                     { action   => 'verify_and_change_screenname',  
                       subroutine => \&verify_and_change_screenname,  
                       breadcrumb =>   
                           { href => '/adm/preferences?action=changescreenname',  
                             text => 'Change Screen Name'},  
                       printmenu => 'yes',  
                       }));  
   
     push (@Options,({ action   => 'changemsgforward',  
                       linktext => 'Change Message Forwarding and Notification Email Addresses',  
                       href     => '/adm/preferences',  
                       help     => 'Prefs_Forwarding',  
                       breadcrumb =>   
                           { href => '/adm/preferences?action=changemsgforward',  
                             text => 'Change Message Forwarding'},  
                       subroutine => \&msgforwardchanger,  
                       },  
                     { action => 'verify_and_change_msgforward',  
                       breadcrumb =>   
                           { href => '/adm/preferences?action=changemsgforward',  
                             text => 'Change Message Forwarding'},  
                       printmenu => 'yes',  
                       subroutine => \&verify_and_change_msgforward }));  
     my $aboutmeaction=  
         '/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';  
     push (@Options,{ action => 'none',   
                      linktext =>  
                          q{Edit the 'About Me' Personal Information Screen},  
      help => 'Prefs_About_Me',  
                      href => $aboutmeaction});  
     push (@Options,({ action => 'changecolors',  
                       linktext => 'Change Color Scheme',  
                       href => '/adm/preferences',  
                       help => 'Change_Colors',  
                       breadcrumb =>   
                           { href => '/adm/preferences?action=changecolors',  
                             text => 'Change Colors'},  
                       subroutine => \&colorschanger,  
                   },  
                     { action => 'verify_and_change_colors',  
                       breadcrumb =>   
                           { href => '/adm/preferences?action=changecolors',  
                             text => 'Change Colors'},  
                       printmenu => 'yes',  
                       subroutine => \&verify_and_change_colors,  
                       }));  
     push (@Options,({ action => 'changelanguages',  
                       linktext => 'Change Language Preferences',  
                       href => '/adm/preferences',  
       help => 'Prefs_Language',  
                       breadcrumb=>  
                           { href => '/adm/preferences?action=changelanguages',  
                             text => 'Change Language'},  
                       subroutine =>  \&languagechanger,  
                   },  
                     { action => 'verify_and_change_languages',  
                       breadcrumb=>  
                           {href => '/adm/preferences?action=changelanguages',  
                            text => 'Change Language'},  
                       printmenu => 'yes',  
                       subroutine=>\&verify_and_change_languages, }  
                     ));  
     push (@Options,({ action => 'changewysiwyg',  
                       linktext => 'Change WYSIWYG Editor Preferences',  
                       href => '/adm/preferences',  
                       breadcrumb =>   
                             { href => '/adm/preferences?action=changewysiwyg',  
                               text => 'Change WYSIWYG Preferences'},  
                       subroutine => \&wysiwygchanger,  
                   },  
                     { action => 'set_wysiwyg',  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changewysiwyg',  
                             text => 'Change WYSIWYG Preferences'},  
                       printmenu => 'yes',  
                       subroutine => \&verify_and_change_wysiwyg, }  
                     ));  
     push (@Options,({ action => 'changediscussions',  
                       linktext => 'Change Discussion Display Preferences',  
                       href => '/adm/preferences',  
                       help => 'Change_Discussion_Display',  
                       breadcrumb =>   
                             { href => '/adm/preferences?action=changediscussions',  
                               text => 'Change Discussion Preferences'},  
                       subroutine => \&discussionchanger,  
                   },  
                     { action => 'verify_and_change_discussion',  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changediscussions',  
                             text => 'Change Discussion Preferences'},  
                       printmenu => 'yes',  
                       subroutine => \&verify_and_change_discussion, }  
                     ));  
   
     my $role = ($env{'user.adv'} ? 'Roles' : 'Course');  
     push (@Options,({ action   => 'changerolespref',  
                       linktext => 'Change '.$role.' Page Preferences',  
                       href     => '/adm/preferences',  
                       subroutine => \&rolesprefchanger,  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changerolespref',  
                             text => 'Change '.$role.' Page Pref'},  
                       },  
                     { action   => 'verify_and_change_rolespref',  
                       subroutine => \&verify_and_change_rolespref,  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changerolespref',  
                             text => 'Change '.$role.' Page Preferences'},  
                       printmenu => 'yes',  
                       }));  
   
     push (@Options,({ action   => 'changetexenginepref',  
                       linktext => 'Change How Math Equations Are Displayed',  
                       href     => '/adm/preferences',  
                       subroutine => \&texenginechanger,  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changetexenginepref',  
                             text => 'Change Math Pref'},  
                       },  
                     { action   => 'verify_and_change_texengine',  
                       subroutine => \&verify_and_change_texengine,  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changetexenginepref',  
                             text => 'Change Math Preferences'},  
                       printmenu => 'yes',  
                       }));  
   
     if ($env{'environment.remote'} eq 'off') {  
  push (@Options,({ action => 'launch',  
   linktext => 'Launch Remote Control',  
   href => '/adm/remote?url=/adm/preferences',  
       }));  
     } else {  
  push (@Options,({ action => 'collapse',  
   linktext => 'Collapse Remote Control',  
   href => '/adm/remote?url=/adm/preferences',  
       }));  
     }  
   
     push (@Options,({ action   => 'changeicons',  
                       linktext => 'Change How Main Menu is Displayed',  
                       href     => '/adm/preferences',  
                       subroutine => \&iconchanger,  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changeicons',  
                             text => 'Change Main Menu'},  
                       },  
                     { action   => 'verify_and_change_icons',  
                       subroutine => \&verify_and_change_icons,  
                       breadcrumb =>  
                           { href => '/adm/preferences?action=changeicons',  
                             text => 'Change Main Menu'},  
                       printmenu => 'yes',  
                       }));  
   
     if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})  
  || &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'  
     .$env{'request.course.sec'})) {  
         push (@Options,({ action => 'changecourseinit',  
                           linktext => 'Change Course Initialization Preference',  
                           href => '/adm/preferences',  
                           subroutine => \&coursedisplaychanger,  
                           breadcrumb =>  
                               { href => '/adm/preferences?action=changecourseinit',  
                                 text => 'Change Course Init. Pref.'},  
                           },  
                         { action => 'verify_and_change_coursepage',  
                           breadcrumb =>  
                           { href => '/adm/preferences?action=changecourseinit',                               text => 'Change Course Initialization Preference'},  
                         printmenu => 'yes',  
                         subroutine => \&verify_and_change_coursepage,  
                        }));  
     }  
   
     if ($env{'user.name'} =~ /^(albertel|fox|foxr|koretemey|korte|hallmat3|turtle|raeburn)$/) {  
         push (@Options,({ action => 'debugtoggle',  
                           printmenu => 'yes',  
                           subroutine => \&toggle_debug,  
                           }));  
     }  
   
     $r->print(&Apache::loncommon::start_page('Change Preferences'));  
   
     my $call = undef;  
     my $help = undef;  
     my $printmenu = 'yes';  
     foreach my $option (@Options) {  
         if ($option->{'action'} eq $env{'form.action'}) {  
             $call = $option->{'subroutine'};  
             $printmenu = $option->{'printmenu'};  
             if (exists($option->{'breadcrumb'})) {  
                 &Apache::lonhtmlcommon::add_breadcrumb  
                     ($option->{'breadcrumb'});  
             }  
     $help=$option->{'help'};  
         }  
     }  
     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Change Preferences',$help));  
     my $error;  
     if (defined($call)) {  
         $error = $call->($r);  
     }  
     if ( ( ($printmenu eq 'yes')  
    || ($printmenu eq 'not_on_error' && !$error) )  
  && (!$env{'form.returnurl'})) {  
         my $optionlist = '<table cellpadding="5">';  
         if ($env{'user.name'} =~   
                          /^(albertel|kortemey|fox|foxr|korte|hallmat3|turtle|raeburn)$/  
             ) {  
             push (@Options,({ action => 'debugtoggle',  
                               linktext => 'Toggle Debug Messages',  
                               text => 'Current Debug status is -'.  
                                   $env{'user.debug'}.'-.',  
                               href => '/adm/preferences',  
                               printmenu => 'yes',  
                               subroutine => \&toggle_debug,  
                               }));  
         }  
         foreach my $option(@Options) {  
             my $optiontext = '';  
             if (exists($option->{'href'})) {  
  $option->{'href_args'}{'action'}=$option->{'action'};  
  $optiontext .=   
                     '<a href="'.&add_get_param($option->{'href'},  
        $option->{'href_args'}).'">'.  
                     &mt($option->{'linktext'}).'</a>';  
             }  
             if (exists($option->{'text'})) {  
                 $optiontext .= ' '.&mt($option->{'text'});  
             }  
             if ($optiontext ne '') {  
                 $optiontext = '<font size="+1">'.$optiontext.'</font>';   
                 my $helplink = '&nbsp;';  
                 if (exists($option->{'help'})) {  
                     $helplink = &Apache::loncommon::help_open_topic  
                                                     ($option->{'help'});  
                 }  
                 $optionlist .= '<tr>'.  
                     '<td>'.$helplink.'</td>'.  
                     '<td>'.$optiontext.'</td>'.  
                     '</tr>';  
             }  
         }          }
         $optionlist .= '</table>';      } else {
         $r->print($optionlist);          $brlink ='/adm/preferences';
     } elsif ($env{'form.returnurl'}) {          $brtxt = 'Set User Preferences';
  $r->print('<br /><a href="'.$env{'form.returnurl'}.'"><font size="+1">'.          $brhelp = 'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display';   
   &mt('Return').'</font></a>');      }
       Apache::lonhtmlcommon::add_breadcrumb
           ({href => $brlink,
             text => $brtxt,
             help => $brhelp,});
       if(!exists $env{'form.action'}) {
    &print_main_menu($r);
       }elsif($env{'form.action'} eq 'changepass'){
           &passwordchanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_pass'){
           &verify_and_change_password($r,'preferences');
       }elsif($env{'form.action'} eq 'changescreenname'){
           &screennamechanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_screenname'){
           &verify_and_change_screenname($r);
       }elsif($env{'form.action'} eq 'changemsgforward'){
           &msgforwardchanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_msgforward'){
           &verify_and_change_msgforward($r);
       }elsif($env{'form.action'} eq 'changecolors'){
           &colorschanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_colors'){
           &verify_and_change_colors($r);
       }elsif($env{'form.action'} eq 'changelanguages'){
           &languagechanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_languages'){
           &verify_and_change_languages($r);
       }elsif($env{'form.action'} eq 'changewysiwyg'){
           &wysiwygchanger($r);
       }elsif($env{'form.action'} eq 'set_wysiwyg'){
           &verify_and_change_wysiwyg($r);
       }elsif($env{'form.action'} eq 'changediscussions'){
           &discussionchanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_discussion'){
           &verify_and_change_discussion($r);
       }elsif($env{'form.action'} eq 'changerolespref'){
           &rolesprefchanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_rolespref'){
           &verify_and_change_rolespref($r);
       }elsif($env{'form.action'} eq 'changetexenginepref'){
           &texenginechanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_texengine'){
           &verify_and_change_texengine($r);
       }elsif($env{'form.action'} eq 'changeicons'){
           &iconchanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_icons'){
           &verify_and_change_icons($r);
       }elsif($env{'form.action'} eq 'changeclicker'){
           &clickerchanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_clicker'){
           &verify_and_change_clicker($r);
       }elsif($env{'form.action'} eq 'changedomcoord'){
           &domcoordchanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){
           &verify_and_change_domcoord($r);
       }elsif($env{'form.action'} eq 'lockwarning'){
           &lockwarning($r);
       }elsif($env{'form.action'} eq 'verify_and_change_locks'){
           &verify_and_change_lockwarning($r);
       }elsif($env{'form.action'} eq 'changecourseinit'){
           &coursedisplaychanger($r);
       }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){
           &verify_and_change_coursepage($r);
       }elsif($env{'form.action'} eq 'authorsettings'){
           &author_space_settings($r);
       }elsif($env{'form.action'} eq 'change_authoring_settings'){
           &change_authoring_settings($r);
       }elsif($env{'form.action'} eq 'debugtoggle'){
           if (&can_toggle_debug()) {
               &toggle_debug();
           }
    &print_main_menu($r);
       } elsif ($env{'form.action'} eq 'changelockednames') {
           &lockednameschanger($r);
       } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') {
           &verify_and_change_lockednames($r);
       }
   
       # Properly end the HTML page of all preference pages
       # started in each sub routine
       # Exception: print_main_menu has its own end_page call
       unless (!exists $env{'form.action'} ||
               $env{'form.action'} eq 'debugtoggle') {
           $r->print(&Apache::loncommon::end_page());
     }      }
     $r->print(&Apache::loncommon::end_page());  
     return OK;      return OK;
 }  }
   
 sub toggle_debug {  sub toggle_debug {
     if ($env{'user.debug'}) {      if ($env{'user.debug'}) {
         &Apache::lonnet::delenv('user\.debug');          &Apache::lonnet::delenv('user.debug');
     } else {      } else {
         &Apache::lonnet::appenv('user.debug' => 1);          &Apache::lonnet::appenv({'user.debug' => 1});
     }      }
 }  }
   
   sub can_toggle_debug {
       my $can_toggle = 0;
       my $page = 'toggledebug';
       if (&LONCAPA::lonauthcgi::can_view($page)) {
           $can_toggle = 1;
       } elsif (&LONCAPA::lonauthcgi::check_ipbased_access($page)) {
           $can_toggle = 1;
       }
       return $can_toggle;
   }
   
   sub can_toggle_namelocking {
       my $lockablenames;
       my %domconfig =
           &Apache::lonnet::get_dom('configuration',['autoupdate'],$env{'user.domain'});
       if (ref($domconfig{'autoupdate'}) eq 'HASH') {
           if ($domconfig{'autoupdate'}{'run'}) {
               my @inststatuses = split(':',$env{'environment.inststatus'});
               unless (@inststatuses) {
                   @inststatuses = ('default');
               }
               my %updateable = &updateable_userinfo($domconfig{'autoupdate'},\@inststatuses);
               if ($updateable{'lastname'} || $updateable{'firstname'} ||
                   $updateable{'middlename'}) { 
                   if (ref($domconfig{'autoupdate'}{'lockablenames'}) eq 'ARRAY') {
                       unless (@inststatuses) {
                           @inststatuses = ('default');
                       }
                       foreach my $status (@inststatuses) {
                           if (grep(/^\Q$status\E$/,@{$domconfig{'autoupdate'}{'lockablenames'}})) {
                               $lockablenames = 1;
                               last;
                           }
                       }
                   }
               }
           }
       }
       return $lockablenames;
   }
   
   sub updateable_userinfo {
       my ($autoupdate,$inststatuses) = @_;
       my %updateable;
       return %updateable unless ((ref($autoupdate) eq 'HASH') && 
                                  (ref($inststatuses) eq 'ARRAY'));
       if (ref($autoupdate->{'fields'}) eq 'HASH') {
           foreach my $status (@{$inststatuses}) {
               if (ref($autoupdate->{'fields'}{$status}) eq 'ARRAY') {
                   foreach my $field (@{$autoupdate->{'fields'}{$status}}) {
                       $updateable{$field} = 1;
                   }
               }
           }
       }
       return %updateable;
   }
   
   sub do_redirect {
       my ($r,$url,$msg) = @_;
       $r->print(
           &Apache::loncommon::start_page('Switching Server ...',undef,
                                          {'redirect'       => [0.5,$url]}).
           '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
           "$msg\n".
           &Apache::loncommon::end_page());
       return;
   }
   
 1;  1;
 __END__  __END__

Removed from v.1.99  
changed lines
  Added in v.1.225


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