--- loncom/interface/lonpreferences.pm	2007/05/08 18:26:54	1.103
+++ loncom/interface/lonpreferences.pm	2008/05/28 01:45:48	1.122
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.103 2007/05/08 18:26:54 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.122 2008/05/28 01:45:48 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -123,7 +123,7 @@ sub verify_and_change_wysiwyg {
     my $r = shift;
     my $newsetting=$env{'form.wysiwyg'};
     &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>');
 }
 
@@ -167,12 +167,12 @@ sub verify_and_change_languages {
     my $message='';
     if ($newlanguage) {
         &Apache::lonnet::put('environment',{'languages' => $newlanguage});
-        &Apache::lonnet::appenv('environment.languages' => $newlanguage);
-        $message='Set new preferred languages to '.$newlanguage;
+        &Apache::lonnet::appenv({'environment.languages' => $newlanguage});
+        $message=&mt('Set new preferred languages to ').'<tt>"'.$newlanguage.'"</tt>.';
     } else {
         &Apache::lonnet::del('environment',['languages']);
         &Apache::lonnet::delenv('environment\.languages');
-        $message='Reset preferred language';
+        $message=&mt('Reset preferred language.');
     }
     $r->print(<<ENDVCSCREEN);
 $message
@@ -210,7 +210,7 @@ sub texenginechanger {
 </form>
 Examples:
 <p> TeX to HTML <br /> 
-<iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=tth" width="400" hieght="200"></iframe>
+<iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=tth" width="400" height="200"></iframe>
 </p>
 <p>jsMath <br /> 
 $jsMath_start
@@ -230,12 +230,12 @@ if (jsMath.nofonts == 1) {
 	 +'</font></small></div></center>');
 }
 </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=jsMath" width="400" height="120"></iframe>
 
 </p>
 <p> Convert to Images <br />
 <br />
-<iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=mimetex" width="400" hieght="200"></iframe>
+<iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=mimetex" width="400" height="100"></iframe>
 </p>
 ENDLSCREEN
     if ($env{'environment.texengine'} ne 'jsMath') {
@@ -252,21 +252,21 @@ sub verify_and_change_texengine {
     my $newtexengine  = $env{'form.texengine'};
     $newtexengine=~s/[^\-\w]//g;
     if ($newtexengine eq 'ttm') {
-	&Apache::lonnet::appenv('browser.mathml' => 1);
+	&Apache::lonnet::appenv({'browser.mathml' => 1});
     } else {
 	if ($env{'environment.texengine'} eq 'ttm') {
-	    &Apache::lonnet::appenv('browser.mathml' => 0);
+	    &Apache::lonnet::appenv({'browser.mathml' => 0});
 	}
     }
     my $message='';
     if ($newtexengine) {
         &Apache::lonnet::put('environment',{'texengine' => $newtexengine});
-        &Apache::lonnet::appenv('environment.texengine' => $newtexengine);
-        $message='Set new preferred math display to '.$newtexengine;
+        &Apache::lonnet::appenv({'environment.texengine' => $newtexengine});
+        $message=&mt('Set new preferred math display to ').'<tt>"'.$newtexengine.'"</tt>.';
     } else {
         &Apache::lonnet::del('environment',['texengine']);
         &Apache::lonnet::delenv('environment\.texengine');
-        $message='Reset preferred math display.';
+        $message=&mt('Reset preferred math display.');
     }
 
 
@@ -400,7 +400,7 @@ sub verify_and_change_rolespref {
     my $message='<hr />';
     if ($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');
     } else {
         &Apache::lonnet::del('environment',['recentroles']);
@@ -409,7 +409,7 @@ sub verify_and_change_rolespref {
     }
     if ($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";
@@ -467,14 +467,20 @@ sub screennamechanger {
         ('environment',['screenname','nickname']);
     my $screenname=$userenv{'screenname'};
     my $nickname=$userenv{'nickname'};
+    my %lt = &Apache::lonlocal::texthash(
+                                          text_screenname  => 'New screenname (shown if you post anonymously):',
+                                          text_nickname  => 'New nickname (shown if you post non-anonymously):',
+                                          text_submit => 'Change',
+                                        );
     $r->print(<<ENDSCREEN);
 <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_screenname" />
-<br />New screenname (shown if you post anonymously):
+<br />$lt{'text_screenname'}
 <input type="text" size="20" value="$screenname" name="screenname" />
-<br />New nickname (shown if you post non-anonymously):
+<br />$lt{'text_nickname'}
 <input type="text" size="20" value="$nickname" name="nickname" />
-<input type="submit" value="Change" />
+<br />
+<input type="submit" value="$lt{'text_submit'}" />
 </form>
 ENDSCREEN
 }
@@ -489,12 +495,12 @@ sub verify_and_change_screenname {
     my $message='';
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'screenname' => $newscreen});
-        &Apache::lonnet::appenv('environment.screenname' => $newscreen);
-        $message='Set new screenname to '.$newscreen;
+        &Apache::lonnet::appenv({'environment.screenname' => $newscreen});
+        $message=&mt('Set new screenname to ').'<tt>"'.$newscreen.'."</tt>.';
     } else {
         &Apache::lonnet::del('environment',['screenname']);
         &Apache::lonnet::delenv('environment\.screenname');
-        $message='Reset screenname';
+        $message=&mt('Reset screenname.');
     }
 # Nickname
     $message.='<br />';
@@ -502,12 +508,12 @@ sub verify_and_change_screenname {
     $newscreen=~s/[^ \w]//g;
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'nickname' => $newscreen});
-        &Apache::lonnet::appenv('environment.nickname' => $newscreen);
-        $message.='Set new nickname to '.$newscreen;
+        &Apache::lonnet::appenv({'environment.nickname' => $newscreen});
+        $message.=&mt('Set new nickname to ').'<tt>"'.$newscreen.'"</tt>.';
     } else {
         &Apache::lonnet::del('environment',['nickname']);
         &Apache::lonnet::delenv('environment\.nickname');
-        $message.='Reset nickname';
+        $message.=&mt('Reset nickname.');
     }
     &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain);
     $r->print(<<ENDVCSCREEN);
@@ -557,11 +563,127 @@ sub verify_and_change_icons {
     my $newicons  = $env{'form.menumode'};
 
     &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));
 }
 
 ################################################################
