--- loncom/interface/lonpreferences.pm	2002/10/16 19:36:25	1.16
+++ loncom/interface/lonpreferences.pm	2004/05/11 10:42:41	1.42
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.16 2002/10/16 19:36:25 albertel Exp $
+# $Id: lonpreferences.pm,v 1.42 2004/05/11 10:42:41 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -25,18 +25,6 @@
 #
 # http://www.lon-capa.org/
 #
-# (Internal Server Error Handler
-#
-# (Login Screen
-# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14,
-# 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer)
-#
-# 3/1/1 Gerd Kortemeyer)
-#
-# 3/1 Gerd Kortemeyer
-#
-# 2/13/02 2/14 2/15 Matthew Hall
-#
 # This package uses the "londes.js" javascript code. 
 #
 # TODOs that have to be completed:
@@ -50,6 +38,8 @@ use Apache::File;
 use Crypt::DES;
 use DynaLoader; # for Crypt::DES version
 use Apache::loncommon();
+use Apache::lonhtmlcommon();
+use Apache::lonlocal;
 
 #
 # Write lonnet::passwd to do the call below.
@@ -61,7 +51,7 @@ use Apache::loncommon();
 ##################################################
 sub des_keys {
     # Make a new key for DES encryption.
-    # Each key has two parts which are returned seperately.
+    # 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.
@@ -100,6 +90,60 @@ sub des_decrypt {
 ################################################################
 
 ################################################################
+#         Language Change Subroutines                          #
+################################################################
+sub languagechanger {
+    my $r = shift;
+    my $user       = $ENV{'user.name'};
+    my $domain     = $ENV{'user.domain'};
+    my %userenv = &Apache::lonnet::get
+        ('environment',['languages']);
+    my $language=$userenv{'languages'};
+
+    my $pref=&mt('Preferred language');
+    my %langchoices=('' => 'No language preference');
+    foreach (&Apache::loncommon::languageids()) {
+	if (&Apache::loncommon::supportedlanguagecode($_)) {
+	    $langchoices{&Apache::loncommon::supportedlanguagecode($_)}
+	               = &Apache::loncommon::plainlanguagedescription($_);
+	}
+    }
+    my $selectionbox=&Apache::loncommon::select_form($language,'language',
+						     %langchoices);
+    $r->print(<<ENDLSCREEN);
+<form name="server" 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').'" />');
+}
+
+
+sub verify_and_change_languages {
+    my $r = shift;
+    my $user       = $ENV{'user.name'};
+    my $domain     = $ENV{'user.domain'};
+# Screenname
+    my $newlanguage  = $ENV{'form.language'};
+    $newlanguage=~s/[^\-\w]//g;
+    my $message='';
+    if ($newlanguage) {
+        &Apache::lonnet::put('environment',{'languages' => $newlanguage});
+        &Apache::lonnet::appenv('environment.languages' => $newlanguage);
+        $message='Set new preferred languages to '.$newlanguage;
+    } else {
+        &Apache::lonnet::del('environment',['languages']);
+        &Apache::lonnet::delenv('environment\.languages');
+        $message='Reset preferred language';
+    }
+    $r->print(<<ENDVCSCREEN);
+</p>
+$message
+ENDVCSCREEN
+}
+
+
+################################################################
 #         Anonymous Discussion Name Change Subroutines         #
 ################################################################
 sub screennamechanger {
@@ -110,12 +154,7 @@ sub screennamechanger {
         ('environment',['screenname','nickname']);
     my $screenname=$userenv{'screenname'};
     my $nickname=$userenv{'nickname'};
-    my $bodytag=&Apache::loncommon::bodytag(
-              'Change Your Nickname and Anonymous Screen Name');
     $r->print(<<ENDSCREEN);
-<html>
-$bodytag
-
 <form name="server" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_screenname" />
 <br />New screenname (shown if you post anonymously):
@@ -124,8 +163,6 @@ $bodytag
 <input type="text" size="20" value="$nickname" name="nickname" />
 <input type="submit" value="Change" />
 </form>
-</body>
-</html>
 ENDSCREEN
 }
 
@@ -148,7 +185,7 @@ sub verify_and_change_screenname {
     }
 # Nickname
     $message.='<br />';
-    my $newscreen  = $ENV{'form.nickname'};
+    $newscreen  = $ENV{'form.nickname'};
     $newscreen=~s/[^ \w]//g;
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'nickname' => $newscreen});
@@ -160,14 +197,9 @@ sub verify_and_change_screenname {
         $message.='Reset nickname';
     }
 
-    my $bodytag=&Apache::loncommon::bodytag(
-                    'Change Your Nickname and Anonymous Screen Name');
     $r->print(<<ENDVCSCREEN);
-<html>
-$bodytag
 </p>
 $message
-</body></html>
 ENDVCSCREEN
 }
 
