--- loncom/interface/lonpreferences.pm	2014/06/09 22:39:01	1.196.4.15
+++ loncom/interface/lonpreferences.pm	2018/09/03 14:03:03	1.196.4.24
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Preferences
 #
-# $Id: lonpreferences.pm,v 1.196.4.15 2014/06/09 22:39:01 raeburn Exp $
+# $Id: lonpreferences.pm,v 1.196.4.24 2018/09/03 14:03:03 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -160,11 +160,13 @@ sub texenginechanger {
     my $domain     = $env{'user.domain'};
     my %userenv = &Apache::lonnet::get('environment',['texengine']);
     my $texengine=$userenv{'texengine'};
+    if (lc($texengine) eq 'jsmath') {
+        $texengine = 'MathJax';
+    }
 
     my %mathchoices=('' => 'Default',
 		     'tth' => 'tth (TeX to HTML)',
 		     #'ttm' => 'TeX to MathML',
-		     'jsMath' => 'jsMath',
                      'MathJax' => 'MathJax',
 		     'mimetex' => 'mimetex (Convert to Images)',
                      'raw' => 'Raw (Screen Reader)'
@@ -176,7 +178,6 @@ sub texenginechanger {
                'texengine',
                \%mathchoices);
     my $MathJax_start=&Apache::lontexconvert::MathJax_header();
-    my $jsMath_start=&Apache::lontexconvert::jsMath_header();
     my %lt=&Apache::lonlocal::texthash(
       'headline' => 'Change how math is displayed',
       'preftxt'  => 'Preferred method to display math',
@@ -184,26 +185,10 @@ sub texenginechanger {
       'exmpl'    => 'Examples',
       'mathjax'  => 'MathJax:',
       'mathjaxinfo' =>  'MathJax provides rendered equations whose source code can be extracted in TeX and MathML formats by right clicking the equation.',
-      'jsmath'   => 'jsMath:',
       'tth'      => 'tth (TeX to HTML):',
       'mimetex'  => 'mimetex (Convert to Images):',
     );
 
-    my $jsMathWarning='<p>'
-                     .'<div class="LC_warning">'
-                     .&mt("It looks like you don't have the TeX math fonts installed.")
-                     .'</div>'
-                     .'<div>'
-                     .&mt('The jsMath example on this page may not look right without them. '
-                         .'The [_1]jsMath Home Page[_2] has information on how to download the '
-                         .'needed fonts. In the meantime, jsMath will do the best it can '
-                         .'with the fonts you have, but it may not be pretty and some equations '
-                         .'may not be rendered correctly.'
-                         ,'<a href="http://www.math.union.edu/locate/jsMath/" target="_blank">'
-                         ,'</a>')
-                     .'</div>'
-                     .'</p>';
-
     $r->print(<<ENDLSCREEN);
 <h2>$lt{'headline'}</h2>
 <form name="prefs" action="/adm/preferences" method="post">
@@ -226,18 +211,6 @@ $lt{'exmpl'}
 $lt{'mathjaxinfo'}
 </p>
 
-<h3>$lt{'jsmath'}</h3> 
-<p>
-$jsMath_start
-<script type="text/javascript" language="JavaScript">
-if (jsMath.nofonts == 1) {
-    document.writeln($jsMathWarning);
-}
-
-</script>
-<iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=jsMath" width="400" height="150"></iframe>
-</p>
-
 <h3>$lt{'mimetex'}</h3>
 <p>
 <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=mimetex" width="400" height="150"></iframe>
@@ -248,9 +221,6 @@ if (jsMath.nofonts == 1) {
 <iframe src="/res/adm/pages/math_example.tex?inhibitmenu=yes&texengine=tth" width="400" height="150"></iframe>
 </p>
 ENDLSCREEN
-    if ($env{'environment.texengine'} ne 'jsMath') {
-	$r->print('<script type="text/javascript" language="JavaScript">jsMath.Process()</script>');
-    }
 }
 
 
@@ -261,6 +231,9 @@ sub verify_and_change_texengine {
 # Screenname
     my $newtexengine  = $env{'form.texengine'};
     $newtexengine=~s/[^\-\w]//g;
+    if (lc($newtexengine) eq 'jsmath') {
+        $newtexengine = 'MathJax';
+    }
     if ($newtexengine eq 'ttm') {
 	&Apache::lonnet::appenv({'browser.mathml' => 1});
     } else {
@@ -749,8 +722,10 @@ sub domcoordchanger {
     my $text=&mt('By default, the Domain Coordinator can enter your Authoring Space.');
     my $construction=&mt('Block access to Authoring Space');
     my $change=&mt('Save');
+    my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
     $r->print(<<ENDSCREEN);
 <form name="prefs" action="/adm/preferences" method="post">
+<input type="hidden" name="returnurl" value="$returnurl" />
 <input type="hidden" name="action" value="verify_and_change_domcoord" />
 $text<br />
 <label><input type="checkbox" name="construction"$constchecked />$construction</label><br />
@@ -775,7 +750,11 @@ sub verify_and_change_domcoord {
     }
     my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Block access to Authoring Space').'</i>','<tt>'.$status.'</tt>'));
     $message=&Apache::loncommon::confirmwrapper($message);
-    &print_main_menu($r,$message);
+    if ($env{'form.returnurl'}) {
+        &do_redirect($r,$env{'form.returnurl'},$message);
+    } else {
+        &print_main_menu($r,$message);
+    }
 }
 
 #################################################################
@@ -789,7 +768,7 @@ sub lockwarning {
     my $textbottom=&mt('Changing roles or logging out may result in data corruption.');
     my ($num,%which)=&Apache::lonnet::get_locks();
     my $which='';
-    foreach my $id (keys %which) {
+    foreach my $id (keys(%which)) {
        $which.='<li>'.$which{$id}.'</li>';
     }
     my $change=&mt('Override');
@@ -1181,7 +1160,6 @@ sub colorschanger {
 ' . $colorchooser . '
 </script>
 ');
-
     $r->print(<<ENDCOL);
 
 <form name="parmform" action="">
@@ -1220,7 +1198,7 @@ sub verify_and_change_colors {
     );
 
     my $message='';
-    foreach my $item (keys %colortypes) {
+    foreach my $item (keys(%colortypes)) {
         my $color=$env{'form.'.$item};
         if (!($color =~ /^#/)) {
             $color = '#' . $color;
@@ -1263,6 +1241,12 @@ sub passwordchanger {
         $r->print(Apache::loncommon::start_page('Personal Data'));
         $r->print(Apache::lonhtmlcommon::breadcrumbs('Change Password'));
     }
+    my ($blocked,$blocktext) =
+        &Apache::loncommon::blocking_status('passwd');
+    if ($blocked) {
+        $r->print('<p class="LC_warning">'.$blocktext.'</p>');
+        return;
+    }
     if ((!defined($caller)) || ($caller eq 'preferences')) {
         $user = $env{'user.name'};
         $domain = $env{'user.domain'};
@@ -1369,21 +1353,18 @@ sub jscript_send {
         uextkey=this.document.client.elements.ukey_cpass.value;
         lextkey=this.document.client.elements.lkey_cpass.value;
         initkeys();
-
-        this.document.pserver.elements.currentpass.value
-            =crypted(this.document.client.elements.currentpass.value);
-
+        this.document.pserver.elements.currentpass.value =
+            getCrypted(this.document.client.elements.currentpass.value);
         uextkey=this.document.client.elements.ukey_npass1.value;
         lextkey=this.document.client.elements.lkey_npass1.value;
         initkeys();
         this.document.pserver.elements.newpass_1.value
-            =crypted(this.document.client.elements.newpass_1.value);
-
+            =getCrypted(this.document.client.elements.newpass_1.value);
         uextkey=this.document.client.elements.ukey_npass2.value;
         lextkey=this.document.client.elements.lkey_npass2.value;
         initkeys();
         this.document.pserver.elements.newpass_2.value
-            =crypted(this.document.client.elements.newpass_2.value);
+            =getCrypted(this.document.client.elements.newpass_2.value);
 |;
     if ($caller eq 'reset_by_email') {
         $output .= qq|
@@ -1398,6 +1379,7 @@ sub jscript_send {
     $ output .= qq|
         this.document.pserver.submit();
     }
+
 </script>
 |;
 }
@@ -1417,13 +1399,19 @@ sub client_form {
     my $output = '<form name="client" action="">'
                 .&Apache::lonhtmlcommon::start_pick_box();
     if ($caller eq 'reset_by_email') {
+        my $mobileargs;
+        (undef,undef,undef,undef,undef,undef,my $clientmobile) =
+            &Apache::loncommon::decode_user_agent();
+        if ($clientmobile) {
+            $mobileargs = 'autocapitalize="off" autocorrect="off" ';
+        }
         $output .= &Apache::lonhtmlcommon::row_title(
                        '<label for="email">'.$lt{'email'}.'</label>')
-                  .'<input type="text" name="email" size="30" />'
+                  .'<input type="text" name="email" size="30" '.$mobileargs.'/>'
                   .&Apache::lonhtmlcommon::row_closure()
                   .&Apache::lonhtmlcommon::row_title(
                        '<label for="uname">'.$lt{'username'}.'</label>')
-                  .'<input type="text" name="uname" size="15" />'
+                  .'<input type="text" name="uname" size="20" '.$mobileargs.'/>'
                   .'<input type="hidden" name="currentpass" value="'.$currentpass.'" />'
                   .&Apache::lonhtmlcommon::row_closure()
                   .&Apache::lonhtmlcommon::row_title(
@@ -1433,16 +1421,16 @@ sub client_form {
     } else {
         $output .= &Apache::lonhtmlcommon::row_title(
                        '<label for="currentpass">'.$lt{'currentpass'}.'</label>')
-                  .'<input type="password" name="currentpass" size="10"/>'
+                  .'<input type="password" name="currentpass" size="20"/>'
                   .&Apache::lonhtmlcommon::row_closure();
     }
     $output .= &Apache::lonhtmlcommon::row_title(
                    '<label for="newpass_1">'.$lt{'newpass'}.'</label>')
-              .'<input type="password" name="newpass_1" size="10" />'
+              .'<input type="password" name="newpass_1" size="20" />'
               .&Apache::lonhtmlcommon::row_closure()
               .&Apache::lonhtmlcommon::row_title(
                    '<label for="newpass_2">'.$lt{'confirmpass'}.'</label>')
-              .'<input type="password" name="newpass_2" size="10" />'
+              .'<input type="password" name="newpass_2" size="20" />'
               .&Apache::lonhtmlcommon::row_closure(1)
               .&Apache::lonhtmlcommon::end_pick_box();
     $output .= '<p><input type="button" value="'.$lt{'changepass'}.'" onclick="send();" /></p>'
@@ -1489,8 +1477,14 @@ sub server_form {
 }
 
 sub verify_and_change_password {
-    my ($r,$caller,$mailtoken) = @_;
+    my ($r,$caller,$mailtoken,$ended) = @_;
     my ($user,$domain,$homeserver);
+    my ($blocked,$blocktext) =
+        &Apache::loncommon::blocking_status('passwd');
+    if ($blocked) {
+        $r->print('<p class="LC_warning">'.$blocktext.'</p>');
+        return;
+    }
     if ($caller eq 'reset_by_email') {
         $user       = $env{'form.uname'};
         $domain     = $env{'form.udom'};
@@ -1628,6 +1622,9 @@ ENDERROR
             $r->print($message.'<br />');
         } else {
             &print_main_menu($r, $message);
+            if (ref($ended)) {
+                $$ended = 1;
+            }
         }
     } else {
 	# error error: run in circles, scream and shout
@@ -1642,6 +1639,9 @@ ENDERROR
                 &mt("The password for user [_1] was not changed.",'<i>'.$user.'</i>').' '.&mt('Please make sure your old password was entered correctly.'),1);
             $message=&Apache::loncommon::confirmwrapper($message);
             &print_main_menu($r, $message);
+            if (ref($ended)) {
+                $$ended = 1;
+            }
         }
     }
     return;
@@ -1877,6 +1877,64 @@ sub verify_and_change_coursepage {
     &print_main_menu($r,$message);
 }
 
+sub author_space_settings {
+    my $r = shift;
+    &Apache::lonhtmlcommon::add_breadcrumb(
+            {   href => '/adm/preferences?action=authorsettings',
+                text => 'Authoring Space Settings'});
+    my $user       = $env{'user.name'};
+    my $domain     = $env{'user.domain'};
+    my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
+    if (keys(%author_roles) > 0) {
+            $r->print(Apache::loncommon::start_page('Authoring Space Settings'));
+            $r->print(Apache::lonhtmlcommon::breadcrumbs('Authoring Space Settings'));
+            my %userenv = &Apache::lonnet::get('environment',['nocodemirror']);
+            my $constchecked='';
+            if ($env{'environment.nocodemirror'}) {
+               $constchecked=' checked="checked"';
+            }
+            my $text=&mt('By default, CodeMirror an editor with advanced functionality for editing code is activated for authors.');
+            my $cmoff=&mt('Deactivate CodeMirror. This can improve performance on slow computers and accessibility.');
+            my $change=&mt('Save');
+            my $returnurl = &HTML::Entities::encode($env{'form.returnurl'},'"<>&\'');
+            $r->print(<<ENDSCREEN);
+        <form name="prefs" action="/adm/preferences" method="post">
+        <input type="hidden" name="returnurl" value="$returnurl" />
+        <input type="hidden" name="action" value="change_authoring_settings" />
+        $text<br />
+        <label><input type="checkbox" name="cmoff"$constchecked />$cmoff</label><br />
+        <input type="submit" value="$change" />
+        </form>
+ENDSCREEN
+    }
+}
+
+sub change_authoring_settings {
+    my $r = shift;
+    my $user       = $env{'user.name'};
+    my $domain     = $env{'user.domain'};
+    my %author_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
+    if (keys(%author_roles) > 0) {
+            my %ausettings=('environment.nocodemirror' => '');
+            if ($env{'form.cmoff'}) { $ausettings{'environment.nocodemirror'}='yes'; }
+            &Apache::lonnet::put('environment',\%ausettings);
+            &Apache::lonnet::appenv({'environment.nocodemirror' => $ausettings{'environment.nocodemirror'}});
+            my $status='';
+            if ($ausettings{'environment.nocodemirror'} eq 'yes') {
+                $status=&mt('on');
+            } else {
+                $status=&mt('off');
+            }
+            my $message=&Apache::lonhtmlcommon::confirm_success(&mt('Set [_1] to [_2]','<i>'.&mt('Deactivate CodeMirror in Authoring Space').'</i>','<tt>'.$status.'</tt>'));
+            $message=&Apache::loncommon::confirmwrapper($message);
+            if ($env{'form.returnurl'}) {
+                &do_redirect($r,$env{'form.returnurl'},$message);
+            } else {
+                &print_main_menu($r,$message);
+            }
+    }
+}
+
 sub lockednameschanger {
     my $r = shift;
     &Apache::lonhtmlcommon::add_breadcrumb(
@@ -2137,6 +2195,18 @@ push(@{ $menu[4]->{items} }, {
 	});
 
     }
+
+    my %author_coauthor_roles = &Apache::lonnet::get_my_roles($user,$domain,'userroles','',['au','ca','aa']);
+    if (keys(%author_coauthor_roles) > 0) {
+        push(@{ $menu[4]->{items} }, {
+            linktext => 'Authoring Space Configuration',
+            url => '/adm/preferences?action=authorsettings',
+            permission => 'F',
+            icon => 'codemirror.png',
+            linktitle => 'Settings for your authoring space.',
+        });
+    }
+
     if (&can_toggle_debug()) {
 push(@{ $menu[4]->{items} }, {
 	linktext => 'Toggle Debug Messages (Currently '.($env{'user.debug'} ? 'on)' : 'off)'),
@@ -2174,10 +2244,22 @@ sub handler {
                                    ['action','wysiwyg','returnurl','refpage']);
     #
     Apache::lonhtmlcommon::clear_breadcrumbs();
-    my ($brlink,$brtxt,$brhelp);
+    my ($brlink,$brtxt,$brhelp,$ended);
     if (($env{'form.action'} eq 'changerolespref') && ($env{'form.returnurl'} eq '/adm/roles')) {
         $brlink ='/adm/roles';
         $brtxt = 'User Roles';
+    } elsif ((($env{'form.action'} eq 'changedomcoord') ||
+              ($env{'form.action'} eq 'authorsettings')) &&
+             (($env{'form.returnurl'} =~ m{^/(priv/|res($|/))}) ||
+              ($env{'form.returnurl'} eq '/adm/createuser'))) {
+        $brlink = $env{'form.returnurl'};
+        if ($env{'form.returnurl'} eq '/adm/createuser') {
+            $brtxt = 'User Management';
+        } elsif ($env{'form.returnurl'} =~ m{^/res($\/)}) {
+            $brtxt = 'Browse published resources';
+        } else {
+            $brtxt = 'Authoring Space';
+        }
     } else {
         $brlink ='/adm/preferences';
         $brtxt = 'Set User Preferences';
@@ -2189,14 +2271,16 @@ sub handler {
           help => $brhelp,});
     if(!exists $env{'form.action'}) {
 	    &print_main_menu($r);
+            $ended = 1;
     }elsif($env{'form.action'} eq 'changepass'){
         &passwordchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_pass'){
-        &verify_and_change_password($r);
+        &verify_and_change_password($r,'preferences','',\$ended);
     }elsif($env{'form.action'} eq 'changescreenname'){
         &screennamechanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_screenname'){
         &verify_and_change_screenname($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changemsgforward'){
         &msgforwardchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_msgforward'){
@@ -2205,38 +2289,47 @@ sub handler {
         &colorschanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_colors'){
         &verify_and_change_colors($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changelanguages'){
         &languagechanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_languages'){
         &verify_and_change_languages($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changewysiwyg'){
         &wysiwygchanger($r);
     }elsif($env{'form.action'} eq 'set_wysiwyg'){
         &verify_and_change_wysiwyg($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changediscussions'){
         &discussionchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_discussion'){
         &verify_and_change_discussion($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changerolespref'){
         &rolesprefchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_rolespref'){
         &verify_and_change_rolespref($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changetexenginepref'){
         &texenginechanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_texengine'){
         &verify_and_change_texengine($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changeicons'){
         &iconchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_icons'){
         &verify_and_change_icons($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changeclicker'){
         &clickerchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_clicker'){
         &verify_and_change_clicker($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'changedomcoord'){
         &domcoordchanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_domcoord'){
         &verify_and_change_domcoord($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'lockwarning'){
         &lockwarning($r);
     }elsif($env{'form.action'} eq 'verify_and_change_locks'){
@@ -2245,22 +2338,29 @@ sub handler {
         &coursedisplaychanger($r);
     }elsif($env{'form.action'} eq 'verify_and_change_coursepage'){
         &verify_and_change_coursepage($r);
+        $ended = 1;
+    }elsif($env{'form.action'} eq 'authorsettings'){
+        &author_space_settings($r);
+    }elsif($env{'form.action'} eq 'change_authoring_settings'){
+        &change_authoring_settings($r);
+        $ended = 1;
     }elsif($env{'form.action'} eq 'debugtoggle'){
         if (&can_toggle_debug()) {
             &toggle_debug();
         }
 	&print_main_menu($r);
+        $ended = 1;
     } elsif ($env{'form.action'} eq 'changelockednames') {
         &lockednameschanger($r);
     } elsif ($env{'form.action'} eq 'verify_and_change_lockednames') {
         &verify_and_change_lockednames($r);
+        $ended = 1;
     }
 
     # Properly end the HTML page of all preference pages
     # started in each sub routine
     # Exception: print_main_menu has its own end_page call
-    unless (!exists $env{'form.action'} ||
-            $env{'form.action'} eq 'debugtoggle') {
+    unless ($ended) {
         $r->print(&Apache::loncommon::end_page());
     }
 
@@ -2333,5 +2433,16 @@ sub updateable_userinfo {
     return %updateable;
 }
 
+sub do_redirect {
+    my ($r,$url,$msg) = @_;
+    $r->print(
+        &Apache::loncommon::start_page('Switching Server ...',undef,
+                                       {'redirect'       => [0.5,$url]}).
+        '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n".
+        "$msg\n".
+        &Apache::loncommon::end_page());
+    return;
+}
+
 1;
 __END__