Annotation of loncom/interface/lonpreferences.pm, revision 1.163

1.1       www         1: # The LearningOnline Network
                      2: # Preferences
                      3: #
1.163   ! bisitz      4: # $Id: lonpreferences.pm,v 1.162 2009/05/12 15:20:23 bisitz Exp $
1.2       albertel    5: #
                      6: # Copyright Michigan State University Board of Trustees
                      7: #
                      8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      9: #
                     10: # LON-CAPA is free software; you can redistribute it and/or modify
                     11: # it under the terms of the GNU General Public License as published by
                     12: # the Free Software Foundation; either version 2 of the License, or
                     13: # (at your option) any later version.
                     14: #
                     15: # LON-CAPA is distributed in the hope that it will be useful,
                     16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
                     17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     18: # GNU General Public License for more details.
                     19: #
                     20: # You should have received a copy of the GNU General Public License
                     21: # along with LON-CAPA; if not, write to the Free Software
                     22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     23: #
                     24: # /home/httpd/html/adm/gpl.txt
                     25: #
                     26: # http://www.lon-capa.org/
                     27: #
1.3       matthew    28: # This package uses the "londes.js" javascript code. 
                     29: #
                     30: # TODOs that have to be completed:
                     31: #    interface with lonnet to change the password
                     32:  
1.1       www        33: package Apache::lonpreferences;
                     34: 
                     35: use strict;
1.86      albertel   36: use LONCAPA;
1.1       www        37: use Apache::Constants qw(:common);
1.3       matthew    38: use Apache::File;
                     39: use Crypt::DES;
                     40: use DynaLoader; # for Crypt::DES version
1.4       matthew    41: use Apache::loncommon();
1.23      matthew    42: use Apache::lonhtmlcommon();
1.32      www        43: use Apache::lonlocal;
1.59      albertel   44: use Apache::lonnet;
1.95      albertel   45: use LONCAPA();
1.3       matthew    46: 
                     47: #
                     48: # Write lonnet::passwd to do the call below.
                     49: # Use:
                     50: #   my $answer=reply("encrypt:passwd:$udom:$uname:$upass",$tryserver);
                     51: #
                     52: ##################################################
                     53: #          password associated functions         #
                     54: ##################################################
                     55: sub des_keys {
1.4       matthew    56:     # Make a new key for DES encryption.
1.36      www        57:     # Each key has two parts which are returned separately.
1.4       matthew    58:     # Please note:  Each key must be passed through the &hex function
                     59:     # before it is output to the web browser.  The hex versions cannot
                     60:     # be used to decrypt.
1.3       matthew    61:     my @hexstr=('0','1','2','3','4','5','6','7',
                     62:                 '8','9','a','b','c','d','e','f');
                     63:     my $lkey='';
                     64:     for (0..7) {
                     65:         $lkey.=$hexstr[rand(15)];
                     66:     }
                     67:     my $ukey='';
                     68:     for (0..7) {
                     69:         $ukey.=$hexstr[rand(15)];
                     70:     }
                     71:     return ($lkey,$ukey);
                     72: }
                     73: 
                     74: sub des_decrypt {
                     75:     my ($key,$cyphertext) = @_;
                     76:     my $keybin=pack("H16",$key);
                     77:     my $cypher;
                     78:     if ($Crypt::DES::VERSION>=2.03) {
                     79:         $cypher=new Crypt::DES $keybin;
                     80:     } else {
                     81:         $cypher=new DES $keybin;
                     82:     }
                     83:     my $plaintext=
                     84: 	$cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,0,16))));
                     85:     $plaintext.=
                     86: 	$cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,16,16))));
1.4       matthew    87:     $plaintext=substr($plaintext,1,ord(substr($plaintext,0,1)) );
1.3       matthew    88:     return $plaintext;
                     89: }
                     90: 
1.4       matthew    91: ################################################################
                     92: #                       Handler subroutines                    #
                     93: ################################################################
1.9       matthew    94: 
                     95: ################################################################
1.28      www        96: #         Language Change Subroutines                          #
                     97: ################################################################
1.44      www        98: 
                     99: sub wysiwygchanger {
                    100:     my $r = shift;
1.126     droeschl  101:     Apache::lonhtmlcommon::add_breadcrumb(
                    102: 	    {	href => '/adm/preferences?action=changewysiwyg',
                    103:                 text => 'Change WYSIWYG Preferences'});
1.147     schafran  104:     $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126     droeschl  105:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change WYSIWYG Preferences'));
                    106: 
1.44      www       107:     my %userenv = &Apache::lonnet::get
                    108:         ('environment',['wysiwygeditor']);
1.78      albertel  109:     my $onselect='checked="checked"';
1.44      www       110:     my $offselect='';
1.77      albertel  111:     if ($userenv{'wysiwygeditor'} eq 'on') {
1.44      www       112: 	$onselect='';
1.78      albertel  113: 	$offselect='checked="checked"';
1.44      www       114:     }
                    115:     my $switchoff=&mt('Disable WYSIWYG editor');
                    116:     my $switchon=&mt('Enable WYSIWYG editor');
1.124     www       117:     my $warning='';
                    118:     if ($env{'user.adv'}) {
                    119:        $warning.="<p>".&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>";
                    120:     }
1.44      www       121:     $r->print(<<ENDLSCREEN);
1.88      albertel  122: <form name="prefs" action="/adm/preferences" method="post">
1.44      www       123: <input type="hidden" name="action" value="set_wysiwyg" />
1.124     www       124: $warning
1.44      www       125: <br />
1.65      albertel  126: <label><input type="radio" name="wysiwyg" value="off" $onselect /> $switchoff</label><br />
                    127: <label><input type="radio" name="wysiwyg" value="on" $offselect /> $switchon</label>
1.44      www       128: ENDLSCREEN
1.136     schafran  129:     $r->print('<br /><input type="submit" value="'.&mt('Save').'" />');
1.44      www       130: }
                    131: 
                    132: 
                    133: sub verify_and_change_wysiwyg {
                    134:     my $r = shift;
1.59      albertel  135:     my $newsetting=$env{'form.wysiwyg'};
1.44      www       136:     &Apache::lonnet::put('environment',{'wysiwygeditor' => $newsetting});
1.116     raeburn   137:     &Apache::lonnet::appenv({'environment.wysiwygeditor' => $newsetting});
1.158     bisitz    138:     my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('WYSIWYG Editor').'</i>','<tt>'.&mt($newsetting).'</tt>'));
                    139:     $message=&Apache::loncommon::confirmwrapper($message);
                    140:     &print_main_menu($r,$message);
1.44      www       141: }
                    142: 
                    143: ################################################################
                    144: #         Language Change Subroutines                          #
                    145: ################################################################
1.28      www       146: sub languagechanger {
                    147:     my $r = shift;
1.126     droeschl  148:     
                    149:     Apache::lonhtmlcommon::add_breadcrumb(
                    150: 	    {	href => '/adm/preferences?action=changelanguages',
1.127     droeschl  151:                 text => 'Change Language'});
1.147     schafran  152:     $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126     droeschl  153:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Language')); 
1.59      albertel  154:     my $user       = $env{'user.name'};
                    155:     my $domain     = $env{'user.domain'};
1.28      www       156:     my %userenv = &Apache::lonnet::get
1.32      www       157:         ('environment',['languages']);
1.29      www       158:     my $language=$userenv{'languages'};
1.32      www       159: 
1.33      www       160:     my $pref=&mt('Preferred language');
                    161:     my %langchoices=('' => 'No language preference');
                    162:     foreach (&Apache::loncommon::languageids()) {
                    163: 	if (&Apache::loncommon::supportedlanguagecode($_)) {
                    164: 	    $langchoices{&Apache::loncommon::supportedlanguagecode($_)}
                    165: 	               = &Apache::loncommon::plainlanguagedescription($_);
                    166: 	}
                    167:     }
                    168:     my $selectionbox=&Apache::loncommon::select_form($language,'language',
                    169: 						     %langchoices);
1.28      www       170:     $r->print(<<ENDLSCREEN);
1.88      albertel  171: <form name="prefs" action="/adm/preferences" method="post">
1.28      www       172: <input type="hidden" name="action" value="verify_and_change_languages" />
1.33      www       173: <br />$pref: $selectionbox
1.28      www       174: ENDLSCREEN
1.136     schafran  175:     $r->print('<br /><input type="submit" value="'.&mt('Save').'" />');
1.28      www       176: }
                    177: 
                    178: 
                    179: sub verify_and_change_languages {
                    180:     my $r = shift;
1.59      albertel  181:     my $user       = $env{'user.name'};
                    182:     my $domain     = $env{'user.domain'};
1.28      www       183: # Screenname
1.59      albertel  184:     my $newlanguage  = $env{'form.language'};
1.28      www       185:     $newlanguage=~s/[^\-\w]//g;
                    186:     my $message='';
                    187:     if ($newlanguage) {
1.29      www       188:         &Apache::lonnet::put('environment',{'languages' => $newlanguage});
1.116     raeburn   189:         &Apache::lonnet::appenv({'environment.languages' => $newlanguage});
1.158     bisitz    190:         $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Preferred language').'</i>','<tt>"'.$newlanguage.'"</tt>.'));
1.28      www       191:     } else {
1.29      www       192:         &Apache::lonnet::del('environment',['languages']);
1.139     raeburn   193:         &Apache::lonnet::delenv('environment.languages');
1.158     bisitz    194:         $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Preferred language').'</i>'));
1.28      www       195:     }
1.158     bisitz    196:     $message=&Apache::loncommon::confirmwrapper($message);
1.132     raeburn   197:     &Apache::loncommon::flush_langs_cache($user,$domain);
1.152     www       198:     &print_main_menu($r, $message);
1.28      www       199: }
                    200: 
1.50      albertel  201: ################################################################
1.54      albertel  202: #         Tex Engine Change Subroutines                        #
                    203: ################################################################
                    204: sub texenginechanger {
                    205:     my $r = shift;
1.126     droeschl  206:     Apache::lonhtmlcommon::add_breadcrumb(
                    207: 	    {	href => '/adm/preferences?action=changetexenginepref',
                    208:                 text => 'Change How Math Equations Are Displayed'});
1.147     schafran  209:     $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126     droeschl  210:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change How Math Equations Are Displayed'));
1.59      albertel  211:     my $user       = $env{'user.name'};
                    212:     my $domain     = $env{'user.domain'};
1.54      albertel  213:     my %userenv = &Apache::lonnet::get('environment',['texengine']);
                    214:     my $texengine=$userenv{'texengine'};
                    215: 
1.69      albertel  216:     my %mathchoices=('' => 'Default',
1.123     bisitz    217: 		     'tth' => 'tth (TeX to HTML)',
1.64      albertel  218: 		     #'ttm' => 'TeX to MathML',
1.54      albertel  219: 		     'jsMath' => 'jsMath',
1.123     bisitz    220: 		     'mimetex' => 'mimetex (Convert to Images)'
1.54      albertel  221:                      );
                    222:     my $selectionbox=&Apache::loncommon::select_form($texengine,'texengine',
                    223: 						     %mathchoices);
1.67      albertel  224:     my $jsMath_start=&Apache::lontexconvert::jsMath_header();
1.123     bisitz    225:     my %lt=&Apache::lonlocal::texthash(
                    226:       'headline' => 'Change Math Preferences',
                    227:       'preftxt'  => 'Preferred method to display Math',
1.136     schafran  228:       'change'   => 'Save',
1.123     bisitz    229:       'exmpl'    => 'Examples',
                    230:       'jsmath'   => 'jsMath:',
                    231:       'tth'      => 'tth (TeX to HTML):',
                    232:       'mimetex'  => 'mimetex (Convert to Images):',
                    233:     );
                    234: 
1.162     bisitz    235:     my $jsMathWarning='<p>'
                    236:                      .'<div class="LC_warning">'
                    237:                      .&mt("It looks like you don't have the TeX math fonts installed.")
                    238:                      .'</div>'
                    239:                      .'<div>'
                    240:                      .&mt('The jsMath example on this page may not look right without them. '
                    241:                          .'The [_1]jsMath Home Page[_2] has information on how to download the '
                    242:                          .'needed fonts. In the meantime, jsMath will do the best it can '
                    243:                          .'with the fonts you have, but it may not be pretty and some equations '
                    244:                          .'may not be rendered correctly.'
                    245:                          ,'<a href="http://www.math.union.edu/locate/jsMath/" target="_blank">'
                    246:                          ,'</a>')
                    247:                      .'</div>'
                    248:                      .'</p>';
                    249: 
1.54      albertel  250:     $r->print(<<ENDLSCREEN);
1.123     bisitz    251: <h2>$lt{'headline'}</h2>
1.88      albertel  252: <form name="prefs" action="/adm/preferences" method="post">
1.54      albertel  253: <input type="hidden" name="action" value="verify_and_change_texengine" />
1.123     bisitz    254: <p>
1.136     schafran  255: $lt{'preftxt'}: $selectionbox 
                    256: <br />
                    257: <input type="submit" value="$lt{'change'}" />
1.123     bisitz    258: </p>
1.54      albertel  259: </form>
1.123     bisitz    260: <br />
                    261: <hr />
                    262: $lt{'exmpl'}
                    263: 
                    264: <h3>$lt{'jsmath'}</h3> 
                    265: <p>
1.67      albertel  266: $jsMath_start
1.148     bisitz    267: <script type="text/javascript" language="JavaScript">
1.54      albertel  268: if (jsMath.nofonts == 1) {
1.162     bisitz    269:     document.writeln($jsMathWarning);
1.54      albertel  270: }
                    271: </script>
1.122     www       272: <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=jsMath" width="400" height="120"></iframe>
1.123     bisitz    273: </p>
1.54      albertel  274: 
1.123     bisitz    275: <h3>$lt{'mimetex'}</h3>
                    276: <p>
                    277: <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=mimetex" width="400" height="100"></iframe>
1.67      albertel  278: </p>
1.123     bisitz    279: 
                    280: <h3>$lt{'tth'}</h3>
                    281: <p>
                    282: <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=tth" width="400" height="200"></iframe>
1.67      albertel  283: </p>
1.54      albertel  284: ENDLSCREEN
1.59      albertel  285:     if ($env{'environment.texengine'} ne 'jsMath') {
1.148     bisitz    286: 	$r->print('<script type="text/javascript" language="JavaScript">jsMath.Process()</script>');
1.55      albertel  287:     }
1.54      albertel  288: }
                    289: 
                    290: 
                    291: sub verify_and_change_texengine {
                    292:     my $r = shift;
1.59      albertel  293:     my $user       = $env{'user.name'};
                    294:     my $domain     = $env{'user.domain'};
1.54      albertel  295: # Screenname
1.59      albertel  296:     my $newtexengine  = $env{'form.texengine'};
1.54      albertel  297:     $newtexengine=~s/[^\-\w]//g;
1.56      albertel  298:     if ($newtexengine eq 'ttm') {
1.116     raeburn   299: 	&Apache::lonnet::appenv({'browser.mathml' => 1});
1.56      albertel  300:     } else {
1.59      albertel  301: 	if ($env{'environment.texengine'} eq 'ttm') {
1.116     raeburn   302: 	    &Apache::lonnet::appenv({'browser.mathml' => 0});
1.56      albertel  303: 	}
                    304:     }
1.54      albertel  305:     my $message='';
                    306:     if ($newtexengine) {
                    307:         &Apache::lonnet::put('environment',{'texengine' => $newtexengine});
1.116     raeburn   308:         &Apache::lonnet::appenv({'environment.texengine' => $newtexengine});
1.158     bisitz    309:         $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Preferred method to display Math').'</i>','<tt>"'.$newtexengine.'"</tt>'));
1.54      albertel  310:     } else {
                    311:         &Apache::lonnet::del('environment',['texengine']);
1.139     raeburn   312:         &Apache::lonnet::delenv('environment.texengine');
1.158     bisitz    313:         $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Preferred method to display Math').'</i>'));
1.54      albertel  314:     }
1.158     bisitz    315:     $message=&Apache::loncommon::confirmwrapper($message);
1.152     www       316:     &print_main_menu($r, $message);
1.54      albertel  317: }
                    318: 
                    319: ################################################################