@@ -179,22 +211,29 @@ sub msgforwardchanger {
     my $r = shift;
     my $user       = $ENV{'user.name'};
     my $domain     = $ENV{'user.domain'};
-    my %userenv = &Apache::lonnet::get('environment',['msgforward']);
+    my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification']);
     my $msgforward=$userenv{'msgforward'};
-    my $bodytag=&Apache::loncommon::bodytag(
-                                         'Change Your Message Forwarding');
-    $r->print(<<ENDMSG);
-<html>
-$bodytag
+    my $notification=$userenv{'notification'};
+    my $critnotification=$userenv{'critnotification'};
+    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");
 
+    $r->print(<<ENDMSG);
+$forwardingHelp <br />
 <form name="server" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_msgforward" />
 New Forwarding Address(es) (<tt>user:domain,user:domain,...</tt>):
-<input type="text" size="40" value="$msgforward" name="msgforward" />
+<input type="text" size="40" value="$msgforward" name="msgforward" /><hr />
+New Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>):
+<input type="text" size="40" value="$notification" name="notification" /><hr />
+New Critical Message Notification Email Address(es) (<tt>joe\@doe.com,jane\@doe.edu,...</tt>):
+<input type="text" size="40" value="$critnotification" name="critnotification" />$criticalMessageHelp<hr />
 <input type="submit" value="Change" />
 </form>
-</body>
-</html>
 ENDMSG
 }
 
@@ -220,23 +259,166 @@ sub verify_and_change_msgforward {
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
         &Apache::lonnet::appenv('environment.msgforward' => $newscreen);
-        $message.='Set new message forwarding to '.$newscreen;
+        $message.='Set new message forwarding to '.$newscreen.'<br />';
     } else {
         &Apache::lonnet::del('environment',['msgforward']);
         &Apache::lonnet::delenv('environment\.msgforward');
-        $message.='Reset message forwarding';
+        $message.='Reset message forwarding<br />';
+    }
+    my $notification=$ENV{'form.notification'};
+    $notification=~s/\s//gs;
+    if ($notification) {
+        &Apache::lonnet::put('environment',{'notification' => $notification});
+        &Apache::lonnet::appenv('environment.notification' => $notification);
+        $message.='Set message notification address to '.$notification.'<br />';
+    } else {
+        &Apache::lonnet::del('environment',['notification']);
+        &Apache::lonnet::delenv('environment\.notification');
+        $message.='Reset message notification<br />';
+    }
+    my $critnotification=$ENV{'form.critnotification'};
+    $critnotification=~s/\s//gs;
+    if ($critnotification) {
+        &Apache::lonnet::put('environment',{'critnotification' => $critnotification});
+        &Apache::lonnet::appenv('environment.critnotification' => $critnotification);
+        $message.='Set critical message notification address to '.$critnotification;
+    } else {
+        &Apache::lonnet::del('environment',['critnotification']);
+        &Apache::lonnet::delenv('environment\.critnotification');
+        $message.='Reset critical message notification<br />';
     }
-    my $bodytag=&Apache::loncommon::bodytag(
-                                         'Change Your Message Forwarding');
     $r->print(<<ENDVCMSG);
-<html>
-$bodytag
 </p>
 $message
-</body></html>
 ENDVCMSG
 }
 
