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

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

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