+#                     Clicker Subroutines                      #
+################################################################
+
+sub clickerchanger {
+    my $r = shift;
+    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('Register');
+    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>$text $helplink<br />
+<textarea name="clickers" rows="5" cols="20">$clickers</textarea>
+</label>
+<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 $newclickers  = $env{'form.clickers'};
+    $newclickers=~s/[^\w\:\-]+/\,/gs;
+    $newclickers=~tr/a-z/A-Z/;
+    $newclickers=~s/[\:\-]+/\-/g;
+    $newclickers=~s/\,+/\,/g;
+    $newclickers=~s/^\,//;
+    $newclickers=~s/\,$//;
+    &Apache::lonnet::put('environment',{'clickers' => $newclickers});
+    &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
+    $r->print(&mt('Registering clickers: [_1]',$newclickers));
+}
+
+################################################################
+#               Domcoord Access Subroutines                    #
+################################################################
+
+sub domcoordchanger {
+    my $r = shift;
+    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 construction space.');
+    my $construction=&mt('Block access to construction space');
+    my $change=&mt('Change');
+    $r->print(<<ENDSCREEN);
+<form name="prefs" action="/adm/preferences" method="post">
+<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'}});
+    $r->print(&mt('Registering Domain Coordinator access restrictions.'));
+}
+
+#################################################################
+##                      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                                      #
 ################################################################
 