1.50      albertel  320: #         Roles Page Preference Change Subroutines         #
                    321: ################################################################
                    322: sub rolesprefchanger {
                    323:     my $r = shift;
1.96      albertel  324:     my $role    = ($env{'user.adv'} ? 'Role' : 'Course');
                    325:     my $lc_role = ($env{'user.adv'} ? 'role' : 'course');
1.59      albertel  326:     my $user       = $env{'user.name'};
                    327:     my $domain     = $env{'user.domain'};
1.50      albertel  328:     my %userenv = &Apache::lonnet::get
                    329:         ('environment',['recentroles','recentrolesn']);
1.126     droeschl  330:     Apache::lonhtmlcommon::add_breadcrumb(
                    331: 	    {	href => '/adm/preferences?action=changerolespref',
                    332:                 text => 'Change '.$role.' Page Pref'});
1.147     schafran  333:     $r->print(Apache::loncommon::start_page('Content Display Settings'));
1.126     droeschl  334:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change '.$role.' Page Pref'));
1.50      albertel  335:     my $hotlist_flag=$userenv{'recentroles'};
                    336:     my $hotlist_n=$userenv{'recentrolesn'};
                    337:     my $checked;
                    338:     if ($hotlist_flag) {
                    339: 	$checked = 'checked="checked"';
                    340:     }
                    341:     
                    342:     if (!$hotlist_n) { $hotlist_n=3; }
                    343:     my $options;
                    344:     for (my $i=1; $i<10; $i++) {
                    345: 	my $select;
                    346: 	if ($hotlist_n == $i) { $select = 'selected="selected"'; }
                    347: 	$options .= "<option $select>$i</option>\n";
                    348:     }
                    349: 
1.89      albertel  350: # Get list of recent roles and display with checkbox in front
                    351:     my $roles_check_list = '';
                    352:     my $role_key='';
                    353:     if ($env{'environment.recentroles'}) {
                    354:         my %recent_roles =
                    355:                &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});
1.91      albertel  356:         my %frozen_roles =
                    357:                &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'});
1.89      albertel  358:         
1.93      albertel  359:         my %role_text = &rolespref_get_role_text([keys(%recent_roles)]);
1.92      albertel  360:         my @sorted_roles = sort {$role_text{$a} cmp $role_text{$b}} keys(%role_text);
                    361: 
1.89      albertel  362:         $roles_check_list .=
                    363: 	    &Apache::loncommon::start_data_table().
                    364: 	    &Apache::loncommon::start_data_table_header_row().
1.96      albertel  365: 	    "<th>".&mt('Freeze '.$role)."</th>".
                    366: 	    "<th>".&mt($role)."</td>".
1.89      albertel  367: 	    &Apache::loncommon::end_data_table_header_row().
                    368: 	    "\n";
                    369: 	my $count;
1.92      albertel  370:         foreach $role_key (@sorted_roles) {
1.89      albertel  371:             my $checked = "";
                    372:             my $value = $recent_roles{$role_key};
1.91      albertel  373:             if ($frozen_roles{$role_key}) {
1.159     bisitz    374:                 $checked = ' checked="checked"';
1.89      albertel  375:             }
                    376: 	    $count++;
                    377:             $roles_check_list .=
                    378: 		&Apache::loncommon::start_data_table_row().
                    379: 		'<td class="LC_table_cell_checkbox">'.
1.159     bisitz    380: 		"<input type=\"checkbox\"$checked name=\"freezeroles\"".
1.89      albertel  381: 		" id=\"freezeroles$count\" value=\"$role_key\" /></td>".
                    382: 		"<td><label for=\"freezeroles$count\">".
1.92      albertel  383: 		"$role_text{$role_key}</label></td>".
1.89      albertel  384: 		&Apache::loncommon::end_data_table_row(). "\n";
                    385:         }
                    386:         $roles_check_list .= "</table>\n";
                    387:     }
                    388: 
                    389:     $r->print('
1.96      albertel  390: <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.').'
1.50      albertel  391: </p>
1.160     bisitz    392: <form name="prefs" action="/adm/preferences" method="post">
1.50      albertel  393: <input type="hidden" name="action" value="verify_and_change_rolespref" />
1.96      albertel  394: <br /><label>'.&mt('Enable Recent '.$role.'s Hotlist:').'
1.159     bisitz    395: <input type="checkbox"'.$checked.' name="recentroles" value="true" /></label>
1.96      albertel  396: <br />'.&mt('Number of '.$role.'s in Hotlist:').'
1.50      albertel  397: <select name="recentrolesn" size="1">
1.89      albertel  398: '.$options.'
1.50      albertel  399: </select>
1.96      albertel  400: <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.').'
1.89      albertel  401: </p>
                    402: '.$roles_check_list.'
1.50      albertel  403: <br />
1.136     schafran  404: <input type="submit" value="'.&mt('Save').'" />
1.89      albertel  405: </form>');
1.50      albertel  406: }
                    407: 
1.92      albertel  408: sub rolespref_get_role_text {
                    409: # Get a line of text for each role
                    410:     my ($roles) = @_;
                    411:     my %roletext = ();
                    412: 
                    413:     foreach my $item (@$roles) {
                    414: # get course information
                    415:         my ($role,$rest) = split(/\./, $item);
1.93      albertel  416:         my $trole = "";
                    417:         $trole = &Apache::lonnet::plaintext($role);
1.92      albertel  418:         my ($tdomain,$other,$tsection)= split(/\//,Apache::lonnet::declutter($rest));
                    419:         my $tother = '-';
1.93      albertel  420:         if ($role =~ /^(cc|st|in|ta|ep|cr)/ ) {
1.92      albertel  421:             my %newhash=&Apache::lonnet::coursedescription($tdomain."_".$other);
                    422:             $tother = " - ".$newhash{'description'};
                    423:         } elsif ($role =~ /dc/) {
                    424:             $tother = "";
                    425:         } else {
                    426:             $tother = " - $other";
                    427:         }
                    428:  
                    429:         my $section="";
                    430:         if ($tsection) {
                    431:             $section = " - Section/Group: $tsection";
                    432:         }
                    433:         $roletext{$item} = $tdomain." - ".$trole.$tother.$section;
                    434:     }
                    435:     return %roletext;
                    436: }
                    437: 
1.50      albertel  438: sub verify_and_change_rolespref {
                    439:     my $r = shift;
1.96      albertel  440:     my $role = ($env{'user.adv'} ? 'Role' : 'Course');
1.59      albertel  441:     my $user       = $env{'user.name'};
                    442:     my $domain     = $env{'user.domain'};
1.50      albertel  443: # Recent Roles Hotlist Flag
1.59      albertel  444:     my $hotlist_flag  = $env{'form.recentroles'};
                    445:     my $hotlist_n  = $env{'form.recentrolesn'};
1.89      albertel  446:     my $message='<hr />';
1.50      albertel  447:     if ($hotlist_flag) {
                    448:         &Apache::lonnet::put('environment',{'recentroles' => $hotlist_flag});
1.116     raeburn   449:         &Apache::lonnet::appenv({'environment.recentroles' => $hotlist_flag});
1.96      albertel  450:         $message=&mt('Recent '.$role.'s Hotlist is Enabled');
1.50      albertel  451:     } else {
                    452:         &Apache::lonnet::del('environment',['recentroles']);
1.139     raeburn   453:         &Apache::lonnet::delenv('environment.recentroles');
1.96      albertel  454:         $message=&mt('Recent '.$role.'s Hotlist is Disabled');
1.50      albertel  455:     }
                    456:     if ($hotlist_n) {
                    457:         &Apache::lonnet::put('environment',{'recentrolesn' => $hotlist_n});
1.116     raeburn   458:         &Apache::lonnet::appenv({'environment.recentrolesn' => $hotlist_n});
1.50      albertel  459:         if ($hotlist_flag) {
1.90      albertel  460:             $message.="<br />".
1.96      albertel  461: 		&mt('Display [_1] Most Recent '.$role.'s',$hotlist_n)."\n";
1.89      albertel  462:         }
                    463:     }
                    464: 
                    465: # Get list of froze roles and list of recent roles
                    466:     my @freeze_list = &Apache::loncommon::get_env_multiple('form.freezeroles');
                    467:     my %freeze = ();
1.92      albertel  468:     my %roletext = ();
                    469: 
1.89      albertel  470:     foreach my $key (@freeze_list) {
1.91      albertel  471:         $freeze{$key}='1';
1.89      albertel  472:     }
1.92      albertel  473: 
1.89      albertel  474:     my %recent_roles =
                    475:         &Apache::lonhtmlcommon::get_recent('roles',$env{'environment.recentrolesn'});
1.91      albertel  476:     my %frozen_roles =
                    477:         &Apache::lonhtmlcommon::get_recent_frozen('roles',$env{'environment.recentrolesn'});
1.92      albertel  478:     my %role_text = &rolespref_get_role_text([keys(%recent_roles)]);
1.89      albertel  479: 
                    480: # Unset any roles that were previously frozen but aren't in list
                    481:     foreach my $role_key (sort(keys(%recent_roles))) {
1.91      albertel  482:         if (($frozen_roles{$role_key}) && (!exists($freeze{$role_key}))) {
1.158     bisitz    483: 	    $message .= "<br />".&Apache::lonhtmlcommon::confirm_success(&mt('Unfreezing '.$role.': [_1]','<i>'.$role_text{$role_key}.'</i>'));
1.91      albertel  484: 	    &Apache::lonhtmlcommon::store_recent('roles',$role_key,' ',0);
1.89      albertel  485:         }
                    486:     }
                    487: 
                    488: # Freeze selected roles
                    489:     foreach my $role_key (@freeze_list) {
1.91      albertel  490:         if (!$frozen_roles{$role_key}) {
1.154     www       491:              $message .= "<br />".
1.158     bisitz    492:              &Apache::lonhtmlcommon::confirm_success(&mt('Freezing '.$role.': [_1]','<i>'.$role_text{$role_key}.'</i>'));
1.89      albertel  493:              &Apache::lonhtmlcommon::store_recent('roles',
1.91      albertel  494:                                           $role_key,' ',1);
1.50      albertel  495:         }
                    496:     }
1.158     bisitz    497:     $message=&Apache::loncommon::confirmwrapper($message);
1.152     www       498:     &print_main_menu($r, $message);
1.50      albertel  499: }
                    500: 
                    501: 
1.28      www       502: 
                    503: ################################################################
1.9       matthew   504: #         Anonymous Discussion Name Change Subroutines         #
                    505: ################################################################
1.5       www       506: sub screennamechanger {
                    507:     my $r = shift;
1.59      albertel  508:     my $user       = $env{'user.name'};
                    509:     my $domain     = $env{'user.domain'};
1.14      www       510:     my %userenv = &Apache::lonnet::get
                    511:         ('environment',['screenname','nickname']);
1.6       www       512:     my $screenname=$userenv{'screenname'};
1.14      www       513:     my $nickname=$userenv{'nickname'};
1.126     droeschl  514:     Apache::lonhtmlcommon::add_breadcrumb(
                    515: 		{ href => '/adm/preferences?action=changescreenname',
                    516:                   text => 'Change Screen Name'});
1.147     schafran  517:     $r->print(Apache::loncommon::start_page('Personal Data'));
1.126     droeschl  518:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Screen Name'));
1.133     bisitz    519:     $r->print('<p>'
                    520:              .&mt('Change the name that is displayed in your posts.')
                    521:              .'</p>'
                    522:     );
                    523:     $r->print('<form name="prefs" action="/adm/preferences" method="post">'
                    524:              .'<input type="hidden" name="action" value="verify_and_change_screenname" />'
                    525:              .&Apache::lonhtmlcommon::start_pick_box()
1.158     bisitz    526:              .&Apache::lonhtmlcommon::row_title(&mt('Screenname').' '.&mt('(shown if you post anonymously)'))
1.133     bisitz    527:              .'<input type="text" size="20" value="'.$screenname.'" name="screenname" />'
                    528:              .&Apache::lonhtmlcommon::row_closure()
1.158     bisitz    529:              .&Apache::lonhtmlcommon::row_title(&mt('Nickname').' '.&mt('(shown if you post non-anonymously)'))
1.133     bisitz    530:              .'<input type="text" size="20" value="'.$nickname.'" name="nickname" />'
                    531:              .&Apache::lonhtmlcommon::row_closure()
                    532:              .&Apache::lonhtmlcommon::row_title()
                    533:              .'<input type="submit" value="'.&mt('Save').'" />'
                    534:              .&Apache::lonhtmlcommon::row_closure(1)
                    535:              .&Apache::lonhtmlcommon::end_pick_box()
                    536:              .'</form>'
                    537:     );
1.5       www       538: }
1.6       www       539: 
                    540: sub verify_and_change_screenname {
                    541:     my $r = shift;
1.59      albertel  542:     my $user       = $env{'user.name'};
                    543:     my $domain     = $env{'user.domain'};
1.14      www       544: # Screenname
1.59      albertel  545:     my $newscreen  = $env{'form.screenname'};
1.14      www       546:     $newscreen=~s/[^ \w]//g;
1.6       www       547:     my $message='';
                    548:     if ($newscreen) {
1.7       www       549:         &Apache::lonnet::put('environment',{'screenname' => $newscreen});
1.116     raeburn   550:         &Apache::lonnet::appenv({'environment.screenname' => $newscreen});
1.161     bisitz    551:         $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Screenname').'</i>','<tt>"'.$newscreen.'"</tt>'));
1.6       www       552:     } else {
                    553:         &Apache::lonnet::del('environment',['screenname']);
1.139     raeburn   554:         &Apache::lonnet::delenv('environment.screenname');
1.158     bisitz    555:         $message=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Screenname').'</i>'));
1.6       www       556:     }
1.14      www       557: # Nickname
                    558:     $message.='<br />';
1.59      albertel  559:     $newscreen  = $env{'form.nickname'};
1.14      www       560:     $newscreen=~s/[^ \w]//g;
                    561:     if ($newscreen) {
                    562:         &Apache::lonnet::put('environment',{'nickname' => $newscreen});
1.116     raeburn   563:         &Apache::lonnet::appenv({'environment.nickname' => $newscreen});
1.161     bisitz    564:         $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Nickname').'</i>','<tt>"'.$newscreen.'"</tt>'));
1.14      www       565:     } else {
                    566:         &Apache::lonnet::del('environment',['nickname']);
1.139     raeburn   567:         &Apache::lonnet::delenv('environment.nickname');
1.158     bisitz    568:         $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.&mt('Nickname').'</i>'));
1.14      www       569:     }
1.68      www       570:     &Apache::lonnet::devalidate_cache_new('namescache',$user.':'.$domain);
1.158     bisitz    571:     $message=&Apache::loncommon::confirmwrapper($message);
1.152     www       572:     &print_main_menu($r, $message);
1.20      www       573: }
                    574: 
                    575: ################################################################
1.98      www       576: #                     Icon Subroutines                         #
                    577: ################################################################
                    578: sub iconchanger {
                    579:     my $r = shift;
1.154     www       580:     &Apache::lonhtmlcommon::add_breadcrumb(
1.126     droeschl  581: 	    {	href => '/adm/preferences?action=changeicons',
                    582:                 text => 'Change Main Menu'});
1.147     schafran  583:     $r->print(Apache::loncommon::start_page('Page Display Settings'));
1.126     droeschl  584:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Main Menu'));
                    585: 
1.98      www       586:     my $user       = $env{'user.name'};
                    587:     my $domain     = $env{'user.domain'};
                    588:     my %userenv = &Apache::lonnet::get
                    589:         ('environment',['icons']);
                    590:     my $iconic='checked="checked"';
                    591:     my $classic='';
1.100     www       592:     my $onlyicon='';
1.98      www       593:     if ($userenv{'icons'} eq 'classic') {
                    594:        $classic='checked="checked"';
                    595:        $iconic='';
                    596:     }
1.100     www       597:     if ($userenv{'icons'} eq 'iconsonly') {
                    598:        $onlyicon='checked="checked"';
                    599:        $iconic='';
                    600:     }
                    601:     my $useicons=&mt('Use icons and text');
                    602:     my $usebuttons=&mt('Use buttons and text');
                    603:     my $useicononly=&mt('Use icons only');
1.136     schafran  604:     my $change=&mt('Save');
1.98      www       605:     $r->print(<<ENDSCREEN);
                    606: <form name="prefs" action="/adm/preferences" method="post">
                    607: <input type="hidden" name="action" value="verify_and_change_icons" />
                    608: <label><input type="radio" name="menumode" value="iconic" $iconic /> $useicons</label><br />
                    609: <label><input type="radio" name="menumode" value="classic" $classic /> $usebuttons</label><br />
1.100     www       610: <label><input type="radio" name="menumode" value="iconsonly" $onlyicon /> $useicononly</label><br />
1.98      www       611: <input type="submit" value="$change" />
                    612: </form>
                    613: ENDSCREEN
                    614: }
                    615: 
                    616: sub verify_and_change_icons {
                    617:     my $r = shift;
                    618:     my $user       = $env{'user.name'};
                    619:     my $domain     = $env{'user.domain'};
1.158     bisitz    620:     my $newicons   = $env{'form.menumode'};
1.98      www       621: 
                    622:     &Apache::lonnet::put('environment',{'icons' => $newicons});
1.116     raeburn   623:     &Apache::lonnet::appenv({'environment.icons' => $newicons});
1.158     bisitz    624:     my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Menu Display').'</i>','<tt>'.$newicons.'</tt>'));
                    625:     $message=&Apache::loncommon::confirmwrapper($message);
                    626:     &print_main_menu($r, $message);
1.98      www       627: }
                    628: 
                    629: ################################################################
