Diff for /loncom/homework/chemresponse.pm between versions 1.3 and 1.7

version 1.3, 2003/05/05 19:27:08 version 1.7, 2003/06/30 20:41:12
Line 32  use Apache::lonxml; Line 32  use Apache::lonxml;
 use Apache::lonnet;  use Apache::lonnet;
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register('Apache::chemresponse',('chemresponse','chemstructure'));      &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse'));
 }  }
   
 sub seperate_jme_window {  sub seperate_jme_window {
     my ($smile_input,$jme_input,$molecule)=@_;      my ($smile_input,$jme_input,$molecule,$options)=@_;
     my $smilesection;      my $smilesection;
     if (defined($smile_input)) {      if (defined($smile_input)) {
  $smilesection=<<SMILESECTION;   $smilesection=<<SMILESECTION;
Line 76  function openHelpWindow() { Line 76  function openHelpWindow() {
 <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="97%" height="78%">  <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="97%" height="78%">
 You have to enable Java and JavaScript on your machine.  You have to enable Java and JavaScript on your machine.
 <param name="jme" value="$molecule" />  <param name="jme" value="$molecule" />
   <param name="options" value="$options" />
 </applet><br />  </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>  <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>
 <form>  <form>
Line 97  CHEMINPUT Line 98  CHEMINPUT
     return $result;      return $result;
 }  }
   
 sub start_chemresponse {  sub start_organicresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     my $partid = $Apache::inputtags::part;      my $partid = $Apache::inputtags::part;
Line 111  sub start_chemresponse { Line 112  sub start_chemresponse {
     $molecule=&Apache::lonxml::get_param('molecule',$parstack,      $molecule=&Apache::lonxml::get_param('molecule',$parstack,
  $safeeval);   $safeeval);
  }   }
  $result=&seperate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule);   my $multipart=&Apache::lonxml::get_param('multipart',$parstack,
    $safeeval);
    if ($multipart eq 'yes') {
       $multipart = 'multipart';
    } else {
       $multipart ='';
           }
    $result=&seperate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule,$multipart);
  $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />';   $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />';
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .=&Apache::edit::tag_start($target,$token);   $result .=&Apache::edit::tag_start($target,$token);
  $result .=&Apache::edit::text_arg('Starting Molecule:','molecule',   $result .='<nobr>'.
   $token,40);      &Apache::edit::text_arg('Starting Molecule:','molecule',
       $token,40);
  my $molecule=&Apache::lonxml::get_param('molecule',$parstack,   my $molecule=&Apache::lonxml::get_param('molecule',$parstack,
  $safeeval);   $safeeval);
  $result .=&seperate_jme_window(undef,   $result .=&seperate_jme_window(undef,
       &Apache::edit::html_element_name('molecule'),        &Apache::edit::html_element_name('molecule'),
       $molecule);        $molecule,'multipart');
  $result .='<br />';   $result .='</nobr><br /><nobr>';
  $result .=&Apache::edit::text_arg('Correct Answer:','answer',   $result .=&Apache::edit::text_arg('Correct Answer:','answer',
   $token,40);    $token,40);
  $result .=&Apache::edit::hidden_arg('jmeanswer',$token);   $result .=&Apache::edit::hidden_arg('jmeanswer',$token);
Line 131  sub start_chemresponse { Line 140  sub start_chemresponse {
  $result .=&seperate_jme_window(   $result .=&seperate_jme_window(
                       &Apache::edit::html_element_name('answer'),                        &Apache::edit::html_element_name('answer'),
                       &Apache::edit::html_element_name('jmeanswer'),                        &Apache::edit::html_element_name('jmeanswer'),
       $jmeanswer);        $jmeanswer,'multipart');
    $result .='</nobr>'.
       &Apache::edit::select_arg('Multipart:','multipart',
         ['no','yes'],$token);
  $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();   $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $constructtag=&Apache::edit::get_new_args($token,$parstack,   my $constructtag=&Apache::edit::get_new_args($token,$parstack,
      $safeeval,'molecule',       $safeeval,'molecule',
      'answer','jmeanswer');       'answer','jmeanswer',
        'multipart');
  if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }   if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
     }      }
     return $result;      return $result;
 }  }
   
 sub end_chemresponse {  sub end_organicresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     if ($target eq 'grade' && defined($ENV{'form.submitted'})) {      if ($target eq 'grade' && defined($ENV{'form.submitted'})) {
Line 172  sub end_chemresponse { Line 185  sub end_chemresponse {
     return $result;      return $result;
 }  }
   
 sub start_chemstructure {  sub start_organicstructure {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     if ($target eq 'web') {      if ($target eq 'web') {
Line 194  CHEMOUTPUT Line 207  CHEMOUTPUT
  $safeeval);   $safeeval);
  $result .=&seperate_jme_window(undef,   $result .=&seperate_jme_window(undef,
       &Apache::edit::html_element_name('molecule'),        &Apache::edit::html_element_name('molecule'),
       $molecule);        $molecule,'multipart');
  $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();   $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $constructtag=&Apache::edit::get_new_args($token,$parstack,   my $constructtag=&Apache::edit::get_new_args($token,$parstack,
Line 205  CHEMOUTPUT Line 218  CHEMOUTPUT
     return $result;      return $result;
 }  }
   
 sub end_chemstructure {  sub end_organicstructure {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     if ($target eq "edit") {      if ($target eq "edit") {
Line 214  sub end_chemstructure { Line 227  sub end_chemstructure {
     return $result;      return $result;
 }  }
   
   sub reaction_javascript {
       my $rightarrow;
       if ($ENV{'browser.unicode'}) {
    $rightarrow=" &#8594; "
       } else {
    $rightarrow=" <font face=symbol>&reg;</font> ";
       }
       my $result=<<REACTIONJAVASCRIPT;
       <script language="JavaScript">
   
   var level;
   var reactants;
   var products;
   
   
   function parse_reaction(string) {
     var reaction_array = string.split('->');
     var i;
     reactants = new Array(0);
     products = new Array(0);
   
     if (reaction_array.length > 0)
       reactants = reaction_array[0].split(' +');
     if (reaction_array.length > 1)
       products = reaction_array[1].split(' +');
   }
   
   function to_capa(string) {
     var reaction = "";
     var i;
   
     parse_reaction(string);
   
     for (i = 0; i < reactants.length; i++)
       reactants[i] = capa_component(reactants[i]);
     for (i = 0; i < products.length; i++)
       products[i] = capa_component(products[i]);
   
     reactants.sort();
     products.sort();
   
     for (i = 0; i < reactants.length-1; i++) {
       reaction += reactants[i];
       reaction += " + ";
     }
     if (i < reactants.length)
       reaction += reactants[i];
     if (products.length > 0) {
       reaction += " -> ";
       for (i = 0; i < products.length-1; i++) {
         reaction += products[i];
         reaction += " + ";
       }
       if (i < products.length)
         reaction += products[i];
     }
   
     return reaction;
   }
   
   function capa_component(string) {
     var reactant = "";
     var i = 0;
     level = 0;
   
     for (;string.substring(i,i+1) == ' ';i++)
       ;
     for (;isDigit(string.substring(i,i+1));i++)
       reactant += string.substring(i,i+1);
     for (;i < string.length;i++)
       reactant +=  capa_char(string.substring(i,i+1));
   
     return reactant;
   }
   
   function capa_char(chr) {
     if (level == 0) { // baseline
       if (chr == '^')
         level = 1;
       if (chr == ' ')
         return "";
       return chr;
     }
     if (level == 1) { // superscript
       if (isDigit(chr))
         return chr;
       level = 0;
       return chr;
     }
   }
   
   function to_html(string) {
     var reaction = "";
     var i;
   
     parse_reaction(string);
     for (i = 0; i < reactants.length-1; i++) {
       reaction += html_component(reactants[i]);
       reaction += " + ";
     }
     if (i < reactants.length)
       reaction += html_component(reactants[i]);
   
     if (products.length > 0) {
       reaction += " $rightarrow ";
       for (i = 0; i < products.length-1; i++) {
         reaction += html_component(products[i]);
         reaction += " + ";
       }
       if (i < products.length)
         reaction += html_component(products[i]);
     }
   
     return reaction;
   }
   
   function html_component(string) {
     var reactant = "";
     var i = 0;
     level = 0;
   
     for (;string.substring(i,i+1) == ' ';i++)
       ;
     for (;isDigit(string.substring(i,i+1));i++)
       reactant += string.substring(i,i+1);
     for (;i < string.length;i++)
       reactant +=  html_char(string.substring(i,i+1));
   
     return reactant;
   }
   
   function html_char(chr) {
     if (level == 0) { // baseline
       if (isDigit(chr))
         return chr.sub();
       if (chr == '^') {
         level = 1;
         return "";
       }
       if (chr == '+') // baseline or superscript
         return "?";
       if (chr == ' ')
         return "";
       return chr;
     }
     if (level == 1) { // superscript
       if (isDigit(chr))
         return chr.sup();
       if (chr == '+' || chr == '-') {
         level = 0;
         return chr.sup();
       }
       if (chr == ' ') {
         level = 0;
         return "";
       }
       level = 0;
       return chr;
     }
   }
   
   function isDigit(string) {
     if (string >= '0' && string <='9')
       return 1;
     else
       return 0;
   }
   
   function openHelpWindow() {
     window.open("reaction_help.html","","scrollbars=yes,resizable=yes,width=550,height=600")
   }
   
   function submitReaction() {
     reaction = to_capa(document.form.text.value);
     if (reaction == "") {
       alert("Nothing to submit");
     }
     else {
       name = "INPUT" + ((problem < 10) ? "0" : "") + problem;
       i = 0;
       while (parent.opener.document.CAPA.elements[i].name != name)
         i++;
       parent.opener.document.CAPA.elements[i].value = reaction;
       parent.opener.document.CAPA.submit();
     }
   }
   </script>
   REACTIONJAVASCRIPT
       return $result;
   }
   
   sub start_reactionresponse {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $result;
       my $id = &Apache::response::start_response($parstack,$safeeval);
       if ($target eq 'web') {
    $result.=<<EDITREACTION;
   <input type='button' value='Edit Reaction' onClick="javascript:editor=window.open('/res/adm/reactionresponse/reaction_window.html','','width=500,height=270,scrollbars=no,resizable=yes'); document.cookie='problem=$id';" />
   EDITREACTION
   
   # $result.=&reaction_javascript();
   # $result.='<iframe name="REACTION_'.$id.'" width="200" height="100" src="/adm/jme/reaction_viewer.html"></iframe>';
   # $result.='<input type="button" value="Check" onClick = "javascript:newWindow=open(\'\',\'new_W\',\'width=500,height=200,scrollbars=1\');newWindow.document.open(\'text/html\',\'replace\');newWindow.document.writeln(\'<center><br />\'+to_html(document.lonhomework.HWVAL_'.$id.'.value)+\'</center><input type=&quot;button&quot; value=&quot;  Close  &quot; onClick = &quot;parent.window.close()&quot; />\');newWindow.document.close()" />'
       } elsif ($target eq "edit") {
       }
       return $result;
   }
   
   sub end_reactionresponse {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $result;
       if ($target eq "edit") {
    $result.= &Apache::edit::tag_end($target,$token,'');
       }
       &Apache::response::end_response;
       return $result;
   }
   
 1;  1;
 __END__  __END__

Removed from v.1.3  
changed lines
  Added in v.1.7


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