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

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

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