1.105     www       630: #                     Clicker Subroutines                      #
                    631: ################################################################
                    632: 
                    633: sub clickerchanger {
                    634:     my $r = shift;
1.152     www       635:     &Apache::lonhtmlcommon::add_breadcrumb(
1.126     droeschl  636: 	    {	href => '/adm/preferences?action=changeclicker',
                    637:                 text => 'Register Clicker'});
1.147     schafran  638:     $r->print(Apache::loncommon::start_page('Other'));
1.126     droeschl  639:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Register Clicker'));
1.105     www       640:     my $user       = $env{'user.name'};
                    641:     my $domain     = $env{'user.domain'};
                    642:     my %userenv = &Apache::lonnet::get
                    643:         ('environment',['clickers']);
                    644:     my $clickers=$userenv{'clickers'};
                    645:     $clickers=~s/\,/\n/gs;
                    646:     my $text=&mt('Enter response device ("clicker") numbers');
1.151     bisitz    647:     my $change=&mt('Save');
1.114     bisitz    648:     my $helplink=&Apache::loncommon::help_open_topic('Clicker_Registration',&mt('Locating your clicker ID'));
1.105     www       649:     $r->print(<<ENDSCREEN);
                    650: <form name="prefs" action="/adm/preferences" method="post">
                    651: <input type="hidden" name="action" value="verify_and_change_clicker" />
1.151     bisitz    652: <label>$helplink<br /><br />$text<br />
1.108     www       653: <textarea name="clickers" rows="5" cols="20">$clickers</textarea>
1.105     www       654: </label>
1.151     bisitz    655: <br />
1.105     www       656: <input type="submit" value="$change" />
                    657: </form>
                    658: ENDSCREEN
                    659: }
                    660: 
                    661: sub verify_and_change_clicker {
                    662:     my $r = shift;
                    663:     my $user       = $env{'user.name'};
                    664:     my $domain     = $env{'user.domain'};
                    665:     my $newclickers  = $env{'form.clickers'};
1.108     www       666:     $newclickers=~s/[^\w\:\-]+/\,/gs;
1.105     www       667:     $newclickers=~tr/a-z/A-Z/;
1.108     www       668:     $newclickers=~s/[\:\-]+/\-/g;
                    669:     $newclickers=~s/\,+/\,/g;
1.105     www       670:     $newclickers=~s/^\,//;
                    671:     $newclickers=~s/\,$//;
                    672:     &Apache::lonnet::put('environment',{'clickers' => $newclickers});
1.116     raeburn   673:     &Apache::lonnet::appenv({'environment.clickers' => $newclickers});
1.158     bisitz    674:     my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Registering clickers: [_1]',$newclickers));
                    675:     $message=&Apache::loncommon::confirmwrapper($message);
                    676:     &print_main_menu($r, $message);
1.105     www       677: }
                    678: 
1.119     www       679: ################################################################
                    680: #               Domcoord Access Subroutines                    #
                    681: ################################################################
                    682: 
                    683: sub domcoordchanger {
                    684:     my $r = shift;
1.154     www       685:     &Apache::lonhtmlcommon::add_breadcrumb(
1.126     droeschl  686: 	    {	href => '/adm/preferences?action=changedomcoord',
                    687:                 text => 'Restrict Domain Coordinator Access'});
                    688:     $r->print(Apache::loncommon::start_page('Restrict Domain Coordinator Access'));
                    689:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Restrict Domain Coordinator Access'));
1.119     www       690:     my $user       = $env{'user.name'};
                    691:     my $domain     = $env{'user.domain'};
                    692:     my %userenv = &Apache::lonnet::get
1.120     www       693:         ('environment',['domcoord.author']);
1.119     www       694:     my $constchecked='';
                    695:     if ($userenv{'domcoord.author'} eq 'blocked') {
1.159     bisitz    696:        $constchecked=' checked="checked"';
1.119     www       697:     }
1.120     www       698:     my $text=&mt('By default, the Domain Coordinator can enter your construction space.');
1.119     www       699:     my $construction=&mt('Block access to construction space');
1.136     schafran  700:     my $change=&mt('Save');
1.119     www       701:     $r->print(<<ENDSCREEN);
                    702: <form name="prefs" action="/adm/preferences" method="post">
                    703: <input type="hidden" name="action" value="verify_and_change_domcoord" />
                    704: $text<br />
1.159     bisitz    705: <label><input type="checkbox" name="construction"$constchecked />$construction</label><br />
1.119     www       706: <input type="submit" value="$change" />
                    707: </form>
                    708: ENDSCREEN
                    709: }
                    710: 
                    711: sub verify_and_change_domcoord {
                    712:     my $r = shift;
                    713:     my $user       = $env{'user.name'};
                    714:     my $domain     = $env{'user.domain'};
1.120     www       715:     my %domcoord=('domcoord.author' => '');
1.119     www       716:     if ($env{'form.construction'}) { $domcoord{'domcoord.author'}='blocked'; }
                    717:     &Apache::lonnet::put('environment',\%domcoord);
1.120     www       718:     &Apache::lonnet::appenv({'environment.domcoord.author' => $domcoord{'domcoord.author'}});
1.158     bisitz    719:     my $status='';
                    720:     if ($domcoord{'domcoord.author'} eq 'blocked') {
                    721:         $status=&mt('on');
                    722:     } else {
                    723:         $status=&mt('off');
                    724:     }
                    725:     my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Block access to construction space').'</i>','<tt>'.$status.'</tt>'));
                    726:     $message=&Apache::loncommon::confirmwrapper($message);
                    727:     &print_main_menu($r,$message);
1.119     www       728: }
                    729: 
1.118     www       730: #################################################################
                    731: ##                      Lock Subroutines                        #
                    732: #################################################################
                    733: 
                    734: sub lockwarning {
                    735:     my $r = shift;
                    736:     my $title=&mt('Action locked');
                    737:     my $texttop=&mt('LON-CAPA is currently performing the following actions:');
                    738:     my $textbottom=&mt('Changing roles or logging out may result in data corruption.');
                    739:     my ($num,%which)=&Apache::lonnet::get_locks();
                    740:     my $which='';
                    741:     foreach my $id (keys %which) {
                    742:        $which.='<li>'.$which{$id}.'</li>';
                    743:     }
                    744:     my $change=&mt('Override');
                    745:     $r->print(<<ENDSCREEN);
                    746: <form name="prefs" action="/adm/preferences" method="post">
                    747: <input type="hidden" name="action" value="verify_and_change_locks" />
                    748: <h1>$title</h1>
                    749: $texttop
                    750: <ul>
                    751: $which
                    752: </ul>
                    753: $textbottom
                    754: <input type="submit" value="$change" />
                    755: </form>
                    756: ENDSCREEN
                    757: }
                    758: 
                    759: sub verify_and_change_lockwarning {
                    760:     my $r = shift;
                    761:     &Apache::lonnet::remove_all_locks();
                    762:     $r->print(&mt('Cleared locks.'));
                    763: }
                    764: 
                    765: 
1.105     www       766: ################################################################
1.20      www       767: #         Message Forward                                      #
                    768: ################################################################
                    769: 
                    770: sub msgforwardchanger {
1.102     raeburn   771:     my ($r,$message) = @_;
1.59      albertel  772:     my $user       = $env{'user.name'};
                    773:     my $domain     = $env{'user.domain'};
1.102     raeburn   774:     my %userenv = &Apache::lonnet::get('environment',['msgforward','notification','critnotification','notifywithhtml']);
1.20      www       775:     my $msgforward=$userenv{'msgforward'};
1.102     raeburn   776:     my %lt = &Apache::lonlocal::texthash(
                    777:                                           all   => 'All',
                    778:                                           crit  => 'Critical only',
                    779:                                           reg   => 'Non-critical only',
                    780:                                           foad  => 'Forwarding Address(es)',
1.113     raeburn   781:                                           noti  => 'Notification E-mail Address(es)', 
1.110     bisitz    782:                                           foad_exmpl => 'e.g. <tt>userA:domain1,userB:domain2,...</tt>',
1.130     schafran  783:                                           mnot  => 'E-mail Address(es) which should be notified about new LON-CAPA messages',
                    784:  # old: 'Message Notification Email Address(es)',
1.110     bisitz    785:                                           mnot_exmpl => 'e.g. <tt>joe@doe.com</tt>',
1.136     schafran  786:                                           chg   => 'Save',
1.104     raeburn   787:                                           email => 'The e-mail address entered in row ',
1.102     raeburn   788:                                           notv => 'is not a valid e-mail address',
1.103     raeburn   789:                                           toen => "To enter multiple addresses, enter one address at a time, click 'Change' and then add the next one", 
1.136     schafran  790:                                           prme => 'Back',
1.102     raeburn   791:                                         );
1.126     droeschl  792:     Apache::lonhtmlcommon::add_breadcrumb(
                    793: 	    {	href => '/adm/preferences?action=changemsgforward',
                    794: 		text => 'Change Message Forwarding/Notification'});
1.147     schafran  795:     $r->print(Apache::loncommon::start_page('Message Management'));
1.126     droeschl  796:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Message Forwarding/Notification'));
1.113     raeburn   797:     my $forwardingHelp = &Apache::loncommon::help_open_topic("Prefs_Forwarding");
                    798:     my $notificationHelp = &Apache::loncommon::help_open_topic("Prefs_Notification");
                    799:     my $criticalMessageHelp = &Apache::loncommon::help_open_topic("Course_Critical_Message");
1.102     raeburn   800:     my @allow_html = split(/,/,$userenv{'notifywithhtml'});
                    801:     my %allnot = &get_notifications(\%userenv);
                    802:     my $validatescript = &Apache::lonhtmlcommon::javascript_valid_email();
                    803:     my $jscript = qq|
1.148     bisitz    804: <script type="text/javascript" language="JavaScript">
1.102     raeburn   805: function validate() {
                    806:     for (var i=0; i<document.prefs.numnotify.value; i++) {
1.104     raeburn   807:         var checkaddress = 0;
1.102     raeburn   808:         var addr = document.prefs.elements['address_'+i].value;
1.104     raeburn   809:         var rownum = i+1;
1.102     raeburn   810:         if (i < document.prefs.numnotify.value-1) {
1.104     raeburn   811:             if (document.prefs.elements['modify_notify_'+i].checked) {
1.102     raeburn   812:                 checkaddress = 1;
1.104     raeburn   813:             }
1.102     raeburn   814:         } else {
                    815:             if (document.prefs.elements['add_notify_'+i].checked == true) { 
                    816:                 checkaddress = 1;
                    817:             }
                    818:         }
1.104     raeburn   819:         if (checkaddress == 1)  {
1.102     raeburn   820:             var addr = document.prefs.elements['address_'+i].value;
                    821:             if (validmail(document.prefs.elements['address_'+i]) == false) {
1.104     raeburn   822:                 var multimsg = '';
                    823:                 if (addr.indexOf(",") >= 0) {
                    824:                     multimsg = "\\n($lt{'toen'}).";
                    825:                 }
1.110     bisitz    826:                 alert("$lt{'email'} "+rownum+" ('"+addr+"') $lt{'notv'}."+multimsg);
1.102     raeburn   827:                 return;
                    828:             }
                    829:         }
                    830:     }
                    831:     document.prefs.submit();
                    832: }
1.104     raeburn   833: 
                    834: function address_changes (adnum) {
                    835:      if (!document.prefs.elements['del_notify_'+adnum].checked) { 
                    836:          document.prefs.elements['modify_notify_'+adnum].checked = true;
                    837:      }   
                    838: }
                    839: 
                    840: function new_address(adnum) {
                    841:      document.prefs.elements['add_notify_'+adnum].checked = true;
                    842: }
                    843: 
                    844: function delete_address(adnum) {
                    845:      if (document.prefs.elements['del_notify_'+adnum].checked) {
                    846:           document.prefs.elements['modify_notify_'+adnum].checked = false;
                    847:      }
                    848: }
                    849: 
                    850: function modify_address(adnum) {
                    851:     if (document.prefs.elements['modify_notify_'+adnum].checked) {
                    852:         document.prefs.elements['del_notify_'+adnum].checked = false;
                    853:     }
                    854: } 
                    855: 
1.102     raeburn   856: $validatescript
                    857: </script>
                    858: |;
1.20      www       859:     $r->print(<<ENDMSG);
1.102     raeburn   860: $jscript
                    861: $message
1.113     raeburn   862: <h3>$lt{'foad'} $forwardingHelp</h3>
1.88      albertel  863: <form name="prefs" action="/adm/preferences" method="post">
1.20      www       864: <input type="hidden" name="action" value="verify_and_change_msgforward" />
1.110     bisitz    865: $lt{'foad'} ($lt{'foad_exmpl'}):
1.113     raeburn   866: <input type="text" size="40" value="$msgforward" name="msgforward" /><br />
                    867: <h3>$lt{'noti'} $notificationHelp</h3>
1.110     bisitz    868: $lt{'mnot'} ($lt{'mnot_exmpl'}):<br />
1.102     raeburn   869: ENDMSG
                    870:     my @sortforwards = sort (keys(%allnot));
                    871:     my $output = &Apache::loncommon::start_data_table().
                    872:                  &Apache::loncommon::start_data_table_header_row().
1.104     raeburn   873:                  '<th>&nbsp;</th>'.
1.102     raeburn   874:                  '<th>'.&mt('Action').'</th>'.
                    875:                  '<th>'.&mt('Notification address').'</th><th>'.
1.113     raeburn   876:                  &mt('Types of message for which notification is sent').
                    877:                  $criticalMessageHelp.'</th><th>'.
1.104     raeburn   878:                  &mt('Excerpt retains HTML tags in message').'</th>'.
1.102     raeburn   879:                  &Apache::loncommon::end_data_table_header_row();
                    880:     my $num = 0;
1.104     raeburn   881:     my $counter = 1;
1.102     raeburn   882:     foreach my $item (@sortforwards) {
                    883:         $output .= &Apache::loncommon::start_data_table_row().
1.104     raeburn   884:                    '<td><b>'.$counter.'</b></td>'.
                    885:                    '<td><span class="LC_nobreak"><label>'.
                    886:                    '<input type="checkbox" name="modify_notify_'.
                    887:                    $num.'" onclick="javscript:modify_address('."'$num'".')" />'.
                    888:                    &mt('Modify').'</label></span>&nbsp;&nbsp; '.
                    889:                    '<span class="LC_nobreak"><label>'.
                    890:                    '<input type="checkbox" name="del_notify_'.$num.
                    891:                    '" onclick="javscript:delete_address('."'$num'".')" />'.
                    892:                    &mt('Delete').'</label></span></td>'.
1.102     raeburn   893:                    '<td><input type="text" value="'.$item.'" name="address_'.
1.104     raeburn   894:                    $num.'" onFocus="javascript:address_changes('."'$num'".
                    895:                    ')" /></td><td>';
1.102     raeburn   896:         my %chk;
                    897:         if (defined($allnot{$item}{'crit'})) {
                    898:             if (defined($allnot{$item}{'reg'})) {
                    899:                 $chk{'all'} = 'checked="checked" ';
                    900:             } else {
                    901:                 $chk{'crit'} = 'checked="checked" ';
                    902:             }
                    903:         } else {
                    904:             $chk{'reg'} = 'checked="checked" ';
                    905:         }
                    906:         foreach my $type ('all','crit','reg') {
                    907:             $output .= '<span class="LC_nobreak"><label>'.
                    908:                        '<input type="radio" name="notify_type_'.$num. 
1.104     raeburn   909:                        '" value="'.$type.'" '.$chk{$type}.
                    910:                        ' onchange="javascript:address_changes('."'$num'".')" />'.
                    911:                        $lt{$type}.'</label></span>&nbsp;';
1.102     raeburn   912:         }
                    913:         my $htmlon = '';
                    914:         my $htmloff = '';
                    915:         if (grep/^\Q$item\E/,@allow_html) {
                    916:             $htmlon = 'checked="checked" '; 
                    917:         } else {
                    918:             $htmloff = 'checked="checked" ';
                    919:         }
                    920:         $output .= '</td><td><label><input type="radio" name="html_'.$num.
1.104     raeburn   921:                    '" value="1" '.$htmlon.
                    922:                    ' onchange="javascript:address_changes('."'$num'".')" />'.
                    923:                    &mt('Yes').'</label>&nbsp;'.
1.102     raeburn   924:                    '<label><input type="radio" name="html_'.$num.'" value="0" '.
1.104     raeburn   925:                    $htmloff. ' onchange="javascript:address_changes('."'$num'".
                    926: ')" />'.
                    927:                    &mt('No').'</label></td>'.
1.102     raeburn   928:                    &Apache::loncommon::end_data_table_row();
                    929:         $num ++;
1.104     raeburn   930:         $counter ++;
1.102     raeburn   931:     }
                    932:     my %defchk = (
                    933:                    all => 'checked="checked" ',
                    934:                    crit => '',
                    935:                    reg => '',
                    936:                  );
                    937:     $output .= &Apache::loncommon::start_data_table_row().
1.104     raeburn   938:                '<td><b>'.$counter.'</b></td>'.
                    939:                '<td><span class="LC_nobreak"><label>'.
                    940:                '<input type="checkbox" name="add_notify_'.$num.
                    941:                '" value="1" />'.&mt('Add new address').'</label></span></td>'.
1.102     raeburn   942:                '<td><input type="text" value="" name="address_'.$num.
1.104     raeburn   943:                '" onFocus="javascript:new_address('."'$num'".')" /></td><td>';
1.102     raeburn   944:     foreach my $type ('all','crit','reg') {
                    945:         $output .= '<span class="LC_nobreak"><label>'.
                    946:                    '<input type="radio" name="notify_type_'.$num.
                    947:                    '" value="'.$type.'" '.$defchk{$type}.'/>'.
                    948:                    $lt{$type}.'</label></span>&nbsp;';
                    949:     }
                    950:     $output .= '</td><td><label><input type="radio" name="html_'.$num.
                    951:                '" value="1" />'.&mt('Yes').'</label>&nbsp;'.
                    952:                '<label><input type="radio" name="html_'.$num.'" value="0" '.
                    953:                ' checked="checked" />'.
                    954:                &mt('No').'</label></td>'.
                    955:                &Apache::loncommon::end_data_table_row().
                    956:                &Apache::loncommon::end_data_table();
                    957:     $num ++;
                    958:     $r->print($output);
                    959:     $r->print(qq|
1.113     raeburn   960: <br /><hr />
1.102     raeburn   961: <input type="hidden" name="numnotify" value="$num" />
1.136     schafran  962: <input type="button" value="$lt{'prme'}" onclick="location.href='/adm/preferences'" />
1.102     raeburn   963: <input type="button" value="$lt{'chg'}" onclick="javascript:validate()" />
1.20      www       964: </form>
1.102     raeburn   965: |);
                    966: 
                    967: }
                    968: 
                    969: sub get_notifications {
                    970:     my ($userenv) = @_;
                    971:     my %allnot;
                    972:     my @critnot = split(/,/,$userenv->{'critnotification'});
                    973:     my @regnot = split(/,/,$userenv->{'notification'});
                    974:     foreach my $item (@critnot) {
                    975:         $allnot{$item}{crit} = 1;
                    976:     }
                    977:     foreach my $item (@regnot) {
                    978:         $allnot{$item}{reg} = 1;
                    979:     }
                    980:     return %allnot;
1.20      www       981: }
                    982: 
                    983: sub verify_and_change_msgforward {
                    984:     my $r = shift;
1.59      albertel  985:     my $user       = $env{'user.name'};
                    986:     my $domain     = $env{'user.domain'};
1.20      www       987:     my $newscreen  = '';
                    988:     my $message='';
1.59      albertel  989:     foreach (split(/\,/,$env{'form.msgforward'})) {
1.20      www       990: 	my ($msuser,$msdomain)=split(/[\@\:]/,$_);
1.95      albertel  991:         $msuser = &LONCAPA::clean_username($msuser);
                    992:         $msdomain = &LONCAPA::clean_domain($msdomain);
1.20      www       993:         if (($msuser) && ($msdomain)) {
                    994: 	    if (&Apache::lonnet::homeserver($msuser,$msdomain) ne 'no_host') {
                    995:                $newscreen.=$msuser.':'.$msdomain.',';
                    996: 	   } else {
1.163   ! bisitz    997:                $message.= &mt('No such user: ').'<tt>'.$msuser.':'.$msdomain.'</tt><br />';
1.20      www       998:            }
                    999:         }
                   1000:     }
                   1001:     $newscreen=~s/\,$//;
                   1002:     if ($newscreen) {
                   1003:         &Apache::lonnet::put('environment',{'msgforward' => $newscreen});
1.116     raeburn  1004:         &Apache::lonnet::appenv({'environment.msgforward' => $newscreen});
1.110     bisitz   1005:         $message .= &mt('Set message forwarding to ').'<tt>"'.$newscreen.'"</tt>.'
                   1006:                     .'<br />';
1.20      www      1007:     } else {
                   1008:         &Apache::lonnet::del('environment',['msgforward']);
1.139     raeburn  1009:         &Apache::lonnet::delenv('environment.msgforward');
1.102     raeburn  1010:         $message.= &mt("Set message forwarding to 'off'.").'<br />';
1.20      www      1011:     }
1.102     raeburn  1012:     my $critnotification;
                   1013:     my $notification;
                   1014:     my $notify_with_html;
                   1015:     my $lastnotify = $env{'form.numnotify'}-1;
1.104     raeburn  1016:     my $totaladdresses = 0;
1.102     raeburn  1017:     for (my $i=0; $i<$env{'form.numnotify'}; $i++) {
                   1018:         if ((!defined($env{'form.del_notify_'.$i})) &&  
1.104     raeburn  1019:            ((($i==$lastnotify) && ($env{'form.add_notify_'.$lastnotify} == 1)) ||
1.102     raeburn  1020:             ($i<$lastnotify))) {
                   1021:             if (defined($env{'form.address_'.$i})) {
                   1022:                 if ($env{'form.notify_type_'.$i} eq 'all') {
                   1023:                     $critnotification .= $env{'form.address_'.$i}.',';
                   1024:                     $notification .= $env{'form.address_'.$i}.',';
                   1025:                 } elsif ($env{'form.notify_type_'.$i} eq 'crit') {
                   1026:                     $critnotification .= $env{'form.address_'.$i}.',';
                   1027:                 } elsif ($env{'form.notify_type_'.$i} eq 'reg') {
                   1028:                     $notification .= $env{'form.address_'.$i}.','; 
                   1029:                 }
                   1030:                 if ($env{'form.html_'.$i} eq '1') {
                   1031: 		    $notify_with_html .= $env{'form.address_'.$i}.',';       	
                   1032:                 }
1.104     raeburn  1033:                 $totaladdresses ++;
1.102     raeburn  1034:             }
                   1035:         }
                   1036:     }
                   1037:     $critnotification =~ s/,$//;
                   1038:     $critnotification=~s/\s//gs;
                   1039:     $notification =~ s/,$//;
1.20      www      1040:     $notification=~s/\s//gs;
1.102     raeburn  1041:     $notify_with_html =~ s/,$//;
                   1042:     $notify_with_html =~ s/\s//gs;
1.20      www      1043:     if ($notification) {
                   1044:         &Apache::lonnet::put('environment',{'notification' => $notification});
1.116     raeburn  1045:         &Apache::lonnet::appenv({'environment.notification' => $notification});
1.110     bisitz   1046:         $message.=&mt('Set non-critical message notification address(es) to ').'<tt>"'.$notification.'"</tt>.<br />';
1.20      www      1047:     } else {
                   1048:         &Apache::lonnet::del('environment',['notification']);
1.139     raeburn  1049:         &Apache::lonnet::delenv('environment.notification');
1.110     bisitz   1050:         $message.=&mt("Set non-critical message notification to 'off'.").'<br />';
1.20      www      1051:     }
                   1052:     if ($critnotification) {
                   1053:         &Apache::lonnet::put('environment',{'critnotification' => $critnotification});
1.116     raeburn  1054:         &Apache::lonnet::appenv({'environment.critnotification' => $critnotification});
1.110     bisitz   1055:         $message.=&mt('Set critical message notification address(es) to ').'<tt>"'.$critnotification.'"</tt>.<br />';
1.20      www      1056:     } else {
                   1057:         &Apache::lonnet::del('environment',['critnotification']);
1.139     raeburn  1058:         &Apache::lonnet::delenv('environment.critnotification');
1.110     bisitz   1059:         $message.=&mt("Set critical message notification to 'off'.").'<br />';
1.102     raeburn  1060:     }
                   1061:     if ($critnotification || $notification) {
                   1062:         if ($notify_with_html) {
                   1063:             &Apache::lonnet::put('environment',{'notifywithhtml' => $notify_with_html});
1.116     raeburn  1064:             &Apache::lonnet::appenv({'environment.notifywithhtml' => $notify_with_html});
1.110     bisitz   1065:             $message.=&mt('Set address(es) to receive excerpts with html retained ').'<tt>"'.$notify_with_html.'"</tt>.';
1.102     raeburn  1066:         } else {
                   1067:             &Apache::lonnet::del('environment',['notifywithhtml']);
1.139     raeburn  1068:             &Apache::lonnet::delenv('environment.notifywithhtml');
1.104     raeburn  1069:             if ($totaladdresses == 1) {
                   1070:                 $message.=&mt("Set notification address to receive excerpts with html stripped.");
                   1071:             } else {
                   1072:                 $message.=&mt("Set all notification addresses to receive excerpts with html stripped.");
                   1073:             }
1.102     raeburn  1074:         }
                   1075:     } else {
                   1076:         &Apache::lonnet::del('environment',['notifywithhtml']);
1.139     raeburn  1077:         &Apache::lonnet::delenv('environment.notifywithhtml');
1.102     raeburn  1078:     }
                   1079:     if ($message) {
                   1080:         $message .= '<br /><hr />';
1.20      www      1081:     }
1.109     albertel 1082:     &Apache::loncommon::flush_email_cache($user,$domain);
1.102     raeburn  1083:     &msgforwardchanger($r,$message);
1.6       www      1084: }
                   1085: 
