--- loncom/homework/chemresponse.pm	2008/12/23 18:51:44	1.86
+++ loncom/homework/chemresponse.pm	2015/03/09 16:30:46	1.97
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # chemical equation style response
 #
-# $Id: chemresponse.pm,v 1.86 2008/12/23 18:51:44 raeburn Exp $
+# $Id: chemresponse.pm,v 1.97 2015/03/09 16:30:46 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -68,29 +68,170 @@ sub chem_standard_order {
 
 sub separate_jme_window {
     my ($smile_input,$jme_input,$molecule,$options,$shown_text)=@_;
+    my $usejsme = 1;
+    if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {
+        if (exists($env{'course.'.$env{'request.course.id'}.'.usejsme'})) {
+            if ($env{'course.'.$env{'request.course.id'}.'.usejsme'} eq '0') {
+                $usejsme = 0;
+            }
+        } else {
+            my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+            if ($domdefs{'usejsme'} eq '0') {
+                $usejsme = 0;
+            }
+        }
+    } else {
+        my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+        if ($domdefs{'usejsme'} eq '0') {
+            $usejsme = 0;
+        }
+    }
+    if ($usejsme) {
+        if ($env{'browser.type'} eq 'safari') {
+            unless ($env{'browser.mobile'}) {
+                if ($env{'browser.version'} < 534) {
+                    $usejsme = 0;
+                }
+            }
+        } elsif ($env{'browser.type'} eq 'mozilla') {
+            if ($env{'browser.version'} < 5) {
+                $usejsme = 0;
+            } elsif ($env{'browser.info'} =~ /^firefox\-([\d\.]+)/) {
+                my $firefox = $1;
+                if ($firefox < 12) {
+                    $usejsme = 0;
+                }
+            }
+        } elsif ($env{'browser.type'} eq 'explorer') {
+            if ($env{'browser.version'} < 7) {
+                $usejsme = 0;
+            }
+        } elsif ($env{'browser.type'} eq 'opera') {
+            if ($env{'browser.version'} < 15) {
+                $usejsme = 0;
+            }
+        }
+    } else {
+        if ($env{'browser.mobile'}) {
+            $usejsme = 1;
+        }
+    }
+    my $linkstyle = 'display:none';
+    my $creditstyle = 'display:inline';
+    if ($env{'browser.type'} eq 'explorer') {
+        if (($env{'browser.os'} eq 'win') && ($env{'browser.version'} < 9)) {
+            $linkstyle = 'display:inline';
+            $creditstyle = 'display:none';
+        }
+    }
     my $smilesection;
     if (defined($smile_input)) {
+        my $smiles;
+        if ($usejsme) {
+            $smiles = 'document.JME.smiles()'; 
+        } else {
+            $smiles = 'document.applets.JME.smiles()';
+        }
 	$smilesection=<<SMILESECTION;
-        smiles = document.applets.JME.smiles();
-	opener.document.lonhomework.$smile_input.value = smiles;
+	opener.document.lonhomework.$smile_input.value = $smiles;
 SMILESECTION
     }
     my $jmesection;
+    my $jmefile;
     if (defined($jme_input)) {
+        if ($usejsme) {
+            $jmefile = 'document.JME.jmeFile()';
+        } else {
+            $jmefile = 'document.applets.JME.jmeFile()';
+        }
 	$jmesection=<<JMESECTION;
-	jmeFile = document.applets.JME.jmeFile();
-	opener.document.lonhomework.$jme_input.value = jmeFile;
+	opener.document.lonhomework.$jme_input.value = $jmefile;
 JMESECTION
     }
 
-    if ($molecule) { $molecule='<param name="jme" value="'.$molecule.'" />'; }
+    if ($molecule) {
+        if ($usejsme) {
+            $molecule = 'document.JME.readMolecule("'.$molecule.'")';
+        } else {
+            $molecule='<param name="jme" value="'.$molecule.'" />';
+        }
+    }
     my $insert_answer;
     if ($shown_text eq '') { 
 	$insert_answer=
-	    '<input type="button" name="submit" value="Insert Answer" onclick="javascript:submitSmiles();" />';
+	    '<input type="button" name="submit" value="'.&mt('Insert Answer').'" onclick="javascript:submitSmiles();" /><br />';
+    }
+
+   
+
+    my ($jsme_js,$js,$buttonstyle,$viewportjs,$resizejs);
+    if ($usejsme) {
+        $buttonstyle = 'display:none';
+        $resizejs =<<RESIZEJS;
+<script type="text/javascript">
+function callResize() {
+    var timer;
+    clearTimeout(timer);
+    timer=setTimeout('resize_jsme()',100);
+}
+
+window.onresize = callResize;
+
+function resize_jsme() {
+    init_geometry();
+    var vph = Geometry.getViewportHeight();
+    var vpw = Geometry.getViewportWidth();
+    var lowerdivheight = document.getElementById('JMEbuttons').offsetHeight;
+    var formheight = document.getElementById('JMEform').offsetHeight;
+    var freevspace = vph-(lowerdivheight+50);
+    var freehspace = vpw-20;
+    if (typeof jsmeApplet !== 'undefined') {
+        jsmeApplet.setSize(freehspace,freevspace);
+    }
+}
+</script>
+RESIZEJS
+        $resizejs = &Apache::loncommon::js_ready($resizejs);
+        $jsme_js = '
+<script type="text/javascript" language="javascript" src="/adm/jsme/jsme.nocache.js"></script>'."\n";
+        $js =<<CHEMJS;
+<script type="text/javascript">
+function jsmeOnLoad() {
+    document.getElementById('JMErefresh').style.display="none";
+    document.getElementById('JMEcredits').style.display="inline";
+    jsmeApplet = new JSApplet.JSME("jme", "420px", "330px");
+    document.JME = jsmeApplet;
+    $molecule;
+    document.getElementById('JMEbuttons').style.display="block";
+    callResize();
+}
+
+function submitSmiles() {
+    jmeFile = document.JME.jmeFile();
+    if (jmeFile == "") {
+        alert("Nothing to submit");
+    } else {
+        $jmesection
+        $smilesection
+        window.close();
     }
+}
+function openHelpWindow() {
+    window.open("http://peter-ertl.com/jsme/2013_03/help.html","","scrollbars=yes,resizable=yes,width=500,height=600");
+}
 
-    my $js = <<CHEMJS;
+</script>
+
+CHEMJS
+
+        $viewportjs = &Apache::loncommon::viewport_geometry_js();
+        $viewportjs = '<script type="text/javascript">'."\n".
+                      $viewportjs."\n".
+                      '</script>';
+
+    } else {
+        $buttonstyle = 'display:block';
+        $js =<<CHEMJS; 
 <script type="text/javascript">
 function submitSmiles() {
     jmeFile = document.applets.JME.jmeFile();
@@ -108,24 +249,41 @@ function openHelpWindow() {
 function substituent(r) {document.applets.JME.setSubstituent(r);}
 </script>
 CHEMJS
+    }
 
     my $start_page = 
-        &Apache::loncommon::start_page('Molecule Editor',undef,
+        &Apache::loncommon::start_page('Molecule Editor',$viewportjs,
 				       {'only_body' => 1,
 					'js_ready'  => 1,
 					'bgcolor'   => '#FFFFFF',});
     my $end_page =
  	&Apache::loncommon::end_page({'js_ready' => 1,});
-	
-    my $body=<<CHEMPAGE;
-$js
+    my $java_not_enabled=&Apache::lonhtmlcommon::java_not_enabled();
+    my %lt = &Apache::lonlocal::texthash(
+        'seltext' => 'Select substituent...',
+        'close'   => 'Close',
+        'help'    => 'Help',
+       );
+    my $body = "
+$jsme_js
+$js".'
 <center>
-<form>
+<form action="" id="JMEform">
+';
+    if ($usejsme) {
+        $body.= <<"ENDCHEM";
+<div id="jme">
+<div id="JMEcredits" style="$creditstyle">
+<span style="font-size:small; font-family:arial,sans-serif;"><a href="http://peter-ertl.com/jsme/">JSME Molecular Editor</a> courtesy of Peter Ertl (Novartis) and Bruno Bienfait</span></div>
+</div>
+ENDCHEM
+    } else {
+        $body.=<<CHEMPAGE;
   <table width="440"><tr>
     <td></td>
     <td align="right">
       <select onchange="javascript:substituent(options[selectedIndex].text)">
-        <option>Select substituent</option>
+        <option>$lt{'seltext'}</option>
         <option>-C(=O)OH</option>
         <option>-C(=O)OMe</option>
         <option>-OC(=O)Me</option>
@@ -143,17 +301,24 @@ $js
     </td></tr>
   </table>
 <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="440" height="390" mayscript>
-You have to enable Java and JavaScript on your machine.
+$java_not_enabled
 $molecule
 <param name="options" value="$options" />
-</applet><br />
-<font face="arial,helvetica,sans-serif" size="-1"><a href="http://www.molinspiration.com/jme/index.html">JME Editor</a> courtesy of Peter Ertl, Novartis</font>
+</applet>
 <br />
+<font face="arial,helvetica,sans-serif" size="-1"><a href="http://www.molinspiration.com/jme/index.html">JME Editor</a> courtesy of Peter Ertl, Novartis</font>
+CHEMPAGE
+    }
+    $body .= <<CHEMPAGE;
+<div id="JMEbuttons" style="$buttonstyle">
 $insert_answer
-<br />
-<input type="button" value="  Close  " onclick = "javascript:window.close()" />
+<input type="button" value="$lt{'close'}" onclick="javascript:window.close()" />
 &nbsp;&nbsp;
-<input type="button" value="  Help  " onclick = "javascript:openHelpWindow()" />
+<input type="button" value="$lt{'help'}" onclick="javascript:openHelpWindow()" />
+</div>
+<div id="JMErefresh" style="$linkstyle">
+<a href="javascript:location.reload();">Display Molecule Editor</a>
+</div> 
 </form>
 </center>
 CHEMPAGE
@@ -164,25 +329,28 @@ CHEMPAGE
     my $display=&mt('Draw Molecule');
     if (defined($shown_text)) { $display=&mt($shown_text); }
     my $iconpath=$Apache::lonnet::perlvar{'lonIconsURL'};
-    my $function = 
-	'LONCAPA_draw_molecule_'.&Apache::lonhtmlcommon::get_uniq_name();
+    my $function =
+	'LONCAPA_draw_molecule_'.&get_uniq_name();
     my $result=<<CHEMINPUT;
 <script type="text/javascript">
     function $function() {
 	editor=window.open($nothing,'jmeedit','width=500,height=500,menubar=no,scrollbars=no,resizable=yes');
-	editor.$docopen;
-	editor.document.write('$start_page $body $end_page');
-	editor.document.close();
-	editor.focus();
+        if (editor) {
+	    editor.$docopen;
+	    editor.document.write('$start_page $body $resizejs $end_page');
+	    editor.document.close();
+	    editor.focus();
+        }
     }
 </script>
 CHEMINPUT
+    my $jscall = "javascript:$function();void(0);";
     if ($shown_text eq '') {
-        $result .=<<PENCIL; 
-<a href="javascript:$function();void(0);"><img class="stift" src='$iconpath/stift.gif' alt='$display' title='$display' /></a>
+        $result .=<<PENCIL;
+<a href="$jscall"><img class="stift" src="$iconpath/stift.gif" alt="$display" title="$display" /></a>
 PENCIL
     } else {
-        $result .= '<input type="button" value="'.&mt($shown_text).'" onclick="javascript:'.$function.'();void(0);" />';
+        $result .= '<input type="button" value="'.&mt($shown_text).'" onclick="$jscall" />';
     }
     return $result;
 }
@@ -304,9 +472,17 @@ sub end_organicresponse {
 		    $ad='INCORRECT';
 		}
 	    }
-	    if ($ad && $Apache::lonhomework::type eq 'survey') {
-		$ad='SUBMITTED';
-	    }
+            if ($ad) {
+	        if ($Apache::lonhomework::type eq 'survey') {
+		    $ad='SUBMITTED';
+                } elsif ($Apache::lonhomework::type eq 'surveycred') {
+                    $ad='SUBMITTED_CREDIT';
+                } elsif ($Apache::lonhomework::type eq 'anonsurvey') {
+                    $ad='ANONYMOUS';
+                } elsif ($Apache::lonhomework::type eq 'anonsurveycred') {
+                    $ad='ANONYMOUS_CREDIT';
+                }
+            }
 	    &Apache::response::handle_previous(\%previous,$ad);
 	    $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
 	    $Apache::lonhomework::results{"resource.$partid.$id.molecule"}=$env{"form.MOLECULE_$id"};
@@ -329,8 +505,8 @@ sub end_organicresponse {
 
     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || 
 	$target eq 'tex' || $target eq 'analyze') {
-	&Apache::lonxml::increment_counter(&Apache::response::repetition(), 
-					   "$partid.$id"); # part.response
+        my $repetition = &Apache::response::repetition();
+	&Apache::lonxml::increment_counter($repetition,"$partid.$id"); # part.response
 	if ($target eq 'analyze') {
             $Apache::lonhomework::analyze{"$partid.$id.type"} = 'organicresponse';
             push (@{ $Apache::lonhomework::analyze{"parts"} },"$partid.$id");
@@ -369,7 +545,7 @@ sub end_organicresponse {
 
 sub format_prior_answer_organic {
     my ($mode,$answer,$other_data) = @_;
-    my $result=&mt('Smile representation: "[_1]"','<tt>'.$answer.'</tt>');
+    my $result=&mt('Smile representation: [_1]','"<tt>'.$answer.'</tt>"');
     my $jme=$other_data->[0];
     $result.=&jme_img($jme,$answer,400);
     return $result;
@@ -409,7 +585,8 @@ sub start_organicstructure {
 	$id=&escape($id);
 	&Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id");
 	if ($options =~ /border/) { $result.= '\fbox{'; }
-	$result .= '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}';
+	$result .= '\graphicspath{{'.LONCAPA::tempdir().
+	    '}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}';
 	if ($options =~ /border/) { $result.= '} '; }
     } elsif ($target eq 'edit') {
 	$result .=&Apache::edit::tag_start($target,$token);
@@ -558,9 +735,17 @@ sub end_reactionresponse {
 		    $ad='INCORRECT';
 		}
 	    }
-	    if ($ad && $Apache::lonhomework::type eq 'survey') {
-		$ad='SUBMITTED';
-	    }
+            if ($ad) {
+                if ($Apache::lonhomework::type eq 'survey') {
+		    $ad='SUBMITTED';
+	        } elsif ($ad && $Apache::lonhomework::type eq 'surveycred') {
+                    $ad='SUBMITTED_CREDIT';
+                } elsif ($ad && $Apache::lonhomework::type eq 'anonsurvey') {
+                    $ad='ANONYMOUS';
+                } elsif ($ad && $Apache::lonhomework::type eq 'anonsurveycred') {
+                    $ad='ANONYMOUS_CREDIT';
+                }
+            }
 	    &Apache::response::handle_previous(\%previous,$ad);
 	    $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
 	}
@@ -582,7 +767,8 @@ sub end_reactionresponse {
 
     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || 
 	$target eq 'tex' || $target eq 'analyze') {
-	&Apache::lonxml::increment_counter(&Apache::response::repetition(), "$partid.$id");
+	my $repetition = &Apache::response::repetition();
+        &Apache::lonxml::increment_counter($repetition,"$partid.$id");
         if ($target eq 'analyze') {
             $Apache::lonhomework::analyze{"$partid.$id.type"} = 'reactionresponse';
             push (@{ $Apache::lonhomework::analyze{"parts"} },"$partid.$id");
@@ -626,5 +812,11 @@ sub end_chem {
     return $result;
 }
 
+my $uniq=0;
+sub get_uniq_name {
+    $uniq++;
+    return 'uniquename'.$uniq;
+}
+
 1;
 __END__