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

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

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