1.12      www      1086: ################################################################
1.19      www      1087: #         Colors                                               #
1.12      www      1088: ################################################################
                   1089: 
1.19      www      1090: sub colorschanger {
1.12      www      1091:     my $r = shift;
1.126     droeschl 1092:     Apache::lonhtmlcommon::add_breadcrumb(
                   1093: 	    {	href => '/adm/preferences?action=changecolors',
                   1094:                 text => 'Change Colors'});
1.147     schafran 1095:     $r->print(Apache::loncommon::start_page('Page Display Settings'));
1.126     droeschl 1096:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Colors'));
1.19      www      1097: # figure out colors
1.80      albertel 1098:     my $function=&Apache::loncommon::get_users_function();
1.19      www      1099:     my $domain=&Apache::loncommon::determinedomain();
1.157     bisitz   1100:     my %colortypes=&Apache::lonlocal::texthash(
                   1101:         'pgbg'     => 'Page Background Color',
                   1102:         'tabbg'    => 'Header Background Color',
                   1103:         'sidebg'   => 'Header Border Color',
                   1104:         'font'     => 'Font Color',
                   1105:         'fontmenu' => 'Font Menu Color',
                   1106:         'link'     => 'Un-Visited Link Color',
                   1107:         'vlink'    => 'Visited Link Color',
                   1108:         'alink'    => 'Active Link Color',
                   1109:     );
1.82      albertel 1110:     my $start_data_table = &Apache::loncommon::start_data_table();
1.19      www      1111:     my $chtable='';
1.22      matthew  1112:     foreach my $item (sort(keys(%colortypes))) {
1.19      www      1113:        my $curcol=&Apache::loncommon::designparm($function.'.'.$item,$domain);
1.82      albertel 1114:        $chtable.=&Apache::loncommon::start_data_table_row().
1.83      albertel 1115: 	   '<td>'.$colortypes{$item}.'</td><td style="background: '.$curcol.
1.19      www      1116:         '">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td><input name="'.$item.
1.21      www      1117:         '" size="10" value="'.$curcol.
                   1118: '" /></td><td><a href="javascript:pjump('."'color_custom','".$colortypes{$item}.
1.19      www      1119: "','".$curcol."','"
1.157     bisitz   1120: 	    .$item."','parmform.pres','psub'".');">'.&mt('Select').'</a></td>'.
1.83      albertel 1121: 	    &Apache::loncommon::end_data_table_row()."\n";
1.19      www      1122:     }
1.82      albertel 1123:     my $end_data_table = &Apache::loncommon::end_data_table();
1.23      matthew  1124:     my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
1.157     bisitz   1125:     my $savebutton = &mt('Save');
                   1126:     my $resetbutton = &mt('Reset All');
                   1127:     my $resetbuttondesc = &mt('Reset All Colors to Default');
1.19      www      1128:     $r->print(<<ENDCOL);
1.148     bisitz   1129: <script type="text/javascript" language="JavaScript">
1.19      www      1130: 
                   1131:     function pclose() {
                   1132:         parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
                   1133:                  "height=350,width=350,scrollbars=no,menubar=no");
                   1134:         parmwin.close();
                   1135:     }
                   1136: 
1.23      matthew  1137:     $pjump_def
1.19      www      1138: 
                   1139:     function psub() {
                   1140:         pclose();
                   1141:         if (document.parmform.pres_marker.value!='') {
1.21      www      1142:             if (document.parmform.pres_type.value!='') {
1.77      albertel 1143:                 eval('document.prefs.'+
1.21      www      1144:                      document.parmform.pres_marker.value+
1.19      www      1145: 		     '.value=document.parmform.pres_value.value;');
1.21      www      1146: 	    }
1.19      www      1147:         } else {
                   1148:             document.parmform.pres_value.value='';
                   1149:             document.parmform.pres_marker.value='';
                   1150:         }
                   1151:     }
                   1152: 
                   1153: 
                   1154: </script>
1.21      www      1155: <form name="parmform">
                   1156: <input type="hidden" name="pres_marker" />
                   1157: <input type="hidden" name="pres_type" />
                   1158: <input type="hidden" name="pres_value" />
                   1159: </form>
1.88      albertel 1160: <form name="prefs" action="/adm/preferences" method="post">
1.19      www      1161: <input type="hidden" name="action" value="verify_and_change_colors" />
1.82      albertel 1162: $start_data_table
1.19      www      1163: $chtable
1.82      albertel 1164: $end_data_table
1.19      www      1165: </table>
1.157     bisitz   1166: <p>
                   1167: <input type="submit" value="$savebutton" />
                   1168: <input type="submit" name="resetall" value="$resetbutton" title="$resetbuttondesc" />
                   1169: </p>
1.12      www      1170: </form>
1.19      www      1171: ENDCOL
1.12      www      1172: }
                   1173: 
1.19      www      1174: sub verify_and_change_colors {
1.12      www      1175:     my $r = shift;
1.19      www      1176: # figure out colors
1.80      albertel 1177:     my $function=&Apache::loncommon::get_users_function();
1.19      www      1178:     my $domain=&Apache::loncommon::determinedomain();
1.157     bisitz   1179:     my %colortypes=&Apache::lonlocal::texthash(
                   1180:         'pgbg'     => 'Page Background Color',
                   1181:         'tabbg'    => 'Header Background Color',
                   1182:         'sidebg'   => 'Header Border Color',
                   1183:         'font'     => 'Font Color',
                   1184: 	'fontmenu' => 'Font Menu Color',
                   1185:         'link'     => 'Un-Visited Link Color',
                   1186:         'vlink'    => 'Visited Link Color',
                   1187:         'alink'    => 'Active Link Color',
                   1188:     );
1.19      www      1189: 
1.12      www      1190:     my $message='';
1.21      www      1191:     foreach my $item (keys %colortypes) {
1.59      albertel 1192:         my $color=$env{'form.'.$item};
1.21      www      1193:         my $entry='color.'.$function.'.'.$item;
1.59      albertel 1194: 	if (($color=~/^\#[0-9A-Fa-f]{6}$/) && (!$env{'form.resetall'})) {
1.21      www      1195: 	    &Apache::lonnet::put('environment',{$entry => $color});
1.116     raeburn  1196: 	    &Apache::lonnet::appenv({'environment.'.$entry => $color});
1.157     bisitz   1197:             $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.$colortypes{$item}.'</i>','<tt>"'.$color.'"</tt>'))
                   1198:                     .'<br />';
1.21      www      1199: 	} else {
                   1200: 	    &Apache::lonnet::del('environment',[$entry]);
1.138     schafran 1201: 	    &Apache::lonnet::delenv('environment.'.$entry);
1.157     bisitz   1202:             $message.=&Apache::lonhtmlcommon::confirm_success(&mt('Reset [_1]','<i>'.$colortypes{$item}.'</i>'))
                   1203:                      .'<br />';
1.21      www      1204: 	}
                   1205:     }
1.158     bisitz   1206:     $message=&Apache::loncommon::confirmwrapper($message);
1.157     bisitz   1207: 
1.84      albertel 1208:     my $now = time;
                   1209:     &Apache::lonnet::put('environment',{'color.timestamp' => $now});
1.116     raeburn  1210:     &Apache::lonnet::appenv({'environment.color.timestamp' => $now});
1.84      albertel 1211: 
1.152     www      1212:     &print_main_menu($r, $message);
1.12      www      1213: }
                   1214: 
1.4       matthew  1215: ######################################################
                   1216: #            password handler subroutines            #
                   1217: ######################################################
