--- loncom/interface/lonpreferences.pm	2002/04/03 18:47:39	1.7
+++ loncom/interface/lonpreferences.pm	2003/09/17 01:45:14	1.29
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.7 2002/04/03 18:47:39 www Exp $
+# $Id: lonpreferences.pm,v 1.29 2003/09/17 01:45:14 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -50,6 +50,7 @@ use Apache::File;
 use Crypt::DES;
 use DynaLoader; # for Crypt::DES version
 use Apache::loncommon();
+use Apache::lonhtmlcommon();
 
 #
 # Write lonnet::passwd to do the call below.
@@ -98,29 +99,106 @@ sub des_decrypt {
 ################################################################
 #                       Handler subroutines                    #
 ################################################################
+
+################################################################
+#         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','translator']);
+    my $language=$userenv{'languages'};
+    my $translator=$userenv{'translator'};
+    my $bodytag=&Apache::loncommon::bodytag(
+              'Change Your Language Preferences');
+    $r->print(<<ENDLSCREEN);
+<html>
+$bodytag
+
+<form name="server" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="verify_and_change_languages" />
+<br />Preferred language:
+<input type="text" size="5" value="$language" name="language" />
+ENDLSCREEN
+    if ($ENV{'user.adv'}) {
+	$r->print (<<ENDTRSC);
+<br />Willing to translate for language:
+<input type="text" size="5" value="$translator" name="translator" />
+ENDTRSC
+    }
+    $r->print('<br /><input type="submit" value="Change" /></form></body></html>');
+}
+
+
+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';
+    }
+    if ($ENV{'user.adv'}) {
+	$message.='<br />';
+	my $newtrans  = $ENV{'form.translator'};
+	$newtrans=~s/[^\-\w]//g;
+	if ($newtrans) {
+	    &Apache::lonnet::put('environment',{'translator' => $newtrans});
+	    &Apache::lonnet::appenv('environment.translator' => $newtrans);
+	    $message.='Set translator to '.$newtrans;
+	} else {
+	    &Apache::lonnet::del('environment',['translator']);
+	    &Apache::lonnet::delenv('environment\.translator');
+	    $message.='Reset translator';
+	}
+    }
+
+    my $bodytag=&Apache::loncommon::bodytag(
+                    'Change Your Language Preferences');
+    $r->print(<<ENDVCSCREEN);
+<html>
+$bodytag
+</p>
+$message
+</body></html>
+ENDVCSCREEN
+}
+
+
+################################################################
+#         Anonymous Discussion Name Change Subroutines         #
+################################################################
 sub screennamechanger {
     my $r = shift;
-    my $errormessage = shift;
-    $errormessage = ($errormessage || '');
     my $user       = $ENV{'user.name'};
     my $domain     = $ENV{'user.domain'};
-    my $homeserver = $ENV{'user.home'};
-    my %userenv = &Apache::lonnet::get('environment',['screenname']);
+    my %userenv = &Apache::lonnet::get
+        ('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>
-<body bgcolor="#FFFFFF">
-<h1>Preferences for $user</h1>
-<h3>$user is a member of domain $domain</h3>
-$errormessage
-<p>
-Change anonymous discussion screen name for $user
-</p>
+$bodytag
 
 <form name="server" action="/adm/preferences" method="post">
 <input type="hidden" name="action" value="verify_and_change_screenname" />
-New screenname:
+<br />New screenname (shown if you post anonymously):
 <input type="text" size="20" value="$screenname" name="screenname" />
+<br />New nickname (shown if you post non-anonymously):
+<input type="text" size="20" value="$nickname" name="nickname" />
 <input type="submit" value="Change" />
 </form>
 </body>
@@ -132,9 +210,9 @@ sub verify_and_change_screenname {
     my $r = shift;
     my $user       = $ENV{'user.name'};
     my $domain     = $ENV{'user.domain'};
-    my $homeserver = $ENV{'user.home'};
+# Screenname
     my $newscreen  = $ENV{'form.screenname'};
-    $newscreen=~s/\W//g;
+    $newscreen=~s/[^ \w]//g;
     my $message='';
     if ($newscreen) {
         &Apache::lonnet::put('environment',{'screenname' => $newscreen});
@@ -145,19 +223,271 @@ sub verify_and_change_screenname {
         &Apache::lonnet::delenv('environment\.screenname');
         $message='Reset screenname';
     }
+# Nickname
+    $message.='<br />';
+    $newscreen  = $ENV{'form.nickname'};
+    $newscreen=~s/[^ \w]//g;
+    if ($newscreen) {
+        &Apache::lonnet::put('environment',{'nickname' => $newscreen});
+        &Apache::lonnet::appenv('environment.nickname' => $newscreen);
+        $message.='Set new nickname to '.$newscreen;
+    } else {
+        &Apache::lonnet::del('environment',['nickname']);
+        &Apache::lonnet::delenv('environment\.nickname');
+        $message.='Reset nickname';
+    }
+
+    my $bodytag=&Apache::loncommon::bodytag(
+                    'Change Your Nickname and Anonymous Screen Name');
     $r->print(<<ENDVCSCREEN);
 <html>
-<body bgcolor="#FFFFFF">
-<h1>Preferences for $user</h1>
-<h3>$user is a member of domain $domain</h3>
-<p>
-Change anonymous discussion screen name for $user
+$bodytag
 </p>
 $message
 </body></html>
 ENDVCSCREEN
 }
 
+################################################################
+#         Message Forward                                      #
+################################################################
+
+sub msgforwardchanger {
+    my $r = shift;
+    my $user       = $ENV{'user.name'};
+    my $domain     = $ENV{'user.domain'};
+    my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification']);
+    my $msgforward=$userenv{'msgforward'};
+    my $notification=$userenv{'notification'};
+    my $critnotification=$userenv{'critnotification'};
+    my $bodytag=&Apache::loncommon::bodytag(
+                    'Change Your Message Forwarding and Notification');
+    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);
+<html>
+$bodytag
+$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" /><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
+}
+
+sub verify_and_change_msgforward {
+    my $r = shift;
+    my $user       = $ENV{'user.name'};
+    my $domain     = $ENV{'user.domain'};
+    my $newscreen  = '';
+    my $message='';
+    foreach (split(/\,/,$ENV{'form.msgforward'})) {
+	my ($msuser,$msdomain)=split(/[\@\:]/,$_);
+        $msuser=~s/\W//g;
+        $msdomain=~s/\W//g;
+        if (($msuser) && ($msdomain)) {
+	    if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') {
+               $newscreen.=$msuser.':'.$msdomain.',';
+	   } else {
+               $message.='No such user: '.$msuser.':'.$msdomain.'<br>';
+           }
+        }
+    }
+    $newscreen=~s/\,$//;
+    if ($newscreen) {
+        &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
+        &Apache::lonnet::appenv('environment.msgforward' => $newscreen);
+        $message.='Set new message forwarding to '.$newscreen.'<br />';
+    } else {
+        &Apache::lonnet::del('environment',['msgforward']);
+        &Apache::lonnet::delenv('environment\.msgforward');
+        $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 and Notifications');
+    $r->print(<<ENDVCMSG);
+<html>
+$bodytag
+</p>
+$message
+</body></html>
+ENDVCMSG
+}
+
+################################################################
+#         Colors                                               #
+################################################################
+
+sub colorschanger {
+    my $r = shift;
+    my $bodytag=&Apache::loncommon::bodytag(
+                    'Change Color Scheme for Current Role Type','',
+                    'onUnload="pclose();"');
+# 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);
+<html>
+<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>
+$bodytag
+<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>
+</body>
+</html>
+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 />';
+	}
+    }
+    my $bodytag=&Apache::loncommon::bodytag(
+                           'Change Color Scheme for Current Role Type');
+    $r->print(<<ENDVCCOL);
+<html>
+$bodytag
+</p>
+$message
+<form name="client" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="changecolors" />
+<input type="submit" value="Revise color scheme again" />
+</form>
+</body></html>
+ENDVCCOL
+}
+
 ######################################################
 #            password handler subroutines            #
 ######################################################
