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

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

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