1.3       matthew  1218: sub passwordchanger {
1.94      raeburn  1219:     my ($r,$errormessage,$caller,$mailtoken) = @_;
1.4       matthew  1220:     # This function is a bit of a mess....
1.3       matthew  1221:     # Passwords are encrypted using londes.js (DES encryption)
1.4       matthew  1222:     $errormessage = ($errormessage || '');
1.94      raeburn  1223:     my ($user,$domain,$currentpass,$defdom);
1.152     www      1224:     &Apache::lonhtmlcommon::add_breadcrumb(
1.126     droeschl 1225: 		{ href => '/adm/preferences?action=changepass',
                   1226:                   text => 'Change Password'});
1.144     raeburn  1227:     unless ($caller eq 'reset_by_email') {
1.147     schafran 1228:         $r->print(Apache::loncommon::start_page('Personal Data'));
1.144     raeburn  1229:         $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Password'));
                   1230:     }
1.94      raeburn  1231:     if ((!defined($caller)) || ($caller eq 'preferences')) {
                   1232:         $user = $env{'user.name'};
                   1233:         $domain = $env{'user.domain'};
                   1234:         if (!defined($caller)) {
                   1235:             $caller = 'preferences';
                   1236:         }
                   1237:     } elsif ($caller eq 'reset_by_email') {
                   1238:             $defdom = $r->dir_config('lonDefDomain');
                   1239:             my %data = &Apache::lonnet::tmpget($mailtoken);
                   1240:             if (keys(%data) == 0) {
1.155     bisitz   1241:                 $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 [_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.'
                   1242:                              ,'<a href="/adm/resetpw">','</a>')
                   1243:                 );
1.94      raeburn  1244:                 return;
                   1245:             }
                   1246:             if (defined($data{time})) {
                   1247:                 if (time - $data{'time'} < 7200) {
                   1248:                     $user = $data{'username'};
                   1249:                     $domain = $data{'domain'};
                   1250:                     $currentpass = $data{'temppasswd'};
                   1251:                 } else {
                   1252:                     $r->print(&mt('Sorry, the token generated when you requested a password reset has expired.').'<br />');
                   1253:                     return;
                   1254:                 }
                   1255:             } else {
                   1256:                 $r->print(&mt('Sorry, the URL generated when you requested reset of your password contained incomplete information.').'<br />');
                   1257:                 return;
                   1258:             }
                   1259:    } else {
                   1260:         $r->print(&mt('Page requested in unexpected context').'<br />');
                   1261:         return;
                   1262:     }
1.3       matthew  1263:     my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
                   1264:     # Check for authentication types that allow changing of the password.
                   1265:     return if ($currentauth !~ /^(unix|internal):/);
                   1266:     #
                   1267:     # Generate keys
                   1268:     my ($lkey_cpass ,$ukey_cpass ) = &des_keys();
                   1269:     my ($lkey_npass1,$ukey_npass1) = &des_keys();
                   1270:     my ($lkey_npass2,$ukey_npass2) = &des_keys();
1.4       matthew  1271:     # Store the keys in the log files
1.3       matthew  1272:     my $lonhost = $r->dir_config('lonHostID');
                   1273:     my $logtoken=Apache::lonnet::reply('tmpput:'
                   1274: 				       .$ukey_cpass  . $lkey_cpass .'&'
                   1275: 				       .$ukey_npass1 . $lkey_npass1.'&'
                   1276: 				       .$ukey_npass2 . $lkey_npass2,
                   1277: 				       $lonhost);
1.4       matthew  1278:     # Hexify the keys for output as javascript variables
1.94      raeburn  1279:     my %hexkey;
                   1280:     $hexkey{'ukey_cpass'}  = hex($ukey_cpass);
                   1281:     $hexkey{'lkey_cpass'}  = hex($lkey_cpass);
                   1282:     $hexkey{'ukey_npass1'} = hex($ukey_npass1);
                   1283:     $hexkey{'lkey_npass1'} = hex($lkey_npass1);
                   1284:     $hexkey{'ukey_npass2'} = hex($ukey_npass2);
                   1285:     $hexkey{'lkey_npass2'} = hex($lkey_npass2);
1.3       matthew  1286:     # Output javascript to deal with passwords
1.4       matthew  1287:     # Output DES javascript
1.3       matthew  1288:     {
                   1289: 	my $include = $r->dir_config('lonIncludes');
                   1290: 	my $jsh=Apache::File->new($include."/londes.js");
                   1291: 	$r->print(<$jsh>);
                   1292:     }
1.94      raeburn  1293:     $r->print(&jscript_send($caller));
1.3       matthew  1294:     $r->print(<<ENDFORM);
1.94      raeburn  1295: $errormessage
                   1296: 
                   1297: <p>
                   1298: <!-- We separate the forms into 'server' and 'client' in order to
                   1299:      ensure that unencrypted passwords will not be sent out by a
                   1300:      crappy browser -->
                   1301: ENDFORM
                   1302:     $r->print(&server_form($logtoken,$caller,$mailtoken));
                   1303:     $r->print(&client_form($caller,\%hexkey,$currentpass,$defdom));
                   1304: 
                   1305:     #
                   1306:     return;
                   1307: }
                   1308: 
                   1309: sub jscript_send {
                   1310:     my ($caller) = @_;
                   1311:     my $output = qq|
1.148     bisitz   1312: <script type="text/javascript" language="JavaScript">
1.3       matthew  1313: 
                   1314:     function send() {
                   1315:         uextkey=this.document.client.elements.ukey_cpass.value;
                   1316:         lextkey=this.document.client.elements.lkey_cpass.value;
                   1317:         initkeys();
                   1318: 
1.52      raeburn  1319:         this.document.pserver.elements.currentpass.value
1.3       matthew  1320:             =crypted(this.document.client.elements.currentpass.value);
                   1321: 
                   1322:         uextkey=this.document.client.elements.ukey_npass1.value;
                   1323:         lextkey=this.document.client.elements.lkey_npass1.value;
                   1324:         initkeys();
1.52      raeburn  1325:         this.document.pserver.elements.newpass_1.value
1.3       matthew  1326:             =crypted(this.document.client.elements.newpass_1.value);
                   1327: 
                   1328:         uextkey=this.document.client.elements.ukey_npass2.value;
                   1329:         lextkey=this.document.client.elements.lkey_npass2.value;
                   1330:         initkeys();
1.52      raeburn  1331:         this.document.pserver.elements.newpass_2.value
1.3       matthew  1332:             =crypted(this.document.client.elements.newpass_2.value);
1.94      raeburn  1333: |;
                   1334:     if ($caller eq 'reset_by_email') {
                   1335:         $output .= qq|
                   1336:         this.document.pserver.elements.uname.value =
                   1337:                    this.document.client.elements.uname.value;
                   1338:         this.document.pserver.elements.udom.value =
                   1339:                    this.document.client.elements.udom.options[this.document.client.elements.udom.selectedIndex].value;
                   1340: |;
                   1341:     }
                   1342:     $ output .= qq|
1.52      raeburn  1343:         this.document.pserver.submit();
1.3       matthew  1344:     }
                   1345: </script>
1.94      raeburn  1346: |;
                   1347: }
