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

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

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