+################################################################
+#         Colors                                               #
+################################################################
+
+sub colorschanger {
+    my $r = shift;
+# figure out colors
+    my $function='student';
+    if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) {
+	$function='coordinator';
+    }
+    if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) {
+	$function='admin';
+    }
+    if (($ENV{'request.role'}=~/^(au|ca)/) ||
+	($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) {
+	$function='author';
+    }
+    my $domain=&Apache::loncommon::determinedomain();
+    my %colortypes=('pgbg'  => 'Page Background',
+                    'tabbg' => 'Header Background',
+                    'sidebg'=> 'Header Border',
+                    'font'  => 'Font',
+                    'link'  => 'Un-Visited Link',
+                    'vlink' => 'Visited Link',
+                    'alink' => 'Active Link');
+    my $chtable='';
+    foreach my $item (sort(keys(%colortypes))) {
+       my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);
+       $chtable.='<tr><td>'.$colortypes{$item}.'</td><td bgcolor="'.$curcol.
+        '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><input name="'.$item.
+        '" size="10" value="'.$curcol.
+'" /></td><td><a href="javascript:pjump('."'color_custom','".$colortypes{$item}.
+"','".$curcol."','"
+	    .$item."','parmform.pres','psub'".');">Select</a></td></tr>';
+    }
+    my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
+    $r->print(<<ENDCOL);
+<script>
+
+    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.server.'+
+                     document.parmform.pres_marker.value+
+		     '.value=document.parmform.pres_value.value;');
+	    }
+        } else {
+            document.parmform.pres_value.value='';
+            document.parmform.pres_marker.value='';
+        }
+    }
+
+
+</script>
+<form name="parmform">
+<input type="hidden" name="pres_marker" />
+<input type="hidden" name="pres_type" />
+<input type="hidden" name="pres_value" />
+</form>
+<form name="server" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="verify_and_change_colors" />
+<table border="2">
+$chtable
+</table>
+<input type="submit" value="Change Custom Colors" />
+<input type="submit" name="resetall" value="Reset All Colors to Default" />
+</form>
+ENDCOL
+}
+
+sub verify_and_change_colors {
+    my $r = shift;
+# figure out colors
+    my $function='student';
+    if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) {
+	$function='coordinator';
+    }
+    if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) {
+	$function='admin';
+    }
+    if (($ENV{'request.role'}=~/^(au|ca)/) ||
+	($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) {
+	$function='author';
+    }
+    my $domain=&Apache::loncommon::determinedomain();
+    my %colortypes=('pgbg'  => 'Page Background',
+                    'tabbg' => 'Header Background',
+                    'sidebg'=> 'Header Border',
+                    'font'  => 'Font',
+                    'link'  => 'Un-Visited Link',
+                    'vlink' => 'Visited Link',
+                    'alink' => 'Active Link');
+
+    my $message='';
+    foreach my $item (keys %colortypes) {
+        my $color=$ENV{'form.'.$item};
+        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 />';
+	} else {
+	    &Apache::lonnet::del('environment',[$entry]);
+	    &Apache::lonnet::delenv('environment\.'.$entry);
+	    $message.='Reset '.$colortypes{$item}.'<br />';
+	}
+    }
+    $r->print(<<ENDVCCOL);
+</p>
+$message
+<form name="client" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="changecolors" />
+</form>
+ENDVCCOL
+}
+
 ######################################################
 #            password handler subroutines            #
 ######################################################
@@ -279,12 +461,7 @@ sub passwordchanger {
 	my $jsh=Apache::File->new($include."/londes.js");
 	$r->print(<$jsh>);
     }
-    my $bodytag=&Apache::loncommon::bodytag('Change Password','',
-                                         'onLoad="init();"');
     $r->print(<<ENDFORM);
-</head>
-$bodytag
-
 <script language="JavaScript">
 
     function send() {
@@ -314,7 +491,7 @@ $bodytag
 $errormessage
 
 <p>
-<!-- We seperate the forms into 'server' and 'client' in order to
+<!-- We separate the forms into 'server' and 'client' in order to
      ensure that unencrypted passwords will not be sent out by a
      crappy browser -->
 
@@ -394,9 +571,9 @@ ENDERROR
     }
     my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);
     # 