1.3       matthew  1348: 
1.94      raeburn  1349: sub client_form {
                   1350:     my ($caller,$hexkey,$currentpass,$defdom) = @_;
1.99      www      1351:     my %lt=&Apache::lonlocal::texthash(
1.115     raeburn  1352:                 'email' => 'E-mail Address',
1.99      www      1353:                 'username' => 'Username',
                   1354:                 'domain' => 'Domain',
                   1355:                 'currentpass' => 'Current Password',
                   1356:                 'newpass' => 'New Password',
                   1357:                 'confirmpass' => 'Confirm Password',
1.136     schafran 1358:                 'changepass' => 'Save');
1.99      www      1359: 
1.94      raeburn  1360:     my $output = qq|
1.3       matthew  1361: <form name="client" >
                   1362: <table>
1.94      raeburn  1363: |;
                   1364:     if ($caller eq 'reset_by_email') {
                   1365:         $output .= qq|
1.99      www      1366: <tr><td class="LC_preferences_labeltext"><label for="email">$lt{'email'}</label>:</td>
1.97      raeburn  1367:     <td><input type="text" name="email" size="30" /> </td></tr>
1.99      www      1368: <tr><td class="LC_preferences_labeltext"><label for="uname">$lt{'username'}</label>:</td>
1.94      raeburn  1369:     <td>
1.97      raeburn  1370:      <input type="text" name="uname" size="15" />
1.94      raeburn  1371:      <input type="hidden" name="currentpass" value="$currentpass" />
                   1372:     </td></tr>
1.115     raeburn  1373: <tr><td class="LC_preferences_labeltext"><label for="udom">$lt{'domain'}</label>:</td>
1.94      raeburn  1374:     <td>
                   1375: |;
                   1376:         $output .= &Apache::loncommon::select_dom_form($defdom,'udom').'
                   1377:    </td>
                   1378: </tr>
                   1379: ';
                   1380:     } else {
                   1381:         $output .= qq|
1.99      www      1382: <tr><td class="LC_preferences_labeltext"><label for="currentpass">$lt{'currentpass'}</label></td>
1.4       matthew  1383:     <td><input type="password" name="currentpass" size="10"/> </td></tr>
1.94      raeburn  1384: |;
                   1385:     }
                   1386:     $output .= <<"ENDFORM";
1.99      www      1387: <tr><td class="LC_preferences_labeltext"><label for="newpass_1">$lt{'newpass'}</label></td>
1.4       matthew  1388:     <td><input type="password" name="newpass_1" size="10"  /> </td></tr>
1.99      www      1389: <tr><td class="LC_preferences_labeltext"><label for="newpass_2">$lt{'confirmpass'}</label></td>
1.4       matthew  1390:     <td><input type="password" name="newpass_2" size="10"  /> </td></tr>
1.3       matthew  1391: <tr><td colspan="2" align="center">
1.149     bisitz   1392:     <input type="button" value="$lt{'changepass'}" onClick="send();" />
1.3       matthew  1393: </table>
1.94      raeburn  1394: <input type="hidden" name="ukey_cpass"  value="$hexkey->{'ukey_cpass'}" />
                   1395: <input type="hidden" name="lkey_cpass"  value="$hexkey->{'lkey_cpass'}" />
                   1396: <input type="hidden" name="ukey_npass1" value="$hexkey->{'ukey_npass1'}" />
                   1397: <input type="hidden" name="lkey_npass1" value="$hexkey->{'lkey_npass1'}" />
                   1398: <input type="hidden" name="ukey_npass2" value="$hexkey->{'ukey_npass2'}" />
                   1399: <input type="hidden" name="lkey_npass2" value="$hexkey->{'lkey_npass2'}" />
1.3       matthew  1400: </form>
                   1401: </p>
                   1402: ENDFORM
1.94      raeburn  1403:     return $output;
                   1404: }
                   1405: 
                   1406: sub server_form {
                   1407:     my ($logtoken,$caller,$mailtoken) = @_;
                   1408:     my $action = '/adm/preferences';
                   1409:     if ($caller eq 'reset_by_email') {
                   1410:         $action = '/adm/resetpw';
                   1411:     }
                   1412:     my $output = qq|
                   1413: <form name="pserver" action="$action" method="post">
                   1414: <input type="hidden" name="logtoken"    value="$logtoken" />
                   1415: <input type="hidden" name="currentpass" value="" />
                   1416: <input type="hidden" name="newpass_1"   value="" />
                   1417: <input type="hidden" name="newpass_2"   value="" />
                   1418:     |;
                   1419:     if ($caller eq 'reset_by_email') {
                   1420:         $output .=  qq|
                   1421: <input type="hidden" name="token"   value="$mailtoken" />
                   1422: <input type="hidden" name="uname"   value="" />
                   1423: <input type="hidden" name="udom"   value="" />
                   1424: 
                   1425: |;
                   1426:     }
                   1427:     $output .= qq|
                   1428: <input type="hidden" name="action" value="verify_and_change_pass" />
                   1429: </form>
                   1430: |;
                   1431:     return $output;
1.3       matthew  1432: }
                   1433: 
                   1434: sub verify_and_change_password {
1.94      raeburn  1435:     my ($r,$caller,$mailtoken) = @_;
                   1436:     my ($user,$domain,$homeserver);
                   1437:     if ($caller eq 'reset_by_email') {
                   1438:         $user       = $env{'form.uname'};
                   1439:         $domain     = $env{'form.udom'};
                   1440:         if ($user ne '' && $domain ne '') {
                   1441:             $homeserver = &Apache::lonnet::homeserver($user,$domain);
                   1442:             if ($homeserver eq 'no_host') {
1.99      www      1443:         &passwordchanger($r,"<p>\n<span class='LC_error'>".
                   1444:                          &mt("Invalid username and/or domain")."</span>\n</p>",
1.94      raeburn  1445:                          $caller,$mailtoken);
                   1446:                 return 1;
                   1447:             }
                   1448:         } else {
1.99      www      1449:             &passwordchanger($r,"<p>\n<span class='LC_error'>".
                   1450:                              &mt("Username and domain were blank")."</span>\n</p>",
1.94      raeburn  1451:                              $caller,$mailtoken);
                   1452:             return 1;
                   1453:         }
                   1454:     } else {
                   1455:         $user       = $env{'user.name'};
                   1456:         $domain     = $env{'user.domain'};
                   1457:         $homeserver = $env{'user.home'};
                   1458:     }
1.3       matthew  1459:     my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
1.4       matthew  1460:     # Check for authentication types that allow changing of the password.
1.94      raeburn  1461:     if ($currentauth !~ /^(unix|internal):/) {
                   1462:         if ($caller eq 'reset_by_email') {
1.99      www      1463:             &passwordchanger($r,"<p>\n<span class='LC_error'>".
                   1464:                              &mt("Authentication type for this user can not be changed by this mechanism").
                   1465:                              "</span>\n</p>",
1.94      raeburn  1466:                               $caller,$mailtoken);
                   1467:             return 1;
                   1468:         } else {
                   1469:             return;
                   1470:         }
                   1471:     }
1.3       matthew  1472:     #
1.59      albertel 1473:     my $currentpass = $env{'form.currentpass'}; 
                   1474:     my $newpass1    = $env{'form.newpass_1'}; 
                   1475:     my $newpass2    = $env{'form.newpass_2'};
                   1476:     my $logtoken    = $env{'form.logtoken'};
1.3       matthew  1477:     # Check for empty data 
1.4       matthew  1478:     unless (defined($currentpass) && 
                   1479: 	    defined($newpass1)    && 
                   1480: 	    defined($newpass2)    ){
1.99      www      1481: 	&passwordchanger($r,"<p>\n<span class='LC_error'>".
                   1482: 			 &mt("One or more password fields were blank").
                   1483:                          "</span>\n</p>",$caller,$mailtoken);
1.3       matthew  1484: 	return;
                   1485:     }
1.16      albertel 1486:     # Get the keys
                   1487:     my $lonhost = $r->dir_config('lonHostID');
1.3       matthew  1488:     my $tmpinfo = Apache::lonnet::reply('tmpget:'.$logtoken,$lonhost);
                   1489:     if (($tmpinfo=~/^error/) || ($tmpinfo eq 'con_lost')) {
1.4       matthew  1490:         # I do not a have a better idea about how to handle this
1.94      raeburn  1491:         my $tryagain_text = &mt('Please log out and try again.');
                   1492:         if ($caller eq 'reset_by_email') {
                   1493:             $tryagain_text = &mt('Please try again later.');
                   1494:         }
1.101     albertel 1495:         my $unable=&mt("Unable to retrieve saved token for password decryption");
1.3       matthew  1496: 	$r->print(<<ENDERROR);
                   1497: <p>
1.99      www      1498: <span class="LC_error">$unable.  $tryagain_text</span>
1.3       matthew  1499: </p>
                   1500: ENDERROR
1.4       matthew  1501:         # Probably should log an error here
1.75      albertel 1502:         return 1;
1.3       matthew  1503:     }
                   1504:     my ($ckey,$n1key,$n2key)=split(/&/,$tmpinfo);
1.4       matthew  1505:     # 
1.17      matthew  1506:     $currentpass = &des_decrypt($ckey ,$currentpass);
                   1507:     $newpass1    = &des_decrypt($n1key,$newpass1);
                   1508:     $newpass2    = &des_decrypt($n2key,$newpass2);
1.94      raeburn  1509:     #
                   1510:     if ($caller eq 'reset_by_email') {
                   1511:         my %data = &Apache::lonnet::tmpget($mailtoken);
1.117     raeburn  1512:         if (keys(%data) == 0) {
                   1513:             &passwordchanger($r,
                   1514:                          '<span class="LC_error">'.
                   1515:                          &mt('Could not verify current authentication.').'  '.
                   1516:                          &mt('Please try again.').'</span>',$caller,$mailtoken);
                   1517:             return 1;
                   1518:         }
1.94      raeburn  1519:         if ($currentpass ne $data{'temppasswd'}) {
                   1520:             &passwordchanger($r,
1.99      www      1521:                          '<span class="LC_error">'.
1.110     bisitz   1522:                          &mt('Could not verify current authentication.').'  '.
                   1523:                          &mt('Please try again.').'</span>',$caller,$mailtoken);
1.94      raeburn  1524:             return 1;
                   1525:         }
                   1526:     } 
1.3       matthew  1527:     if ($newpass1 ne $newpass2) {
1.4       matthew  1528: 	&passwordchanger($r,
1.99      www      1529: 			 '<span class="LC_error">'.
1.110     bisitz   1530: 			 &mt('The new passwords you entered do not match.').'  '.
                   1531: 			 &mt('Please try again.').'</span>',$caller,$mailtoken);
1.75      albertel 1532: 	return 1;
1.4       matthew  1533:     }
                   1534:     if (length($newpass1) < 7) {
                   1535: 	&passwordchanger($r,
1.99      www      1536: 			 '<span class="LC_error">'.
1.110     bisitz   1537: 			 &mt('Passwords must be a minimum of 7 characters long.').'  '.
                   1538: 			 &mt('Please try again.').'</span>',$caller,$mailtoken);
1.75      albertel 1539: 	return 1;
1.3       matthew  1540:     }
1.4       matthew  1541:     #
                   1542:     # Check for bad characters
                   1543:     my $badpassword = 0;
                   1544:     foreach (split(//,$newpass1)) {
                   1545: 	$badpassword = 1 if ((ord($_)<32)||(ord($_)>126));
                   1546:     }
                   1547:     if ($badpassword) {
                   1548: 	# I can't figure out how to enter bad characters on my browser.
1.99      www      1549: 	my $errormessage ='<span class="LC_error">'.
1.110     bisitz   1550:            &mt('The password you entered contained illegal characters.').'<br />'.
1.99      www      1551:            &mt('Valid characters are').(<<"ENDERROR");
                   1552: : space and <br />
1.4       matthew  1553: <pre>
                   1554: !&quot;\#$%&amp;\'()*+,-./0123456789:;&lt;=&gt;?\@
                   1555: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_\`abcdefghijklmnopqrstuvwxyz{|}~
1.99      www      1556: </pre></span>
1.4       matthew  1557: ENDERROR
1.94      raeburn  1558:         &passwordchanger($r,$errormessage,$caller,$mailtoken);
                   1559:         return 1;
1.4       matthew  1560:     }
                   1561:     # 
                   1562:     # Change the password (finally)
                   1563:     my $result = &Apache::lonnet::changepass
1.94      raeburn  1564: 	($user,$domain,$currentpass,$newpass1,$homeserver,$caller);
1.4       matthew  1565:     # Inform the user the password has (not?) been changed
1.126     droeschl 1566:     my $message;
1.4       matthew  1567:     if ($result =~ /^ok$/) {
1.158     bisitz   1568:         $message = &Apache::lonhtmlcommon::confirm_success(&mt('The password for user [_1] was successfully changed.','<i>'.$user.'<i>'));
1.144     raeburn  1569:         if ($caller eq 'reset_by_email') {
                   1570:             $r->print($message.'<br />');
                   1571:         } else {
                   1572:             &print_main_menu($r, $message);
                   1573:         }
1.4       matthew  1574:     } else {
                   1575: 	# error error: run in circles, scream and shout
1.154     www      1576:         $message = &Apache::lonhtmlcommon::confirm_success(
1.158     bisitz   1577:           &mt("The password for user [_1] was not changed.",'<i>'.$user.'</i>').' '.&mt('Please make sure your old password was entered correctly.'),1);
1.144     raeburn  1578:         unless ($caller eq 'reset_by_email') {
1.158     bisitz   1579:             $message=&Apache::loncommon::confirmwrapper($message);
1.144     raeburn  1580:             &print_main_menu($r, $message);
                   1581:         }
1.75      albertel 1582:         return 1;
1.4       matthew  1583:     }
                   1584:     return;
1.3       matthew  1585: }
                   1586: 
1.42      raeburn  1587: ################################################################
                   1588: #            discussion display subroutines 
                   1589: ################################################################
                   1590: sub discussionchanger {
                   1591:     my $r = shift;
1.126     droeschl 1592:     Apache::lonhtmlcommon::add_breadcrumb(
                   1593: 	    {	href => '/adm/preferences?action=changediscussions',
                   1594:                 text => 'Change Discussion Preferences'});
1.147     schafran 1595:     $r->print(Apache::loncommon::start_page('Message Management'));
1.126     droeschl 1596:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Discussion Preferences'));
1.59      albertel 1597:     my $user       = $env{'user.name'};
                   1598:     my $domain     = $env{'user.domain'};
1.42      raeburn  1599:     my %userenv = &Apache::lonnet::get
1.43      raeburn  1600:         ('environment',['discdisplay','discmarkread']);
                   1601:     my $discdisp = 'allposts';
                   1602:     my $discmark = 'onmark';
                   1603: 
                   1604:     if (defined($userenv{'discdisplay'})) {
                   1605:         unless ($userenv{'discdisplay'} eq '') { 
                   1606:             $discdisp = $userenv{'discdisplay'};
                   1607:         }
                   1608:     }
                   1609:     if (defined($userenv{'discmarkread'})) {
                   1610:         unless ($userenv{'discdisplay'} eq '') { 
                   1611:             $discmark = $userenv{'discmarkread'};
                   1612:         }
                   1613:     }
                   1614: 
                   1615:     my $newdisp = 'unread';
                   1616:     my $newmark = 'ondisp';
                   1617: 
                   1618:     my $function = &Apache::loncommon::get_users_function();
                   1619:     my $color = &Apache::loncommon::designparm($function.'.tabbg',
1.59      albertel 1620:                                                     $env{'user.domain'});
1.43      raeburn  1621:     my %lt = &Apache::lonlocal::texthash(
                   1622:         'pref' => 'Display Preference',
                   1623:         'curr' => 'Current setting ',
                   1624:         'actn' => 'Action',
1.135     schafran 1625:         'sdpf' => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.',
1.43      raeburn  1626:         'prca' => 'Preferences can be set that determine',
1.135     schafran 1627:         'whpo' => 'Which posts are displayed when you display a discussion board or resource, and',
1.43      raeburn  1628:         'unwh' => 'Under what circumstances posts are identfied as "New"',
                   1629:         'allposts' => 'All posts',
                   1630:         'unread' => 'New posts only',
                   1631:         'ondisp' => 'Once displayed',
                   1632:         'onmark' => 'Once marked as read',
                   1633:         'disa' => 'Posts displayed?',
                   1634:         'npmr' => 'New posts cease to be identified as "New"?',
                   1635:         'thde'  => 'The preferences you set here can be overridden within each individual discussion.',
                   1636:         'chgt' => 'Change to '
                   1637:     );
                   1638:     my $dispchange = $lt{'unread'};
                   1639:     my $markchange = $lt{'ondisp'};
                   1640:     my $currdisp = $lt{'allposts'};
                   1641:     my $currmark = $lt{'onmark'};
                   1642: 
                   1643:     if ($discdisp eq 'unread') {
                   1644:         $dispchange = $lt{'allposts'};
                   1645:         $currdisp = $lt{'unread'};
                   1646:         $newdisp = 'allposts';
                   1647:     }
                   1648: 
                   1649:     if ($discmark eq 'ondisp') {
                   1650:         $markchange = $lt{'onmark'};
                   1651:         $currmark = $lt{'ondisp'};
                   1652:         $newmark = 'onmark';
1.42      raeburn  1653:     }
1.43      raeburn  1654:     
                   1655:     $r->print(<<"END");
1.88      albertel 1656: <form name="prefs" action="/adm/preferences" method="post">
1.42      raeburn  1657: <input type="hidden" name="action" value="verify_and_change_discussion" />
                   1658: <br />
1.87      albertel 1659: $lt{'sdpf'}<br /> $lt{'prca'}  <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li></ol> 
1.82      albertel 1660: END
1.158     bisitz   1661: 
                   1662:     $r->print('<p class="LC_info">'.$lt{'thde'}.'</p>');
                   1663: 
1.82      albertel 1664:     $r->print(&Apache::loncommon::start_data_table());
                   1665:     $r->print(<<"END");
                   1666:        <tr>
                   1667:         <th>$lt{'pref'}</th>
                   1668:         <th>$lt{'curr'}</th>
                   1669:         <th>$lt{'actn'}?</th>
1.43      raeburn  1670:        </tr>
1.82      albertel 1671: END
                   1672:     $r->print(&Apache::loncommon::start_data_table_row());
                   1673:     $r->print(<<"END");
1.43      raeburn  1674:        <td>$lt{'disa'}</td>
                   1675:        <td>$lt{$discdisp}</td>
1.82      albertel 1676:        <td><label><input type="checkbox" name="discdisp" /><input type="hidden" name="newdisp" value="$newdisp" />&nbsp;$lt{'chgt'} "$dispchange"</label></td>
                   1677: END
                   1678:     $r->print(&Apache::loncommon::end_data_table_row().
                   1679: 	      &Apache::loncommon::start_data_table_row());
                   1680:     $r->print(<<"END");
1.43      raeburn  1681:        <td>$lt{'npmr'}</td>
                   1682:        <td>$lt{$discmark}</td>
1.82      albertel 1683:        <td><label><input type="checkbox" name="discmark" /><input type="hidden" name="newmark" value="$newmark" />&nbsp;$lt{'chgt'} "$markchange"</label></td>
1.43      raeburn  1684:       </tr>
1.82      albertel 1685: END
                   1686:     $r->print(&Apache::loncommon::end_data_table_row().
                   1687: 	      &Apache::loncommon::end_data_table());
1.142     zhu      1688: 
1.158     bisitz   1689:     $r->print('<br />'
                   1690:              .'<input type="submit" name="sub" value="'.&mt('Save').'" />'
                   1691:              .'</form>'
                   1692:     );
1.42      raeburn  1693: }
                   1694:                                                                                                                 
                   1695: sub verify_and_change_discussion {
                   1696:     my $r = shift;
1.59      albertel 1697:     my $user     = $env{'user.name'};
                   1698:     my $domain   = $env{'user.domain'};
1.42      raeburn  1699:     my $message='';
1.59      albertel 1700:     if (defined($env{'form.discdisp'}) ) {
                   1701:         my $newdisp  = $env{'form.newdisp'};
1.43      raeburn  1702:         if ($newdisp eq 'unread') {
1.110     bisitz   1703:             $message .=&mt('In discussions: only new posts will be displayed.').'<br />';
1.43      raeburn  1704:             &Apache::lonnet::put('environment',{'discdisplay' => $newdisp});
1.116     raeburn  1705:             &Apache::lonnet::appenv({'environment.discdisplay' => $newdisp});
1.43      raeburn  1706:         } else {
1.110     bisitz   1707:             $message .= &mt('In discussions: all posts will be displayed.').'<br />';
1.43      raeburn  1708:             &Apache::lonnet::del('environment',['discdisplay']);
1.139     raeburn  1709:             &Apache::lonnet::delenv('environment.discdisplay');
1.43      raeburn  1710:         }
                   1711:     }
1.59      albertel 1712:     if (defined($env{'form.discmark'}) ) {
                   1713:         my $newmark = $env{'form.newmark'};
1.43      raeburn  1714:         if ($newmark eq 'ondisp') {
1.152     www      1715:             $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: new posts will be cease to be identified as "NEW" after display.')).'<br />';
1.43      raeburn  1716:             &Apache::lonnet::put('environment',{'discmarkread' => $newmark});
1.116     raeburn  1717:             &Apache::lonnet::appenv({'environment.discmarkread' => $newmark});
1.43      raeburn  1718:         } else {
1.152     www      1719:             $message.=&Apache::lonhtmlcommon::confirm_success(&mt('In discussions: posts will be identified as "NEW" until marked as read by the reader.')).'<br />';
1.43      raeburn  1720:             &Apache::lonnet::del('environment',['discmarkread']);
1.139     raeburn  1721:             &Apache::lonnet::delenv('environment.discmarkread');
1.43      raeburn  1722:         }
1.42      raeburn  1723:     }
1.158     bisitz   1724:     $message=&Apache::loncommon::confirmwrapper($message);
1.152     www      1725:     &print_main_menu($r, $message);
1.42      raeburn  1726: }
                   1727: 
1.63      raeburn  1728: ################################################################
                   1729: # Subroutines for page display on course access (Course Coordinators)
                   1730: ################################################################
                   1731: sub coursedisplaychanger {
                   1732:     my $r = shift;
1.152     www      1733:     &Apache::lonhtmlcommon::add_breadcrumb(
1.126     droeschl 1734: 	    {	href => '/adm/preferences?action=changecourseinit',
                   1735:                 text => 'Change Course Init. Pref.'});
                   1736:     $r->print(Apache::loncommon::start_page('Change Course Initialization Preference'));
                   1737:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Course Init. Pref.'));
1.63      raeburn  1738:     my $user       = $env{'user.name'};
                   1739:     my $domain     = $env{'user.domain'};
1.66      albertel 1740:     my %userenv = &Apache::lonnet::get('environment',['course_init_display']);
1.71      raeburn  1741:     my $currvalue = 'whatsnew';
1.73      albertel 1742:     my $firstselect = '';
                   1743:     my $whatsnewselect = 'checked="checked"';
1.71      raeburn  1744:     if (exists($userenv{'course_init_display'})) {
                   1745:         if ($userenv{'course_init_display'} eq 'firstres') {
                   1746:             $currvalue = 'firstres';
1.73      albertel 1747:             $firstselect = 'checked="checked"';
                   1748: 	    $whatsnewselect = '';
1.71      raeburn  1749:         }
1.63      raeburn  1750:     }
1.134     bisitz   1751:     my %pagenames = &Apache::lonlocal::texthash(
1.71      raeburn  1752:                        firstres => 'First resource',
1.143     hauer    1753:                        whatsnew => "What's New Page",
1.71      raeburn  1754:                     );
1.134     bisitz   1755:     my $whatsnew_off=&mt('Display the [_1]first resource[_2] in the course.','<b>','</b>');
1.143     hauer    1756:     my $whatsnew_on=&mt("Display the [_1]What's New Page[_2] - a summary of items in the course which require attention.",'<b>','</b>');
1.63      raeburn  1757: 
1.134     bisitz   1758:     $r->print('<br /><b>'
                   1759:              .&mt('Set the default page to be displayed when you select a course role')
                   1760:              .'</b>&nbsp;'
                   1761:              .&mt('(Currently: [_1])',$pagenames{$currvalue})
                   1762:              .'<br />'
1.143     hauer    1763:              .&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>')
1.134     bisitz   1764:              .'<br /><br />'
                   1765:     );
1.63      raeburn  1766:     $r->print(<<ENDLSCREEN);
1.88      albertel 1767: <form name="prefs" action="/adm/preferences" method="post">
1.63      raeburn  1768: <input type="hidden" name="action" value="verify_and_change_coursepage" />
1.72      albertel 1769: <br />
1.65      albertel 1770: <label><input type="radio" name="newdisp" value="firstres" $firstselect /> $whatsnew_off</label><br />
1.70      raeburn  1771: <label><input type="radio" name="newdisp" value="whatsnew" $whatsnewselect /> $whatsnew_on</label><input type="hidden" name="refpage" value="$env{'form.refpage'}" />
1.63      raeburn  1772: ENDLSCREEN
1.140     schafran 1773:     $r->print('<br /><br /><input type="submit" value="'.&mt('Save').'" />
1.63      raeburn  1774: </form>');
                   1775: }
                   1776: 
                   1777: sub verify_and_change_coursepage {
                   1778:     my $r = shift;
                   1779:     my $message='';
                   1780:     my %lt = &Apache::lonlocal::texthash(
1.70      raeburn  1781:         'defs' => 'Default now set',
1.71      raeburn  1782:         'when' => 'when you select a course role from the roles screen',
1.63      raeburn  1783:         'ywbt' => 'you will be taken to the start of the course.',
                   1784:         'apwb' => 'a page will be displayed that lists items in the course that may require action from you.',
                   1785:         'gtts' => 'Go to the start of the course',
1.146     hauer    1786:         'dasp' => "Display the What's New Page", 
1.63      raeburn  1787:     );
                   1788:     my $newdisp  = $env{'form.newdisp'};
1.70      raeburn  1789:     $message = '<b>'.$lt{'defs'}.'</b>: '.$lt{'when'}.', ';
1.63      raeburn  1790:     if ($newdisp eq 'firstres') {
1.87      albertel 1791:         $message .= $lt{'ywbt'}.'<br />';
1.63      raeburn  1792:         &Apache::lonnet::put('environment',{'course_init_display' => $newdisp});
1.116     raeburn  1793:         &Apache::lonnet::appenv({'environment.course_init_display' => $newdisp});
1.63      raeburn  1794:     } else {
1.87      albertel 1795:         $message .= $lt{'apwb'}.'<br />';
1.63      raeburn  1796:         &Apache::lonnet::del('environment',['course_init_display']);
1.139     raeburn  1797:         &Apache::lonnet::delenv('environment.course_init_display');
1.63      raeburn  1798:     }
1.70      raeburn  1799:     my $refpage = $env{'form.refpage'};
1.63      raeburn  1800:     if (($env{'request.course.fn'}) && ($env{'request.course.id'})) {
                   1801:         if ($newdisp eq 'firstres') {
                   1802:             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
                   1803:             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; 
                   1804:             my ($furl,$ferr)=
                   1805:                 &Apache::lonuserstate::readmap($cdom.'/'.$cnum);
                   1806:             $message .= '<br /><font size="+1"><a href="'.$furl.'">'.$lt{'gtts'}.' <i>'.&mt('now').'</i></a></font>';
                   1807:         } else {
1.70      raeburn  1808:             $message .= '<br /><font size="+1"><a href="/adm/whatsnew?refpage='.
                   1809:                         $refpage.'">'.$lt{'dasp'}.'</a></font>';
1.63      raeburn  1810:         }
                   1811:     }
1.152     www      1812:     &print_main_menu($r, &Apache::lonhtmlcommon::confirm_success($message));
1.63      raeburn  1813: }
                   1814: 
1.126     droeschl 1815: sub print_main_menu {
                   1816:     my ($r, $message) = @_;
                   1817:     # Determine current authentication method
                   1818:     my $user = $env{'user.name'};
                   1819:     my $domain = $env{'user.domain'};
                   1820:     my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
                   1821: 
                   1822:     # build the data structure for menu generation
                   1823: my $aboutmeurl='/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';
                   1824: my $role = ($env{'user.adv'} ? 'Roles' : 'Course');
1.131     raeburn  1825: my %permissions;
                   1826: if (&Apache::lonnet::usertools_access($user,$domain,'aboutme')) {
                   1827:     $permissions{'aboutme'} = 'F';
                   1828: }
1.126     droeschl 1829: my @menu=
                   1830:     ({	categorytitle=>'Personal Data',
                   1831: 	items =>[
1.141     weissno  1832: 	    {	linktext => 'Personal Information Page',
1.126     droeschl 1833: 		url => $aboutmeurl,
1.131     raeburn  1834: 		permission => $permissions{'aboutme'},
1.126     droeschl 1835: 		#help => 'Prefs_About_Me',
                   1836: 		icon => 'system-users.png',
                   1837: 		linktitle => 'Edit information about yourself that should be displayed on your public profile.'
                   1838: 	    },
                   1839: 	    {	linktext => 'Screen Name',
                   1840: 		url => '/adm/preferences?action=changescreenname',
                   1841: 		permission => 'F',
                   1842: 		#help => 'Prefs_Screen_Name_Nickname',
                   1843: 		icon => 'preferences-desktop-font.png',
                   1844: 		linktitle => 'Change the name that is displayed in your posts.'
                   1845: 	    },
                   1846: 		]
                   1847:     },
                   1848:     {	categorytitle=>'Page Display Settings',
                   1849: 	items =>[
                   1850: 	    {	linktext => 'Color Scheme',
                   1851: 		url => '/adm/preferences?action=changecolors',
                   1852: 		permission => 'F',
                   1853: 		#help => 'Change_Colors',
                   1854: 		icon => 'preferences-desktop-theme.png',
                   1855: 		linktitle => 'Change LON-CAPA default colors.'
                   1856: 	    },
                   1857: 	    {	linktext => 'Menu Display',
                   1858: 		url => '/adm/preferences?action=changeicons',
                   1859: 		permission => 'F',
                   1860: 		#help => '',
                   1861: 		icon => 'preferences-system-windows.png',
                   1862: 		linktitle => 'Change whether the menus are displayed with buttons, icons or icons and text.'
                   1863: 	    }
                   1864: 
                   1865: 		]
                   1866:     },
                   1867:     {	categorytitle=>'Content Display Settings',
                   1868: 	items =>[
                   1869: 	    {	linktext => 'Language',
                   1870: 		url => '/adm/preferences?action=changelanguages',
                   1871: 		permission => 'F',
                   1872: 		#help => 'Prefs_Language',
                   1873: 		icon => 'preferences-desktop-locale.png',
1.127     droeschl 1874: 		linktitle => 'Choose the default language for this user.'
1.126     droeschl 1875: 	    },
1.128     droeschl 1876: 	    {	linktext => 'WYSIWYG Editor',
1.126     droeschl 1877: 		url => '/adm/preferences?action=changewysiwyg',
                   1878: 		permission => 'F',
                   1879: 		#help => '',
                   1880: 		icon => 'edit-select-all.png',
                   1881: 		linktitle => 'Enable or disable the WYSIWYG-Editor.'
                   1882: 	    },
1.128     droeschl 1883: 	    {	linktext => $role.' Page',
1.126     droeschl 1884: 		url => '/adm/preferences?action=changerolespref',
                   1885: 		permission => 'F',
                   1886: 		#help => '',
                   1887: 		icon => 'sctr.png',
                   1888: 		linktitle => 'Configure the roles hotlist.'
                   1889: 	    },
1.127     droeschl 1890: 	    {	linktext => 'Display of Scientific Equations',
1.126     droeschl 1891: 		url => '/adm/preferences?action=changetexenginepref',
                   1892: 		permission => 'F',
                   1893: 		#help => '',
                   1894: 		icon => 'stat.png',
1.127     droeschl 1895: 		linktitle => 'Change how Scientific Equations are displayed.'
1.126     droeschl 1896: 	    },
                   1897: 		]
                   1898:     },
1.128     droeschl 1899:     {	categorytitle=>'Message Management',
                   1900: 	items =>[
1.153     www      1901: 	    {	linktext => 'Messages &amp; Notifications',
1.128     droeschl 1902: 		url => '/adm/preferences?action=changemsgforward',
                   1903: 		permission => 'F',
                   1904: 		#help => 'Prefs_Messages',
                   1905: 		icon => 'mail-reply-all.png',
                   1906: 		linktitle => 'Change messageforwarding or notifications settings.'
                   1907: 	    },
                   1908: 	    {	linktext => 'Discussion Display',
                   1909: 		url => '/adm/preferences?action=changediscussions',
                   1910: 		permission => 'F',
                   1911: 		#help => 'Change_Discussion_Display',
                   1912: 		icon => 'mail-message-new.png',
1.135     schafran 1913: 		linktitle => 'Set display preferences for discussion posts for both discussion boards and individual resources in all your courses.'
1.128     droeschl 1914: 	    },
                   1915: 		]
                   1916:     },
1.126     droeschl 1917:     {	categorytitle=>'Other',
                   1918: 	items =>[
1.153     www      1919: 	    {	linktext => 'Register Response Devices (&quot;Clickers&quot;)',
1.126     droeschl 1920: 		url => '/adm/preferences?action=changeclicker',
                   1921: 		permission => 'F',
                   1922: 		#help => '',
                   1923: 		icon => 'network-workgroup.png',
                   1924: 		linktitle => 'Register your clicker.'
                   1925: 	    },
                   1926: 		]
                   1927:     },
                   1928:     );
                   1929: 
                   1930:     if ($currentauth =~ /^(unix|internal):/) {
                   1931: push(@{ $menu[0]->{items} }, {
                   1932: 	linktext => 'Password',
                   1933: 	url => '/adm/preferences?action=changepass',
                   1934: 	permission => 'F',
                   1935: 	#help => 'Change_Password',
                   1936: 	icon => 'emblem-readonly.png',
                   1937: 	linktitle => 'Change your password.',
                   1938: 	});
                   1939:     }
                   1940:     if ($env{'environment.remote'} eq 'off') {
                   1941: push(@{ $menu[1]->{items} }, {
                   1942: 	linktext => 'Launch Remote Control',
                   1943: 	url => '/adm/remote?url=/adm/preferences?action=launch',
                   1944: 	permission => 'F',
                   1945: 	#help => '',
                   1946: 	icon => 'network-wireless.png',
                   1947: 	linktitle => 'Launch the remote control for LON-CAPA.',
                   1948: 	});
                   1949:     }else{
                   1950: push(@{ $menu[1]->{items} }, {
                   1951: 	linktext => 'Collapse Remote Control',
                   1952: 	url => '/adm/remote?url=/adm/preferences?action=collapse',
                   1953: 	permission => 'F',
                   1954: 	#help => '',
                   1955: 	icon => 'network-wireless.png',
                   1956: 	linktitle => 'Collapse the remote control for LON-CAPA.',
                   1957: 	});
                   1958:     }
                   1959:     my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
                   1960:     if (keys(%author_roles) > 0) {
                   1961: push(@{ $menu[4]->{items} }, {
                   1962: 	linktext => 'Restrict Domain Coordinator Access',
                   1963: 	url => '/adm/preferences?action=changedomcoord',
                   1964: 	permission => 'F',
                   1965: 	#help => '',
                   1966: 	icon => 'system-lock-screen.png',
                   1967: 	linktitle => 'Restrict domain coordinator access.',
                   1968: 	});
                   1969:     }
                   1970: 
                   1971:     if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
                   1972: 	|| &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
                   1973: 				    .$env{'request.course.sec'})) {
                   1974: push(@{ $menu[4]->{items} }, {
1.128     droeschl 1975: 	linktext => 'Course Initialization',
1.126     droeschl 1976: 	url => '/adm/preferences?action=changecourseinit',
                   1977: 	permission => 'F',
                   1978: 	#help => '',
                   1979: 	icon => 'edit-copy.png',
                   1980: 	linktitle => 'Set the default page to be displayed when you select a course role.',
                   1981: 	});
                   1982: 
                   1983:     }
                   1984:     if ($env{'user.name'} =~ /^(albertel|fox|foxr|kortemey|korte|raeburn)$/) {
                   1985: push(@{ $menu[4]->{items} }, {
                   1986: 	linktext => 'Toggle Debug Messages (Current:'.$env{'user.debug'}.')',
                   1987: 	url => '/adm/preferences?action=debugtoggle',
                   1988: 	permission => 'F',
                   1989: 	#help => '',
                   1990: 	icon => 'blog.png',
                   1991: 	linktitle => 'Toggle Debug Messages.',
                   1992: 	});
                   1993:     }   
                   1994: 
1.147     schafran 1995:     $r->print(&Apache::loncommon::start_page('My Space'));
1.126     droeschl 1996:     $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Preferences'));
                   1997:     $r->print($message);
                   1998:     $r->print(Apache::lonhtmlcommon::generate_menu(@menu));
                   1999:     $r->print(Apache::loncommon::end_page());
                   2000: }
1.63      raeburn  2001: 
1.4       matthew  2002: ######################################################
                   2003: #            other handler subroutines               #
                   2004: ######################################################
                   2005: 
1.3       matthew  2006: ################################################################
                   2007: #                          Main handler                        #
                   2008: ################################################################
1.126     droeschl 2009: sub handler {    
                   2010:     my $r = shift;
                   2011:     Apache::loncommon::content_type($r,'text/html');
                   2012:     # Some pages contain DES keys and should not be cached.
                   2013:     Apache::loncommon::no_cache($r);
                   2014:     $r->send_http_header;
                   2015:     return OK if $r->header_only;
                   2016:     #
                   2017:     Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                   2018:                                    ['action','wysiwyg','returnurl','refpage']);
                   2019:     #
                   2020:     Apache::lonhtmlcommon::clear_breadcrumbs();
                   2021:     Apache::lonhtmlcommon::add_breadcrumb
                   2022:         ({href => '/adm/preferences',
1.150     droeschl 2023:           text => 'Set User Preferences',
                   2024:           help =>
                   2025:           'Prefs_About_Me,Prefs_Language,Prefs_Screen_Name_Nickname,Change_Colors,Change_Password,Prefs_Messages,Change_Discussion_Display'});
1.126     droeschl 2026:     if(!exists $env{'form.action'}) {
1.150     droeschl 2027: 	    &print_main_menu($r);
1.126     droeschl 2028:     }elsif($env{'form.action'} eq 'changepass'){
                   2029:         &passwordchanger($r);
                   2030:     }elsif($env{'form.action'} eq 'verify_and_change_pass'){
                   2031:         &verify_and_change_password($r);
                   2032:     }elsif($env{'form.action'} eq 'changescreenname'){
                   2033:         &screennamechanger($r);
                   2034:     }elsif($env{'form.action'} eq 'verify_and_change_screenname'){
                   2035:         &verify_and_change_screenname($r);
                   2036:     }elsif($env{'form.action'} eq 'changemsgforward'){
                   2037:         &msgforwardchanger($r);
                   2038:     }elsif($env{'form.action'} eq 'verify_and_change_msgforward'){
                   2039:         &verify_and_change_msgforward($r);
                   2040:     }elsif($env{'form.action'} eq 'changecolors'){
                   2041:         &colorschanger($r);
                   2042:     }elsif($env{'form.action'} eq 'verify_and_change_colors'){
                   2043:         &verify_and_change_colors($r);
                   2044:     }elsif($env{'form.action'} eq 'changelanguages'){
                   2045:         &languagechanger($r);
                   2046:     }elsif($env{'form.action'} eq 'verify_and_change_languages'){
                   2047:         &verify_and_change_languages($r);
                   2048:     }elsif($env{'form.action'} eq 'changewysiwyg'){
                   2049:         &wysiwygchanger($r);
                   2050:     }elsif($env{'form.action'} eq 'set_wysiwyg'){
                   2051:         &verify_and_change_wysiwyg($r);
                   2052:     }elsif($env{'form.action'} eq 'changediscussions'){
                   2053:         &discussionchanger($r);
                   2054:     }elsif($env{'form.action'} eq 'verify_and_change_discussion'){
                   2055:         &verify_and_change_discussion($r);
                   2056:     }elsif($env{'form.action'} eq 'changerolespref'){
                   2057:         &rolesprefchanger($r);
                   2058:     }elsif($env{'form.action'} eq 'verify_and_change_rolespref'){
                   2059:         &verify_and_change_rolespref($r);
                   2060:     }elsif($env{'form.action'} eq 'changetexenginepref'){
                   2061:         &texenginechanger($r);
                   2062:     }elsif($env{'form.action'} eq 'verify_and_change_texengine'){
                   2063:         &verify_and_change_texengine($r);
                   2064:     }elsif($env{'form.action'} eq 'changeicons'){
                   2065:         &iconchanger($r);
                   2066:     }elsif($env{'form.action'} eq 'verify_and_change_icons'){
                   2067:         &verify_and_change_icons($r);
                   2068:     }elsif($env{'form.action'} eq 'changeclicker'){
                   2069:         &clickerchanger($r);
                   2070:     }elsif($env{'form.action'} eq 'verify_and_change_clicker'){
                   2071:         &verify_and_change_clicker($r);
                   2072:     }elsif($env{'form.action'} eq 'changedomcoord'){
                   2073:         &domcoordchanger($r);
                   2074:     }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){
                   2075:         &verify_and_change_domcoord($r);
                   2076:     }elsif($env{'form.action'} eq 'lockwarning'){
                   2077:         &lockwarning($r);
                   2078:     }elsif($env{'form.action'} eq 'verify_and_change_locks'){
                   2079:         &verify_and_change_lockwarning($r);
                   2080:     }elsif($env{'form.action'} eq 'changecourseinit'){
                   2081:         &coursedisplaychanger($r);
                   2082:     }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){
                   2083:         &verify_and_change_coursepage($r);
                   2084:     }elsif($env{'form.action'} eq 'debugtoggle'){
1.154     www      2085:         &toggle_debug();
                   2086: 	&print_main_menu($r);
1.126     droeschl 2087:     }
                   2088: 
                   2089:     return OK;
                   2090: 
                   2091: 
                   2092: }
                   2093: #remove when done
                   2094: #old handler routine
                   2095: sub handler2 {
1.1       www      2096:     my $r = shift;
1.59      albertel 2097:     my $user = $env{'user.name'};
                   2098:     my $domain = $env{'user.domain'};
1.31      www      2099:     &Apache::loncommon::content_type($r,'text/html');
1.4       matthew  2100:     # Some pages contain DES keys and should not be cached.
                   2101:     &Apache::loncommon::no_cache($r);
1.1       www      2102:     $r->send_http_header;
                   2103:     return OK if $r->header_only;
1.9       matthew  2104:     #
1.35      matthew  2105:     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.70      raeburn  2106:                                    ['action','wysiwyg','returnurl','refpage']);
1.35      matthew  2107:     #
                   2108:     &Apache::lonhtmlcommon::clear_breadcrumbs();
                   2109:     &Apache::lonhtmlcommon::add_breadcrumb
                   2110:         ({href => '/adm/preferences',
                   2111:           text => 'Set User Preferences'});
                   2112: 
                   2113:     my @Options;
                   2114:     # Determine current authentication method
                   2115:     my $currentauth=&Apache::lonnet::queryauthenticate($user,$domain);
                   2116:     if ($currentauth =~ /^(unix|internal):/) {
                   2117:         push (@Options,({ action   => 'changepass',
1.40      www      2118:                           linktext => 'Change Password',
1.35      matthew  2119:                           href     => '/adm/preferences',
                   2120:                           help     => 'Change_Password',
                   2121:                           subroutine => \&passwordchanger,
                   2122:                           breadcrumb => 
                   2123:                               { href => '/adm/preferences?action=changepass',
                   2124:                                 text => 'Change Password'},
                   2125:                           },
                   2126:                         { action => 'verify_and_change_pass',
                   2127:                           subroutine => \&verify_and_change_password,
                   2128:                           breadcrumb => 
                   2129:                               { href =>'/adm/preferences?action=changepass',
                   2130:                                 text => 'Change Password'},
1.75      albertel 2131:                           printmenu => 'not_on_error',
1.35      matthew  2132:                           }));
                   2133:     }
                   2134:     push (@Options,({ action   => 'changescreenname',
                   2135:                       linktext => 'Change Screen Name',
                   2136:                       href     => '/adm/preferences',
                   2137:                       help     => 'Prefs_Screen_Name_Nickname',
                   2138:                       subroutine => \&screennamechanger,
                   2139:                       breadcrumb => 
                   2140:                           { href => '/adm/preferences?action=changescreenname',
                   2141:                             text => 'Change Screen Name'},
                   2142:                       },
                   2143:                     { action   => 'verify_and_change_screenname',
                   2144:                       subroutine => \&verify_and_change_screenname,
                   2145:                       breadcrumb => 
                   2146:                           { href => '/adm/preferences?action=changescreenname',
                   2147:                             text => 'Change Screen Name'},
                   2148:                       printmenu => 'yes',
                   2149:                       }));
                   2150: 
                   2151:     push (@Options,({ action   => 'changemsgforward',
1.129     schafran 2152:                       linktext => 'Change Message Forwarding and Notification E-mail Addresses',
1.35      matthew  2153:                       href     => '/adm/preferences',
1.113     raeburn  2154:                       help     => 'Prefs_Messages',
1.35      matthew  2155:                       breadcrumb => 
                   2156:                           { href => '/adm/preferences?action=changemsgforward',
1.113     raeburn  2157:                             text => 'Change Message Forwarding/Notification'},
1.35      matthew  2158:                       subroutine => \&msgforwardchanger,
                   2159:                       },
                   2160:                     { action => 'verify_and_change_msgforward',
1.113     raeburn  2161:                       help   => 'Prefs_Messages',
1.35      matthew  2162:                       breadcrumb => 
                   2163:                           { href => '/adm/preferences?action=changemsgforward',
1.113     raeburn  2164:                             text => 'Change Message Forwarding/Notification'},
1.126     droeschl 2165:                       printmenu => 'yes',
1.35      matthew  2166:                       subroutine => \&verify_and_change_msgforward }));
                   2167:     my $aboutmeaction=
1.59      albertel 2168:         '/adm/'.$env{'user.domain'}.'/'.$env{'user.name'}.'/aboutme';
1.35      matthew  2169:     push (@Options,{ action => 'none', 
                   2170:                      linktext =>
1.141     weissno  2171:                          q{Edit the Personal Information Page},
1.45      www      2172: 		     help => 'Prefs_About_Me',
1.35      matthew  2173:                      href => $aboutmeaction});
                   2174:     push (@Options,({ action => 'changecolors',
                   2175:                       linktext => 'Change Color Scheme',
                   2176:                       href => '/adm/preferences',
                   2177:                       help => 'Change_Colors',
                   2178:                       breadcrumb => 
                   2179:                           { href => '/adm/preferences?action=changecolors',
                   2180:                             text => 'Change Colors'},
                   2181:                       subroutine => \&colorschanger,
                   2182:                   },
                   2183:                     { action => 'verify_and_change_colors',
                   2184:                       breadcrumb => 
                   2185:                           { href => '/adm/preferences?action=changecolors',
                   2186:                             text => 'Change Colors'},
                   2187:                       printmenu => 'yes',
                   2188:                       subroutine => \&verify_and_change_colors,
                   2189:                       }));
                   2190:     push (@Options,({ action => 'changelanguages',
1.39      www      2191:                       linktext => 'Change Language Preferences',
1.35      matthew  2192:                       href => '/adm/preferences',
1.45      www      2193: 		      help => 'Prefs_Language',
1.35      matthew  2194:                       breadcrumb=>
                   2195:                           { href => '/adm/preferences?action=changelanguages',
                   2196:                             text => 'Change Language'},
                   2197:                       subroutine =>  \&languagechanger,
                   2198:                   },
                   2199:                     { action => 'verify_and_change_languages',
                   2200:                       breadcrumb=>
                   2201:                           {href => '/adm/preferences?action=changelanguages',
                   2202:                            text => 'Change Language'},
                   2203:                       printmenu => 'yes',
                   2204:                       subroutine=>\&verify_and_change_languages, }
                   2205:                     ));
1.44      www      2206:     push (@Options,({ action => 'changewysiwyg',
                   2207:                       linktext => 'Change WYSIWYG Editor Preferences',
                   2208:                       href => '/adm/preferences',
                   2209:                       breadcrumb => 
                   2210:                             { href => '/adm/preferences?action=changewysiwyg',
                   2211:                               text => 'Change WYSIWYG Preferences'},
                   2212:                       subroutine => \&wysiwygchanger,
                   2213:                   },
                   2214:                     { action => 'set_wysiwyg',
                   2215:                       breadcrumb =>
                   2216:                           { href => '/adm/preferences?action=changewysiwyg',
                   2217:                             text => 'Change WYSIWYG Preferences'},
                   2218:                       printmenu => 'yes',
                   2219:                       subroutine => \&verify_and_change_wysiwyg, }
                   2220:                     ));
1.42      raeburn  2221:     push (@Options,({ action => 'changediscussions',
                   2222:                       linktext => 'Change Discussion Display Preferences',
                   2223:                       href => '/adm/preferences',
1.46      raeburn  2224:                       help => 'Change_Discussion_Display',
1.42      raeburn  2225:                       breadcrumb => 
                   2226:                             { href => '/adm/preferences?action=changediscussions',
1.43      raeburn  2227:                               text => 'Change Discussion Preferences'},
1.42      raeburn  2228:                       subroutine => \&discussionchanger,
                   2229:                   },
                   2230:                     { action => 'verify_and_change_discussion',
                   2231:                       breadcrumb =>
                   2232:                           { href => '/adm/preferences?action=changediscussions',
1.43      raeburn  2233:                             text => 'Change Discussion Preferences'},
1.42      raeburn  2234:                       printmenu => 'yes',
                   2235:                       subroutine => \&verify_and_change_discussion, }
                   2236:                     ));
1.96      albertel 2237: 
                   2238:     my $role = ($env{'user.adv'} ? 'Roles' : 'Course');
1.50      albertel 2239:     push (@Options,({ action   => 'changerolespref',
1.96      albertel 2240:                       linktext => 'Change '.$role.' Page Preferences',
1.50      albertel 2241:                       href     => '/adm/preferences',
                   2242:                       subroutine => \&rolesprefchanger,
                   2243:                       breadcrumb =>
                   2244:                           { href => '/adm/preferences?action=changerolespref',
1.96      albertel 2245:                             text => 'Change '.$role.' Page Pref'},
1.50      albertel 2246:                       },
                   2247:                     { action   => 'verify_and_change_rolespref',
                   2248:                       subroutine => \&verify_and_change_rolespref,
                   2249:                       breadcrumb =>
                   2250:                           { href => '/adm/preferences?action=changerolespref',
1.96      albertel 2251:                             text => 'Change '.$role.' Page Preferences'},
1.50      albertel 2252:                       printmenu => 'yes',
                   2253:                       }));
                   2254: 
1.54      albertel 2255:     push (@Options,({ action   => 'changetexenginepref',
                   2256:                       linktext => 'Change How Math Equations Are Displayed',
                   2257:                       href     => '/adm/preferences',
                   2258:                       subroutine => \&texenginechanger,
                   2259:                       breadcrumb =>
                   2260:                           { href => '/adm/preferences?action=changetexenginepref',
                   2261:                             text => 'Change Math Pref'},
                   2262:                       },
                   2263:                     { action   => 'verify_and_change_texengine',
                   2264:                       subroutine => \&verify_and_change_texengine,
                   2265:                       breadcrumb =>
                   2266:                           { href => '/adm/preferences?action=changetexenginepref',
                   2267:                             text => 'Change Math Preferences'},
                   2268:                       printmenu => 'yes',
                   2269:                       }));
1.85      albertel 2270: 
                   2271:     if ($env{'environment.remote'} eq 'off') {
                   2272: 	push (@Options,({ action => 'launch',
                   2273: 			  linktext => 'Launch Remote Control',
                   2274: 			  href => '/adm/remote?url=/adm/preferences',
                   2275: 		      }));
                   2276:     } else {
                   2277: 	push (@Options,({ action => 'collapse',
                   2278: 			  linktext => 'Collapse Remote Control',
                   2279: 			  href => '/adm/remote?url=/adm/preferences',
                   2280: 		      }));
                   2281:     }
                   2282: 
1.98      www      2283:     push (@Options,({ action   => 'changeicons',
1.100     www      2284:                       linktext => 'Change How Menus are Displayed',
1.98      www      2285:                       href     => '/adm/preferences',
                   2286:                       subroutine => \&iconchanger,
                   2287:                       breadcrumb =>
                   2288:                           { href => '/adm/preferences?action=changeicons',
                   2289:                             text => 'Change Main Menu'},
                   2290:                       },
                   2291:                     { action   => 'verify_and_change_icons',
                   2292:                       subroutine => \&verify_and_change_icons,
                   2293:                       breadcrumb =>
                   2294:                           { href => '/adm/preferences?action=changeicons',
                   2295:                             text => 'Change Main Menu'},
                   2296:                       printmenu => 'yes',
                   2297:                       }));
                   2298: 
1.106     www      2299:     push (@Options,({ action   => 'changeclicker',
                   2300:                       linktext => 'Register Response Devices ("Clickers")',
                   2301:                       href     => '/adm/preferences',
                   2302:                       subroutine => \&clickerchanger,
                   2303:                       breadcrumb =>
1.118     www      2304:                           { href => '/adm/preferences?action=changeclicker',
1.106     www      2305:                             text => 'Register Clicker'},
                   2306:                       },
                   2307:                     { action   => 'verify_and_change_clicker',
                   2308:                       subroutine => \&verify_and_change_clicker,
                   2309:                       breadcrumb =>
                   2310:                           { href => '/adm/preferences?action=changeclicker',
                   2311:                             text => 'Register Clicker'},
                   2312:                       printmenu => 'yes',
                   2313:                       }));
1.125     raeburn  2314:     my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au']);
                   2315:     if (keys(%author_roles) > 0) {
1.119     www      2316:       push (@Options,({ action   => 'changedomcoord',
                   2317:                         linktext => 'Restrict Domain Coordinator Access',
                   2318:                         href     => '/adm/preferences',
                   2319:                         subroutine => \&domcoordchanger,
                   2320:                         breadcrumb =>
                   2321:                             { href => '/adm/preferences?action=changedomcoord',
                   2322:                               text => 'Restrict Domain Coordinator Access'},
                   2323:                       },
                   2324:                       { action   => 'verify_and_change_domcoord',
                   2325:                         subroutine => \&verify_and_change_domcoord,
                   2326:                         breadcrumb =>
                   2327:                             { href => '/adm/preferences?action=changedomcoord',
                   2328:                               text => 'Restrict Domain Coordinator Access'},
                   2329:                         printmenu => 'yes',
                   2330:                       }));
                   2331:     }
1.105     www      2332: 
1.118     www      2333:     push (@Options,({ action   => 'lockwarning',
                   2334:                       subroutine => \&lockwarning,
                   2335:                       breadcrumb =>
                   2336:                           { href => '/adm/preferences?action=lockwarning',
                   2337:                             text => 'Lock Warnings'},
                   2338:                       },
                   2339:                     { action   => 'verify_and_change_locks',
                   2340:                       subroutine => \&verify_and_change_lockwarning,
                   2341:                       breadcrumb =>
                   2342:                           { href => '/adm/preferences?action=lockwarning',
                   2343:                             text => 'Lockwarnings'},
                   2344:                       printmenu => 'yes',
                   2345:                       }));
                   2346: 
1.105     www      2347: 
1.74      albertel 2348:     if (&Apache::lonnet::allowed('whn',$env{'request.course.id'})
                   2349: 	|| &Apache::lonnet::allowed('whn',$env{'request.course.id'}.'/'
                   2350: 				    .$env{'request.course.sec'})) {
1.63      raeburn  2351:         push (@Options,({ action => 'changecourseinit',
                   2352:                           linktext => 'Change Course Initialization Preference',
                   2353:                           href => '/adm/preferences',
                   2354:                           subroutine => \&coursedisplaychanger,
                   2355:                           breadcrumb =>
                   2356:                               { href => '/adm/preferences?action=changecourseinit',
                   2357:                                 text => 'Change Course Init. Pref.'},
                   2358:                           },
                   2359:                         { action => 'verify_and_change_coursepage',
                   2360:                           breadcrumb =>
                   2361:                           { href => '/adm/preferences?action=changecourseinit',                               text => 'Change Course Initialization Preference'},
                   2362:                         printmenu => 'yes',
                   2363:                         subroutine => \&verify_and_change_coursepage,
                   2364:                        }));
                   2365:     }
1.50      albertel 2366: 
1.154     www      2367:     if (($env{'user.name'} =~ /^(albertel|fox|foxr|kortemey|korte|raeburn)$/)
                   2368:      && ($env{'user.domain'} =~/^(msu|gerd)$/)){
1.35      matthew  2369:         push (@Options,({ action => 'debugtoggle',
                   2370:                           printmenu => 'yes',
                   2371:                           subroutine => \&toggle_debug,
                   2372:                           }));
                   2373:     }
1.76      albertel 2374: 
                   2375:     $r->print(&Apache::loncommon::start_page('Change Preferences'));
                   2376: 
1.35      matthew  2377:     my $call = undef;
1.48      albertel 2378:     my $help = undef;
1.35      matthew  2379:     my $printmenu = 'yes';
                   2380:     foreach my $option (@Options) {
1.59      albertel 2381:         if ($option->{'action'} eq $env{'form.action'}) {
1.35      matthew  2382:             $call = $option->{'subroutine'};
                   2383:             $printmenu = $option->{'printmenu'};
                   2384:             if (exists($option->{'breadcrumb'})) {
                   2385:                 &Apache::lonhtmlcommon::add_breadcrumb
                   2386:                     ($option->{'breadcrumb'});
                   2387:             }
1.48      albertel 2388: 	    $help=$option->{'help'};
1.35      matthew  2389:         }
                   2390:     }
1.81      albertel 2391:     $r->print(&Apache::lonhtmlcommon::breadcrumbs('Change Preferences',$help));
1.75      albertel 2392:     my $error;
1.35      matthew  2393:     if (defined($call)) {
1.75      albertel 2394:         $error = $call->($r);
1.35      matthew  2395:     }
1.75      albertel 2396:     if ( ( ($printmenu eq 'yes')
                   2397: 	   || ($printmenu eq 'not_on_error' && !$error) )
                   2398: 	 && (!$env{'form.returnurl'})) {
1.35      matthew  2399:         my $optionlist = '<table cellpadding="5">';
1.59      albertel 2400:         if ($env{'user.name'} =~ 
1.62      raeburn  2401:                          /^(albertel|kortemey|fox|foxr|korte|hallmat3|turtle|raeburn)$/
1.35      matthew  2402:             ) {
                   2403:             push (@Options,({ action => 'debugtoggle',
                   2404:                               linktext => 'Toggle Debug Messages',
                   2405:                               text => 'Current Debug status is -'.
1.59      albertel 2406:                                   $env{'user.debug'}.'-.',
1.35      matthew  2407:                               href => '/adm/preferences',
                   2408:                               printmenu => 'yes',
                   2409:                               subroutine => \&toggle_debug,
                   2410:                               }));
                   2411:         }
                   2412:         foreach my $option(@Options) {
                   2413:             my $optiontext = '';
                   2414:             if (exists($option->{'href'})) {
1.85      albertel 2415: 		$option->{'href_args'}{'action'}=$option->{'action'};
                   2416: 		$optiontext .= 
                   2417:                     '<a href="'.&add_get_param($option->{'href'},
                   2418: 					       $option->{'href_args'}).'">'.
1.47      albertel 2419:                     &mt($option->{'linktext'}).'</a>';
1.35      matthew  2420:             }
                   2421:             if (exists($option->{'text'})) {
1.47      albertel 2422:                 $optiontext .= ' '.&mt($option->{'text'});
1.35      matthew  2423:             }
                   2424:             if ($optiontext ne '') {
                   2425:                 $optiontext = '<font size="+1">'.$optiontext.'</font>'; 
                   2426:                 my $helplink = '&nbsp;';
                   2427:                 if (exists($option->{'help'})) {
                   2428:                     $helplink = &Apache::loncommon::help_open_topic
                   2429:                                                     ($option->{'help'});
                   2430:                 }
                   2431:                 $optionlist .= '<tr>'.
                   2432:                     '<td>'.$helplink.'</td>'.
                   2433:                     '<td>'.$optiontext.'</td>'.
                   2434:                     '</tr>';
                   2435:             }
1.13      www      2436:         }
1.35      matthew  2437:         $optionlist .= '</table>';
                   2438:         $r->print($optionlist);
1.59      albertel 2439:     } elsif ($env{'form.returnurl'}) {
                   2440: 	$r->print('<br /><a href="'.$env{'form.returnurl'}.'"><font size="+1">'.
1.44      www      2441: 		  &mt('Return').'</font></a>');
1.3       matthew  2442:     }
1.76      albertel 2443:     $r->print(&Apache::loncommon::end_page());
1.1       www      2444:     return OK;
1.35      matthew  2445: }
                   2446: 
                   2447: sub toggle_debug {
1.59      albertel 2448:     if ($env{'user.debug'}) {
1.139     raeburn  2449:         &Apache::lonnet::delenv('user.debug');
1.35      matthew  2450:     } else {
1.116     raeburn  2451:         &Apache::lonnet::appenv({'user.debug' => 1});
1.35      matthew  2452:     }
1.13      www      2453: }
1.1       www      2454: 
                   2455: 1;
                   2456: __END__

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