@@ -194,14 +524,17 @@ sub passwordchanger {
     $lkey_npass2= hex($lkey_npass2);
     # Output javascript to deal with passwords
     # Output DES javascript
+    $r->print("<html><head>");
     {
 	my $include = $r->dir_config('lonIncludes');
 	my $jsh=Apache::File->new($include."/londes.js");
 	$r->print(<$jsh>);
     }
+    my $bodytag=&Apache::loncommon::bodytag('Change Password','',
+                                         'onLoad="init();"');
     $r->print(<<ENDFORM);
-
-<body bgcolor="#FFFFFF" onLoad="init();">
+</head>
+$bodytag
 
 <script language="JavaScript">
 
@@ -229,12 +562,8 @@ sub passwordchanger {
     }
 
 </script>
-<h1>Preferences for $user</h1>
-<h3>$user is a member of domain $domain</h3>
 $errormessage
-<p>
-Change password for $user
-</p>
+
 <p>
 <!-- We seperate the forms into 'server' and 'client' in order to
      ensure that unencrypted passwords will not be sent out by a
@@ -316,9 +645,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,
@@ -359,14 +688,13 @@ ENDERROR
     # Inform the user the password has (not?) been changed
     if ($result =~ /^ok$/) {
 	$r->print(<<"ENDTEXT");
-<h2>Password for $user was successfully changed</h2>
+<h2>The password for $user was successfully changed</h2>
 ENDTEXT
     } else {
 	# error error: run in circles, scream and shout
         $r->print(<<ENDERROR);
-<h2><font color="#ff0000">Password for $user was not changed</font></h2>
-There was an internal error when attempting to change your password.
-Please contact your instructor or the domain coordinator.
+<h2><font color="#ff0000">The password for $user was not changed</font></h2>
+Please make sure your old password was entered correctly.
 ENDERROR
     }
     return;
@@ -376,7 +704,6 @@ ENDERROR
 #            other handler subroutines               #
 ######################################################
 
-
 ################################################################
 #                          Main handler                        #
 ################################################################
@@ -389,7 +716,7 @@ sub handler {
     &Apache::loncommon::no_cache($r);
     $r->send_http_header;
     return OK if $r->header_only;
-    # Spit out the header
+    #
     if ($ENV{'form.action'} eq 'changepass') {
 	&passwordchanger($r);
     } elsif ($ENV{'form.action'} eq 'verify_and_change_pass') {
@@ -398,41 +725,102 @@ sub handler {
         &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 'debugtoggle') {
+	if (($ENV{'user.name'} eq 'albertel' ) ||
+            ($ENV{'user.name'} eq 'kortemey' ) ||
+            ($ENV{'user.name'} eq 'korte')) {
+	    if ($ENV{'user.debug'}) {
+		&Apache::lonnet::delenv('user\.debug');
+	    } else {
+		&Apache::lonnet::appenv('user.debug' => 1);
+	    }
+	}
     } else {
 	$r->print(<<ENDHEADER);
 <html>
 <head>
 <title>LON-CAPA Preferences</title>
 </head>
-<body bgcolor="#FFFFFF" >
-<h1>Preferences for $user</h1>
-<h3>$user is a member of domain $domain</h3>
 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">
+<input type="hidden" name="action" value="changepass" />
+<input type="submit" value="Change password" />
 </form>
 ENDPASSWORDFORM
+        }
 # 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 anonymous discussion screen name">
+<input type="hidden" name="action" value="changescreenname" />
+<input type="submit" 
+value="Change nickname and anonymous discussion screen name" />
 </form>
 ENDSCREENNAMEFORM
-            # Other preference setting code should be added here
+	    $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 and notification addresses" />
+</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
+	    $r->print(<<ENDCOLORFORM);
+<form name="client" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="changecolors" />
+<input type="submit" value="Change color scheme" />
+</form>
+ENDCOLORFORM
+
+	    $r->print(<<ENDLANGUAGES);
+<form name="client" action="/adm/preferences" method="post">
+<input type="hidden" name="action" value="changelanguages" />
+<input type="submit" value="Change language preferences" />
+</form>
+ENDLANGUAGES
+
+	if (($ENV{'user.name'} eq 'albertel' ) ||
+            ($ENV{'user.name'} eq 'kortemey' ) ||
+            ($ENV{'user.name'} eq 'korte')) {
+	    $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(<<ENDFOOTER);
 </body>
 </html>
 ENDFOOTER
     return OK;
-} 
+}
 
 1;
 __END__