@@ -576,76 +698,115 @@ sub msgforwardchanger {
                                           crit  => 'Critical only',
                                           reg   => 'Non-critical only',
                                           foad  => 'Forwarding Address(es)',
-                                          mnot  => 'Message Notification Email Address(es)',
+                                          noti  => 'Notification E-mail Address(es)', 
+                                          foad_exmpl => 'e.g. <tt>userA:domain1,userB:domain2,...</tt>',
+                                          mnot  => 'Email Address(es) which should be notified about new LON-CAPA messages', # old: 'Message Notification Email Address(es)',
+                                          mnot_exmpl => 'e.g. <tt>joe@doe.com</tt>',
                                           chg   => 'Change',
-                                          email => 'The e-mail address you entered',
+                                          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 to preferences menu',
                                         );
-    my $forwardingHelp = Apache::loncommon::help_open_topic("Prefs_Forwarding",
-							    "What are forwarding ".
-							    "and notification ".
-							    "addresses");
-    my $criticalMessageHelp = Apache::loncommon::help_open_topic("Course_Critical_Message",
-								 "What are critical messages");
+    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">
 function validate() {
-    var checkaddress = 0;
     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['del_notify_'+i].value == false) {
+            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) {
+        if (checkaddress == 1)  {
             var addr = document.prefs.elements['address_'+i].value;
             if (validmail(document.prefs.elements['address_'+i]) == false) {
-                alert("$lt{'email'}: "+addr+" $lt{'notv'}.\\n($lt{'toen'}).");
+                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);
 $jscript
 $message
-$forwardingHelp
+<h3>$lt{'foad'} $forwardingHelp</h3>
 <form name="prefs" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_msgforward" />
-$lt{'foad'} (<tt>user:domain,user:domain,...</tt>):
-<input type="text" size="40" value="$msgforward" name="msgforward" /><hr />
-$criticalMessageHelp
-$lt{'mnot'} (<tt>joe\@doe.com</tt>):<br />
+$lt{'foad'} ($lt{'foad_exmpl'}):
+<input type="text" size="40" value="$msgforward" name="msgforward" /><br />
+<h3>$lt{'noti'} $notificationHelp</h3>
+$lt{'mnot'} ($lt{'mnot_exmpl'}):<br />
 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('Messages to forward').'</th><th>'.
-                 &mt('Excerpt retains HTML tags included in message').'</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><input type="checkbox" name="del_notify_'.$num.'" />'.
-                   &mt('Delete').'</td>'.
+                   '<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.'" /></td><td>';
+                   $num.'" onFocus="javascript:address_changes('."'$num'".
+                   ')" /></td><td>';
         my %chk;
         if (defined($allnot{$item}{'crit'})) {
             if (defined($allnot{$item}{'reg'})) {
@@ -659,7 +820,9 @@ ENDMSG
         foreach my $type ('all','crit','reg') {
             $output .= '<span class="LC_nobreak"><label>'.
                        '<input type="radio" name="notify_type_'.$num. 
-                       '" value="'.$type.'" '.$chk{$type}.'/>'.$lt{$type}.'</label></span>&nbsp;';
+                       '" value="'.$type.'" '.$chk{$type}.
+                       ' onchange="javascript:address_changes('."'$num'".')" />'.
+                       $lt{$type}.'</label></span>&nbsp;';
         }
         my $htmlon = '';
         my $htmloff = '';
@@ -669,11 +832,16 @@ ENDMSG
             $htmloff = 'checked="checked" ';
         }
         $output .= '</td><td><label><input type="radio" name="html_'.$num.
-                   '" value="1" '.$htmlon.'/>'.&mt('Yes').'</label>&nbsp;'.
+                   '" value="1" '.$htmlon.
+                   ' onchange="javascript:address_changes('."'$num'".')" />'.
+                   &mt('Yes').'</label>&nbsp;'.
                    '<label><input type="radio" name="html_'.$num.'" value="0" '.
-                   $htmloff.'/>'.&mt('No').'</label></td>'.
+                   $htmloff. ' onchange="javascript:address_changes('."'$num'".
+')" />'.
+                   &mt('No').'</label></td>'.
                    &Apache::loncommon::end_data_table_row();
         $num ++;
+        $counter ++;
     }
     my %defchk = (
                    all => 'checked="checked" ',
@@ -681,10 +849,12 @@ ENDMSG
                    reg => '',
                  );
     $output .= &Apache::loncommon::start_data_table_row().
-               '<td><input type="checkbox" name="add_notify_'.$num.'" />'.
-               &mt('Add').'</td>'.
+               '<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.
-               '" /></td><td>';
+               '" 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.
@@ -701,7 +871,7 @@ ENDMSG
     $num ++;
     $r->print($output);
     $r->print(qq|
-<hr />
+<br /><hr />
 <input type="hidden" name="numnotify" value="$num" />
 <input type="button" value="$lt{'chg'}" onclick="javascript:validate()" />
 <input type="button" value="$lt{'prme'}" onclick="location.href='/adm/preferences'" />
@@ -738,16 +908,16 @@ sub verify_and_change_msgforward {
 	    if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') {
                $newscreen.=$msuser.':'.$msdomain.',';
 	   } else {
-               $message.= &mt('No such user: ').$msuser.':'.$msdomain.'<br>';
+               $message.= &mt('No such user: ').'<tt>'.$msuser.':'.$msdomain.'</tt><br>';
            }
         }
     }
     $newscreen=~s/\,$//;
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
-        &Apache::lonnet::appenv('environment.msgforward' => $newscreen);
-        $message .= &mt('Set message forwarding to: ').'<tt>'.$newscreen.
-                    '</tt><br />';
+        &Apache::lonnet::appenv({'environment.msgforward' => $newscreen});
+        $message .= &mt('Set message forwarding to ').'<tt>"'.$newscreen.'"</tt>.'
+                    .'<br />';
     } else {
         &Apache::lonnet::del('environment',['msgforward']);
         &Apache::lonnet::delenv('environment\.msgforward');
@@ -757,9 +927,10 @@ sub verify_and_change_msgforward {
     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) && (defined($env{'form.add_notify_'.$lastnotify}))) ||