-    my $currentpass = &des_decrypt($ckey ,$currentpass);
-    my $newpass1    = &des_decrypt($n1key,$newpass1);
-    my $newpass2    = &des_decrypt($n2key,$newpass2);
+    $currentpass = &des_decrypt($ckey ,$currentpass);
+    $newpass1    = &des_decrypt($n1key,$newpass1);
+    $newpass2    = &des_decrypt($n2key,$newpass2);
     # 
     if ($newpass1 ne $newpass2) {
 	&passwordchanger($r,
@@ -449,6 +626,63 @@ ENDERROR
     return;
 }
 
+################################################################
+#            discussion display subroutines 
+################################################################
+sub discussionchanger {
+    my $r = shift;
+    my $user       = $ENV{'user.name'};
+    my $domain     = $ENV{'user.domain'};
+    my %userenv = &Apache::lonnet::get
+        ('environment',['discdisplay']);
+    my $discdisplay=$userenv{'discdisplay'};
+    my $discchange = 'unread';
+    my $alllong = &mt('all posts');
+    my $unreadlong = &mt('only unread posts');
+    my $discbutton = $unreadlong;
+    my $currdisc = $alllong;
+    if ($discdisplay eq 'unread') {
+        $discchange = 'allposts';
+        $discbutton = $alllong;
+        $currdisc = $unreadlong;
+    }
+    $r->print(<<ENDLSCREEN);
+<form name="server" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="verify_and_change_discussion" />
+<br />
+ENDLSCREEN
+    $r->print(
+&mt('You can set a display preference for discussion posts for both bulletin boards and individual resources in all your courses.').'<br/>'.
+&mt('This default preference can be overridden within each individual discussion.').'<br/><br />'.
+&mt('Your discussion post display preference is currently set to display').' '.$currdisc. 
+'.<br /><br /><input type="hidden" name="discdisplay" value="'.
+$discchange.'" /><input type="submit" value="'.
+&mt('Change to display').' '.$discbutton.'" /></form>'
+    );
+}
+                                                                                                                
+sub verify_and_change_discussion {
+    my $r = shift;
+    my $user       = $ENV{'user.name'};
+    my $domain     = $ENV{'user.domain'};
+# Discussion
+    my $discdisplay  = $ENV{'form.discdisplay'};
+    my $message='';
+    if ($discdisplay eq 'unread') {
+        &Apache::lonnet::put('environment',{'discdisplay' => $discdisplay});
+        &Apache::lonnet::appenv('environment.discdisplay' => $discdisplay);
+        $message='Discussions set to display only unread posts';
+    } else {
+        &Apache::lonnet::del('environment',['discdisplay']);
+        &Apache::lonnet::delenv('environment\.discdisplay');
+        $message='Discussions set to display all posts';
+    }
+    $r->print(<<ENDVCSCREEN);
+</p>
+$message
+ENDVCSCREEN
+}
+
 ######################################################
 #            other handler subroutines               #
 ######################################################
@@ -460,83 +694,197 @@ sub handler {
     my $r = shift;
     my $user = $ENV{'user.name'};
     my $domain = $ENV{'user.domain'};
-    $r->content_type('text/html');
+    &Apache::loncommon::content_type($r,'text/html');
     # Some pages contain DES keys and should not be cached.
     &Apache::loncommon::no_cache($r);
     $r->send_http_header;
     return OK if $r->header_only;
     #
-    if ($ENV{'form.action'} eq 'changepass') {
-	&passwordchanger($r);
-    } elsif ($ENV{'form.action'} eq 'verify_and_change_pass') {
-	&verify_and_change_password($r);
-    } 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 'debugtoggle') {
-	if ($ENV{'user.name'} eq 'albertel' ) {
-	    if ($ENV{'user.debug'}) {
-		&Apache::lonnet::delenv('user\.debug');
-	    } else {
-		&Apache::lonnet::appenv('user.debug' => 1);
-	    }
-	}
-    } else {
-	$r->print(<<ENDHEADER);
+    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+                                            ['action']);
+    #
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
+    &Apache::lonhtmlcommon::add_breadcrumb
+        ({href => '/adm/preferences',
+          text => 'Set User Preferences'});
+
+    my @Options;
+    # Determine current authentication method
+    my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
+    if ($currentauth =~ /^(unix|internal):/) {
+        push (@Options,({ action   => 'changepass',
+                          linktext => 'Change Password',
+                          href     => '/adm/preferences',
+                          help     => 'Change_Password',
+                          subroutine => \&passwordchanger,
+                          breadcrumb => 
+                              { href => '/adm/preferences?action=changepass',
+                                text => 'Change Password'},
+                          },
+                        { action => 'verify_and_change_pass',
+                          subroutine => \&verify_and_change_password,
+                          breadcrumb => 
+                              { href =>'/adm/preferences?action=changepass',
+                                text => 'Change Password'},
+                          printmenu => 'yes',
+                          }));
+    }
+    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',
+                      text     => 'and Notification 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},
+                     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',
+                      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 => 'changediscussions',
+                      linktext => 'Change Discussion Display Preferences',
+                      href => '/adm/preferences',
+                      breadcrumb => 
+                            { href => '/adm/preferences?action=changediscussions',
+                              text => 'Change Discussions'},
+                      subroutine => \&discussionchanger,
+                  },
+                    { action => 'verify_and_change_discussion',
+                      breadcrumb =>
+                          { href => '/adm/preferences?action=changediscussions',
+                            text => 'Change Discussions'},
+                      printmenu => 'yes',
+                      subroutine => \&verify_and_change_discussion, }
+                    ));
+                       
+    if ($ENV{'user.name'} =~ /^(albertel|koretemey|korte|hallmat3|turtle)$/) {
+        push (@Options,({ action => 'debugtoggle',
+                          printmenu => 'yes',
+                          subroutine => \&toggle_debug,
+                          }));
+    }
+    $r->print(<<ENDHEADER);
 <html>
 <head>
 <title>LON-CAPA Preferences</title>
 </head>
 ENDHEADER
