--- loncom/xml/lontexconvert.pm	2012/05/10 19:19:30	1.112.2.1
+++ loncom/xml/lontexconvert.pm	2014/06/18 06:48:47	1.112.2.4
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # TeX Conversion Module
 #
-# $Id: lontexconvert.pm,v 1.112.2.1 2012/05/10 19:19:30 raeburn Exp $
+# $Id: lontexconvert.pm,v 1.112.2.4 2014/06/18 06:48:47 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -54,17 +54,37 @@ use IO::Socket::INET;
 #
 # Table of substitutions to unicode characters.
 #
+
+my %unicode_harpoons = (
+                        '\rightleftharpoons'  => 0x21cc,
+                      );
+
 my %unicode_translations = (
-    '\rightleftharpoons'  => 0x21cc,
 
-# Brackets - unicode is commented out with pure 8-bit ascii ugliness while we need it.
+# Brackets - unicode for browsers/OS which support it.
+
+    ''             => 0x23a1,
+    ''             => 0x23a2,
+    ''             => 0x23a3,
+    ''             => 0x23a4,
+    ''             => 0x23a5,
+    ''             => 0x23a6,
+
+#  Parens - unicode for browsers/OS which support it
+
+    ''              => 0x239b,
+    ''              => 0x239c,
+    ''              => 0x239d,
+    ''              => 0x239e,
+    ''              => 0x239f,
+    ''              => 0x23a0,
+
+);
+
+my %ascii_8bit_translations = (
+
+# Brackets - pure 8-bit ascii ugliness for browsers/OS which can't handle unicode
 
-#    ''             => 0x23a1,
-#    ''             => 0x23a2,
-#    ''             => 0x23a3,   # when unicode catches up with browsers
-#    ''             => 0x23a4,   # use these instead of the cheesey brackets below
-#    ''             => 0x23a5,
-#    ''             => 0x23a6   
     ''              => 0x5b,
     ''              => 0x5b,    # '['
     ''              => 0x5b,
@@ -72,24 +92,14 @@ my %unicode_translations = (
     ''              => 0x5d,
     ''              => 0x5d,
 
-#  Parens..again the unicode is commented out with the 8-bit ascii ugliness
-#  turned on until browsers catch up with the unicode world.
-
-#    ''              => 0x239b,
-#    ''              => 0x239c,
-#    ''              => 0x239d,
-#    ''              => 0x239e,
-#    ''              => 0x239f,
-#    ''              => 0x23a0
+# Parens - pure 8-bit ascii ugliness for browsers/OS which can't handle unicode
 
     ''              => 0x28,
     ''              => 0x28,      # '('
     ''              => 0x28,
-
     ''              => 0x29,
     ''              => 0x29,      # '('
-    ''              => 0x29
-
+    ''              => 0x29,
 
 );
 
@@ -171,16 +181,33 @@ sub convert_real {
     &Apache::lonxml::end_alarm();
 
     #
-    #  Several strings produced by tth require
+    # Several strings produced by tth require
     # transliteration -> unicode equivalents to render reliably
-    # in browsers. %unicode_translations is a table of
-    # string->substitution which we now apply:
+    # in browsers. %unicode_translations and %unicode_harpoons are tables of
+    # string->substitution which we now apply. (%ascii_8bit_translations used
+    # instead for Windows XP and mobile devices.
+
+    my $use_ascii;
+    if ($env{'browser.os'} eq 'win') {
+        if (($env{'browser.osversion'}) && ($env{'browser.osversion'} < 6.0)) {
+            $use_ascii = 1;
+        }
+    }
+    if ($env{'browser.mobile'}) {
+        $use_ascii = 1;
+    }
 
     foreach my $pattern (keys(%unicode_translations)) {
 	my $unicode = $unicode_translations{$pattern};
+	if ($use_ascii) {
+	    $unicode = $ascii_8bit_translations{$pattern};
+	}
 	$xmlstring = &unicode_subst($xmlstring, $pattern, $unicode);
     }
 
+    foreach my $pattern (keys(%unicode_harpoons)) {
+        $xmlstring = &unicode_subst($xmlstring, $pattern, $unicode_harpoons{$pattern});
+    }
 
     return ($xmlstring,$errorstring);
 }
@@ -241,6 +268,37 @@ sub displaystyle {
     return 0;
 }
 
+sub MathJax_converted {
+    my $texstring=shift;
+    my $tag='math/tex;';
+    if (&displaystyle($texstring)) { $tag='math/tex; mode=display'; }
+    &clean_out_math_mode($texstring);
+    return &MathJax_header().
+      '<script type="'.$tag.'">'.$$texstring.'</script>';
+}
+
+{
+    #Relies heavily on the previous jsMath installation
+    my @MathJax_sent_header;
+    sub MathJax_reset {
+        undef(@MathJax_sent_header);
+    }
+    sub MathJax_push {
+        push(@MathJax_sent_header,0);
+    }
+    sub MathJax_header {
+        if (!@MathJax_sent_header) {
+            &Apache::lonnet::logthis("mismatched calls of MathJax_header and MathJax_process");
+            return '';
+        }
+        return '' if $MathJax_sent_header[-1];
+        $MathJax_sent_header[-1]=1;
+        return
+          '<script type="text/javascript" src="/adm/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>'."\n";
+    }
+}
+
+
 sub jsMath_converted {
     my $texstring=shift;
     my $tag='span';
@@ -308,6 +366,11 @@ sub init_math_support {
 	($inherit_jsmath && &jsMath_state(-2))) {
 	return &Apache::lontexconvert::jsMath_header();
     }
+    &Apache::lontexconvert::MathJax_push();
+    if (lc(&tex_engine()) eq 'mathjax') { # ||
+        #($inherit_jsmath && &jsMath_state(-2))) {
+        return &Apache::lontexconvert::MathJax_header();
+    }
     return;
 }
 
@@ -368,6 +431,8 @@ sub converted {
 	return &tth_converted($string);
     } elsif ($mode =~ /jsmath/i) {
 	return &jsMath_converted($string);
+    } elsif ($mode =~ /mathjax/i) {
+        return &MathJax_converted($string);
     } elsif ($mode =~ /mimetex/i) {
 	return &mimetex_converted($string);
     } elsif ($mode =~ /raw/i) {
@@ -447,7 +512,7 @@ sub msgtexconverted {
     foreach my $fragment (split(/(?:\&lt\;|\<)\/*algebra\s*(?:\&gt\;|\>)/i,
 				$message)) {
 	if ($tex) {
-        my $algebra = &algebra($fragment, 'web', undef, undef, undef, undef, 'tth');
+        my $algebra = &algebra($fragment, 'web', undef, undef, undef, 'tth');
 	    if ($email) {
 		$outmessage.='</pre><tt>'.$algebra.'</tt><pre>';
 		$tex=0;
@@ -532,6 +597,8 @@ sub postprocess_algebra {
     $string =~s/\\lim\\left\((.+?),(.+?),(.+?)\\right\)/\\lim_{$2\\to $3}$1/gs;
     return $string;
 }
+
+
 1;
 __END__
 
@@ -576,6 +643,9 @@ Header
 
 =item jsMath_converted()
 
+=item MathJax_converted()
+        - Mimics the jsMath functionality
+
 =item tex_engine()