+           ((($i==$lastnotify) && ($env{'form.add_notify_'.$lastnotify} == 1)) ||
             ($i<$lastnotify))) {
             if (defined($env{'form.address_'.$i})) {
                 if ($env{'form.notify_type_'.$i} eq 'all') {
@@ -773,6 +944,7 @@ sub verify_and_change_msgforward {
                 if ($env{'form.html_'.$i} eq '1') {
 		    $notify_with_html .= $env{'form.address_'.$i}.',';       	
                 }
+                $totaladdresses ++;
             }
         }
     }
@@ -784,31 +956,35 @@ sub verify_and_change_msgforward {
     $notify_with_html =~ s/\s//gs;
     if ($notification) {
         &Apache::lonnet::put('environment',{'notification' => $notification});
-        &Apache::lonnet::appenv('environment.notification' => $notification);
-        $message.=&mt('Set non-critical message notification address(es) to: ').'<tt>'.$notification.'</tt><br />';
+        &Apache::lonnet::appenv({'environment.notification' => $notification});
+        $message.=&mt('Set non-critical message notification address(es) to ').'<tt>"'.$notification.'"</tt>.<br />';
     } else {
         &Apache::lonnet::del('environment',['notification']);
         &Apache::lonnet::delenv('environment\.notification');
-        $message.=&mt("Non-critical message notification set to 'off'.").'<br />';
+        $message.=&mt("Set non-critical message notification to 'off'.").'<br />';
     }
     if ($critnotification) {
         &Apache::lonnet::put('environment',{'critnotification' => $critnotification});
-        &Apache::lonnet::appenv('environment.critnotification' => $critnotification);
-        $message.=&mt('Set critical message notification address(es) to: ').'<tt>'.$critnotification.'</tt><br />';
+        &Apache::lonnet::appenv({'environment.critnotification' => $critnotification});
+        $message.=&mt('Set critical message notification address(es) to ').'<tt>"'.$critnotification.'"</tt>.<br />';
     } else {
         &Apache::lonnet::del('environment',['critnotification']);
         &Apache::lonnet::delenv('environment\.critnotification');
-        $message.=&mt('Critical message notification set to off').'<br />';
+        $message.=&mt("Set critical message notification to 'off'.").'<br />';
     }
     if ($critnotification || $notification) {
         if ($notify_with_html) {
             &Apache::lonnet::put('environment',{'notifywithhtml' => $notify_with_html});
-            &Apache::lonnet::appenv('environment.notifywithhtml' => $notify_with_html);
-            $message.=&mt('Set address(es) to receive excerpts with html retained: ').'<tt>'.$notify_with_html.'</tt>';
+            &Apache::lonnet::appenv({'environment.notifywithhtml' => $notify_with_html});
+            $message.=&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');
-            $message.=&mt("Set all notification address(es) to receive excerpts with html stripped.").'<br />';
+            if ($totaladdresses == 1) {
+                $message.=&mt("Set notification address to receive excerpts with html stripped.");
+            } else {
+                $message.=&mt("Set all notification addresses to receive excerpts with html stripped.");
+            }
         }
     } else {
         &Apache::lonnet::del('environment',['notifywithhtml']);
@@ -817,6 +993,7 @@ sub verify_and_change_msgforward {
     if ($message) {
         $message .= '<br /><hr />';
     }
+    &Apache::loncommon::flush_email_cache($user,$domain);
     &msgforwardchanger($r,$message);
 }
 
@@ -914,17 +1091,17 @@ sub verify_and_change_colors {
         my $entry='color.'.$function.'.'.$item;
 	if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {
 	    &Apache::lonnet::put('environment',{$entry => $color});
-	    &Apache::lonnet::appenv('environment.'.$entry => $color);
-	    $message.='Set '.$colortypes{$item}.' to '.$color.'<br />';
+	    &Apache::lonnet::appenv({'environment.'.$entry => $color});
+	    $message.=&mt('Set '.$colortypes{$item}.' to ').'<tt>"'.$color.'"</tt>.<br />';
 	} else {
 	    &Apache::lonnet::del('environment',[$entry]);
 	    &Apache::lonnet::delenv('environment\.'.$entry);
-	    $message.='Reset '.$colortypes{$item}.'<br />';
+	    $message.=&mt('Reset '.$colortypes{$item}.'.').'<br />';
 	}
     }
     my $now = time;
     &Apache::lonnet::put('environment',{'color.timestamp' => $now});
-    &Apache::lonnet::appenv('environment.color.timestamp' => $now);
+    &Apache::lonnet::appenv({'environment.color.timestamp' => $now});
 
     $r->print(<<ENDVCCOL);
 $message
@@ -953,7 +1130,7 @@ sub passwordchanger {
             $defdom = $r->dir_config('lonDefDomain');
             my %data = &Apache::lonnet::tmpget($mailtoken);
             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(&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.'));
                 return;
             }
             if (defined($data{time})) {
@@ -1062,7 +1239,7 @@ sub jscript_send {
 sub client_form {
     my ($caller,$hexkey,$currentpass,$defdom) = @_;
     my %lt=&Apache::lonlocal::texthash(
-                'email' => 'EMail Address',
+                'email' => 'E-mail Address',
                 'username' => 'Username',
                 'domain' => 'Domain',
                 'currentpass' => 'Current Password',
@@ -1083,7 +1260,7 @@ sub client_form {
      <input type="text" name="uname" size="15" />
      <input type="hidden" name="currentpass" value="$currentpass" />
     </td></tr>
-<tr><td class="LC_preferences_labeltext"><label for="udom">$lt{'udom'}</label>:</td>
+<tr><td class="LC_preferences_labeltext"><label for="udom">$lt{'domain'}</label>:</td>
     <td>
 |;
         $output .= &Apache::loncommon::select_dom_form($defdom,'udom').'
@@ -1222,26 +1399,33 @@ ENDERROR
     #
     if ($caller eq 'reset_by_email') {
         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'}) {
             &passwordchanger($r,
                          '<span class="LC_error">'.
-                         &mt('Could not verify current authentication').'.  '.
-                         &mt('Please try again').'.</span>',$caller,$mailtoken);
+                         &mt('Could not verify current authentication.').'  '.
+                         &mt('Please try again.').'</span>',$caller,$mailtoken);
             return 1;
         }
     } 
     if ($newpass1 ne $newpass2) {
 	&passwordchanger($r,
 			 '<span class="LC_error">'.
-			 &mt('The new passwords you entered do not match').'.  '.
-			 &mt('Please try again').'.</span>',$caller,$mailtoken);
+			 &mt('The new passwords you entered do not match.').'  '.
+			 &mt('Please try again.').'</span>',$caller,$mailtoken);
 	return 1;
     }
     if (length($newpass1) < 7) {
 	&passwordchanger($r,
 			 '<span class="LC_error">'.
-			 &mt('Passwords must be a minimum of 7 characters long').'.  '.
-			 &mt('Please try again').'</span>.',$caller,$mailtoken);
+			 &mt('Passwords must be a minimum of 7 characters long.').'  '.
+			 &mt('Please try again.').'</span>',$caller,$mailtoken);
 	return 1;
     }
     #
@@ -1253,7 +1437,7 @@ ENDERROR
     if ($badpassword) {
 	# I can't figure out how to enter bad characters on my browser.
 	my $errormessage ='<span class="LC_error">'.
-           &mt('The password you entered contained illegal characters').'.<br />'.
+           &mt('The password you entered contained illegal characters.').'<br />'.
            &mt('Valid characters are').(<<"ENDERROR");
 : space and <br />
 <pre>
@@ -1274,7 +1458,7 @@ ENDERROR
     } else {
 	# 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>".
-                  &mt('Please make sure your old password was entered correctly').'.');
+                  &mt('Please make sure your old password was entered correctly.'));
         return 1;
     }
     return;
@@ -1394,11 +1578,11 @@ sub verify_and_change_discussion {
     if (defined($env{'form.discdisp'}) ) {
         my $newdisp  = $env{'form.newdisp'};
         if ($newdisp eq 'unread') {
-            $message .='In discussions: only new posts will be displayed.<br />';
+            $message .=&mt('In discussions: only new posts will be displayed.').'<br />';
             &Apache::lonnet::put('environment',{'discdisplay' => $newdisp});
-            &Apache::lonnet::appenv('environment.discdisplay' => $newdisp);
+            &Apache::lonnet::appenv({'environment.discdisplay' => $newdisp});
         } else {
-            $message .= 'In discussions: all posts will be displayed.<br />';
+            $message .= &mt('In discussions: all posts will be displayed.').'<br />';
             &Apache::lonnet::del('environment',['discdisplay']);
             &Apache::lonnet::delenv('environment\.discdisplay');
         }
@@ -1406,11 +1590,11 @@ sub verify_and_change_discussion {
     if (defined($env{'form.discmark'}) ) {
         my $newmark = $env{'form.newmark'};
         if ($newmark eq 'ondisp') {
-           $message.='In discussions: new posts will be cease to be identified as "new" after display.<br />';
+           $message.=&mt('In discussions: new posts will be cease to be identified as "NEW" after display.').'<br />';
             &Apache::lonnet::put('environment',{'discmarkread' => $newmark});
-            &Apache::lonnet::appenv('environment.discmarkread' => $newmark);
+            &Apache::lonnet::appenv({'environment.discmarkread' => $newmark});
         } else {
-            $message.='In discussions: posts will be identified as "new" until marked as read by the reader.<br />';
+            $message.=&mt('In discussions: posts will be identified as "NEW" until marked as read by the reader.').'<br />';
             &Apache::lonnet::del('environment',['discmarkread']);
             &Apache::lonnet::delenv('environment\.discmarkread');
         }
@@ -1473,7 +1657,7 @@ sub verify_and_change_coursepage {
     if ($newdisp eq 'firstres') {
         $message .= $lt{'ywbt'}.'<br />';
         &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 {
         $message .= $lt{'apwb'}.'<br />';
         &Apache::lonnet::del('environment',['course_init_display']);
@@ -1565,16 +1749,17 @@ sub handler {
     push (@Options,({ action   => 'changemsgforward',
                       linktext => 'Change Message Forwarding and Notification Email Addresses',
                       href     => '/adm/preferences',
-                      help     => 'Prefs_Forwarding',
+                      help     => 'Prefs_Messages',
                       breadcrumb => 
                           { href => '/adm/preferences?action=changemsgforward',
-                            text => 'Change Message Forwarding'},
+                            text => 'Change Message Forwarding/Notification'},
                       subroutine => \&msgforwardchanger,
                       },
                     { action => 'verify_and_change_msgforward',
+                      help   => 'Prefs_Messages',
                       breadcrumb => 
                           { href => '/adm/preferences?action=changemsgforward',
-                            text => 'Change Message Forwarding'},
+                            text => 'Change Message Forwarding/Notification'},
                       printmenu => 'no',
                       subroutine => \&verify_and_change_msgforward }));
     my $aboutmeaction=
@@ -1709,6 +1894,54 @@ sub handler {
                       printmenu => 'yes',
                       }));
 
+    push (@Options,({ action   => 'changeclicker',
+                      linktext => 'Register Response Devices ("Clickers")',
+                      href     => '/adm/preferences',
+                      subroutine => \&clickerchanger,
+                      breadcrumb =>
+                          { href => '/adm/preferences?action=changeclicker',
+                            text => 'Register Clicker'},
+                      },
+                    { action   => 'verify_and_change_clicker',
+                      subroutine => \&verify_and_change_clicker,
+                      breadcrumb =>
+                          { href => '/adm/preferences?action=changeclicker',
+                            text => 'Register Clicker'},
+                      printmenu => 'yes',
+                      }));
+   if ($env{'user.adv'}) {
+      push (@Options,({ action   => 'changedomcoord',
+                        linktext => 'Restrict Domain Coordinator Access',
+                        href     => '/adm/preferences',
+                        subroutine => \&domcoordchanger,
+                        breadcrumb =>
+                            { href => '/adm/preferences?action=changedomcoord',
+                              text => 'Restrict Domain Coordinator Access'},
+                      },
+                      { action   => 'verify_and_change_domcoord',
+                        subroutine => \&verify_and_change_domcoord,
+                        breadcrumb =>
+                            { href => '/adm/preferences?action=changedomcoord',
+                              text => 'Restrict Domain Coordinator Access'},
+                        printmenu => 'yes',
+                      }));
+    }
+
+    push (@Options,({ action   => 'lockwarning',
+                      subroutine => \&lockwarning,
+                      breadcrumb =>
+                          { href => '/adm/preferences?action=lockwarning',
+                            text => 'Lock Warnings'},
+                      },
+                    { action   => 'verify_and_change_locks',
+                      subroutine => \&verify_and_change_lockwarning,
+                      breadcrumb =>
+                          { href => '/adm/preferences?action=lockwarning',
+                            text => 'Lockwarnings'},
+                      printmenu => 'yes',
+                      }));
+
+
     if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
 	|| &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
 				    .$env{'request.course.sec'})) {
@@ -1728,7 +1961,7 @@ sub handler {
                        }));
     }
 
-    if ($env{'user.name'} =~ /^(albertel|fox|foxr|koretemey|korte|hallmat3|turtle|raeburn)$/) {
+    if ($env{'user.name'} =~ /^(albertel|fox|foxr|kortemey|korte|raeburn)$/) {
         push (@Options,({ action => 'debugtoggle',
                           printmenu => 'yes',
                           subroutine => \&toggle_debug,
@@ -1811,7 +2044,7 @@ sub toggle_debug {
     if ($env{'user.debug'}) {
         &Apache::lonnet::delenv('user\.debug');
     } else {
-        &Apache::lonnet::appenv('user.debug' => 1);
+        &Apache::lonnet::appenv({'user.debug' => 1});
     }
 }