-        $r->print(&Apache::loncommon::bodytag('Change Your Preferences'));
-	# Determine current authentication method
-	my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
-	if ($currentauth =~ /^(unix|internal):/) {
-	    $r->print(<<ENDPASSWORDFORM);
-<form name="client" action="/adm/preferences" method="post">
-<input type="hidden" name="action" value="changepass" />
-<input type="submit" value="Change password" />
-</form>
-ENDPASSWORDFORM
+    my $call = 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'});
+            }
         }
-# Change screen name
-	    $r->print(<<ENDSCREENNAMEFORM);
-<form name="client" action="/adm/preferences" method="post">
-<input type="hidden" name="action" value="changescreenname" />
-<input type="submit" 
-value="Change nickname and anonymous discussion screen name" />
-</form>
-ENDSCREENNAMEFORM
-	    $r->print(<<ENDMSGFORWARDFORM);
-<form name="client" action="/adm/preferences" method="post">
-<input type="hidden" name="action" value="changemsgforward" />
-<input type="submit" value="Change message forwarding address" />
-</form>
-ENDMSGFORWARDFORM
-# The "about me" page
-	my $aboutmeaction=
-	    '/adm/'.$ENV{'user.domain'}.'/'.$ENV{'user.name'}.'/aboutme';
-	$r->print(<<ENDABOUTME);
-<form name="client" action="$aboutmeaction" method="post">
-<input type="hidden" name="action" value="changescreenname" />
-<input type="submit" value="Edit the 'About Me' Personal Information Screen" />
-</form>
-ENDABOUTME
-	if ($ENV{'user.name'} eq 'albertel') {
-	    $r->print(<<ENDDEBUG);
-<form name="client" action="/adm/preferences" method="post">
-<input type="hidden" name="action" value="debugtoggle" />
-<input type="submit" value="Toggle Debug" />
-Current Debug status is -$ENV{'user.debug'}-.
-</form>
-ENDDEBUG
-	}
-	# Other preference setting code should be added here
+    }
+    $r->print(&Apache::loncommon::bodytag('Change Preferences'));
+    $r->print(&Apache::lonhtmlcommon::breadcrumbs
+              (undef,'Change Preferences'));
+    if (defined($call)) {
+        $call->($r);
+    }
+    if ($printmenu eq 'yes') {
+        my $optionlist = '<table cellpadding="5">';
+        if ($ENV{'user.name'} =~ 
+                         /^(albertel|kortemey|korte|hallmat3|turtle)$/
+            ) {
+            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'})) {
+                $optiontext .= 
+                    '<a href="'.$option->{'href'}.
+                    '?action='.$option->{'action'}.'">'.
+                    $option->{'linktext'}.'</a>';
+            }
+            if (exists($option->{'text'})) {
+                $optiontext .= ' '.$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>';
+        $r->print($optionlist);
     }
     $r->print(<<ENDFOOTER);
 </body>
@@ -545,5 +893,13 @@ ENDFOOTER
     return OK;
 }
 
+sub toggle_debug {
+    if ($ENV{'user.debug'}) {
+        &Apache::lonnet::delenv('user\.debug');
+    } else {
+        &Apache::lonnet::appenv('user.debug' => 1);
+    }
+}
+
 1;
 __END__