Annotation of loncom/homework/chemresponse.pm, revision 1.49

1.1       albertel    1: # The LearningOnline Network with CAPA
                      2: # chemical equation style response
                      3: #
1.49    ! albertel    4: # $Id: chemresponse.pm,v 1.48 2005/02/18 23:12:29 albertel Exp $
1.1       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: #
                     28: #
                     29: package Apache::chemresponse;
                     30: use strict;
                     31: use Apache::lonxml;
                     32: use Apache::lonnet;
                     33: 
                     34: BEGIN {
1.46      albertel   35:     &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse','chem'));
1.1       albertel   36: }
                     37: 
1.34      albertel   38: sub chem_standard_order {
                     39:     my ($reaction) = @_;
                     40:     my ($re,$pr) = split(/->|<=>/,$reaction);
                     41:     my @reactants = split(/\s\+/,$re);
                     42:     my @products =  split(/\s\+/,$pr);
                     43:     foreach my $substance (@reactants,@products) {
                     44: 	$substance =~ s/(\^\d*)\s+/$1_/g;         # protect superscript space
                     45: 	$substance =~ s/\s*//g;                   # strip whitespace
                     46: 	$substance =~ s/_/ /g;                    # restore superscript space
                     47:     }
                     48:     @reactants = sort @reactants;
                     49:     @products = sort @products;
                     50:     my $standard = '';
                     51:     foreach my $substance (@reactants) {
                     52: 	$standard .= $substance;
                     53: 	$standard .= ' + ';
                     54:     }
                     55:     $standard =~ s/ \+ $//;              # get rid of trailing plus sign
                     56:     $standard .= ' -> ';
                     57:     foreach my $substance (@products) {
                     58: 	$standard .= $substance;
                     59: 	$standard .= ' + ';
                     60:     }
                     61:     $standard =~ s/ \+ $//;              # get rid of trailing plus sign
                     62:     return $standard;
                     63: }
                     64: 
1.30      www        65: sub separate_jme_window {
1.6       albertel   66:     my ($smile_input,$jme_input,$molecule,$options)=@_;
1.2       albertel   67:     my $smilesection;
                     68:     if (defined($smile_input)) {
                     69: 	$smilesection=<<SMILESECTION;
1.21      albertel   70:         smiles = document.applets.JME.smiles();
1.2       albertel   71: 	opener.document.lonhomework.$smile_input.value = smiles;
                     72: SMILESECTION
                     73:     }
                     74:     my $jmesection;
                     75:     if (defined($jme_input)) {
                     76: 	$jmesection=<<JMESECTION;
                     77: 	jmeFile = document.applets.JME.jmeFile();
                     78: 	opener.document.lonhomework.$jme_input.value = jmeFile;
                     79: JMESECTION
                     80:     }
                     81: 
1.14      albertel   82:     if ($molecule) { $molecule='<param name="jme" value="'.$molecule.'" />'; }
1.1       albertel   83:     my $body=<<CHEMPAGE;
                     84: <html>
                     85: <head>
                     86: <title>Molecule Editor</title>
1.47      albertel   87: <script type="text/javascript">
1.1       albertel   88: function submitSmiles() {
1.21      albertel   89:     jmeFile = document.applets.JME.jmeFile();
                     90:     if (jmeFile == "") {
1.1       albertel   91: 	alert("Nothing to submit");
                     92:     } else {
1.21      albertel   93:         $jmesection
1.2       albertel   94:         $smilesection
1.1       albertel   95: 	window.close();
                     96:     }
                     97: }
                     98: function openHelpWindow() {
1.2       albertel   99:     window.open("/adm/jme/jme_help.html","","scrollbars=yes,resizable=yes,width=500,height=600");
1.1       albertel  100: }
                    101: </script>
                    102: </head>
                    103: <body bgcolor="#ffffff">
                    104: <center>
1.27      albertel  105: <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="440" height="390">
1.1       albertel  106: You have to enable Java and JavaScript on your machine.
1.12      albertel  107: $molecule
1.6       albertel  108: <param name="options" value="$options" />
1.1       albertel  109: </applet><br />
1.49    ! albertel  110: <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>
1.1       albertel  111: <form>
1.47      albertel  112: <input type="button" name="submit" value="Insert Answer" onclick = "submitSmiles();" />
1.1       albertel  113: <br />
1.47      albertel  114: <input type="button" value="  Close  " onclick = "window.close()" />
1.1       albertel  115: &nbsp;&nbsp;
1.47      albertel  116: <input type="button" value="  Help  " onclick = "openHelpWindow()" />
1.1       albertel  117: </form>
                    118: </center>
                    119: </body>
                    120: </html>
                    121: CHEMPAGE
1.32      albertel  122:     $body=&HTML::Entities::encode($body,'<>&"');
1.1       albertel  123:     $body=~s/\n/ /g;
1.41      www       124:     my $docopen=&Apache::lonhtmlcommon::javascript_docopen();
1.1       albertel  125:     my $result=<<CHEMINPUT;
1.49    ! albertel  126: <input type="button" value="Draw Molecule" onclick="javascript:editor=window.open('/rat/adm/empty.html','jmeedit','width=500,height=500,menubar=yes,scrollbars=no,resizable=yes');editor.$docopen;editor.document.write('$body');editor.document.close();editor.focus()" />
1.1       albertel  127: CHEMINPUT
                    128:     return $result;
                    129: }
                    130: 
1.6       albertel  131: sub start_organicresponse {
1.1       albertel  132:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    133:     my $result;
                    134:     my $partid = $Apache::inputtags::part;
                    135:     my $id = &Apache::response::start_response($parstack,$safeeval);
                    136:     if ($target eq 'meta') {
1.28      albertel  137: 	$result=&Apache::response::meta_package_write('organicresponse');
1.1       albertel  138:     } elsif ($target eq 'web') {
1.44      albertel  139: 	if (  &Apache::response::show_answer() ) {
                    140: 	    my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack,
                    141: 						     $safeeval);
                    142: 	    my $options=&Apache::lonxml::get_param('options',$parstack,
                    143: 						   $safeeval);
                    144: 	    my $width=&Apache::lonxml::get_param('width',$parstack,
                    145: 						   $safeeval);
                    146: 	    my $id=&Apache::loncommon::get_cgi_id();
                    147: 	    $result="<img src='/cgi-bin/convertjme.pl?$id'";
                    148: 	    if ($options =~ /border/) { $result.= ' border="1"'; }
                    149: 	    $result.=' />';
                    150: 	    &Apache::lonnet::appenv('cgi.'.$id.'.JME'   =>
                    151: 				           &Apache::lonnet::escape($jmeanswer),
                    152: 				    'cgi.'.$id.'.PNG'   => 1,
                    153: 				    'cgi.'.$id.'.WIDTH' => $width);
1.1       albertel  154: 	} else {
1.44      albertel  155: 	    my $molecule;
                    156: 	    if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) {
                    157: 		$molecule=$Apache::lonhomework::history{"resource.$partid.$id.molecule"};
                    158: 	    } else {
                    159: 		$molecule=&Apache::lonxml::get_param('molecule',$parstack,
                    160: 						     $safeeval);
                    161: 	    }
                    162: 	    my $options=&Apache::lonxml::get_param('options',$parstack,
                    163: 						   $safeeval);
                    164: 	    $result=&separate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule,$options);
                    165: 	    $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />';
1.1       albertel  166: 	}
1.2       albertel  167:     } elsif ($target eq 'edit') {
                    168: 	$result .=&Apache::edit::tag_start($target,$token);
1.12      albertel  169: 	my $options=&Apache::lonxml::get_param('options',$parstack,
                    170: 					       $safeeval);
                    171: 	if ($options !~ /multipart/) { $options.=',multipart'; }
1.7       albertel  172: 	$result .='<nobr>'.
                    173: 	    &Apache::edit::text_arg('Starting Molecule:','molecule',
                    174: 				    $token,40);
1.2       albertel  175: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,
                    176: 						$safeeval);
1.30      www       177: 	$result .=&separate_jme_window(undef,
1.2       albertel  178: 		      &Apache::edit::html_element_name('molecule'),
1.12      albertel  179: 		      $molecule,$options);
1.7       albertel  180: 	$result .='</nobr><br /><nobr>';
1.2       albertel  181: 	$result .=&Apache::edit::text_arg('Correct Answer:','answer',
                    182: 					  $token,40);
                    183: 	$result .=&Apache::edit::hidden_arg('jmeanswer',$token);
                    184: 	my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack,
                    185: 						 $safeeval);
1.30      www       186: 	$result .=&separate_jme_window(
1.2       albertel  187:                       &Apache::edit::html_element_name('answer'),
                    188:                       &Apache::edit::html_element_name('jmeanswer'),
1.12      albertel  189: 		      $jmeanswer,$options);
                    190: 	$result .='</nobr><br />';
                    191: 	$result .=&Apache::edit::checked_arg('Options:','options',
1.29      www       192: 				    [ ['autoez','Auto E,Z stereochemistry'],
1.18      albertel  193: 				      ['multipart','Multipart Structures'],
1.12      albertel  194: 				      ['nostereo','No stereochemistry'],
                    195: 				      ['reaction','Is a reaction'],
1.18      albertel  196: 				      ['number','Able to number atoms'] ],
1.12      albertel  197: 					     ,$token);
1.44      albertel  198: 	$result .=&Apache::edit::text_arg('Width of correct answer image:',
                    199: 					  'width',$token,10);
1.2       albertel  200: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    201:     } elsif ($target eq 'modified') {
                    202: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    203: 						     $safeeval,'molecule',
1.6       albertel  204: 						     'answer','jmeanswer',
1.44      albertel  205: 						     'options','width');
1.2       albertel  206: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.1       albertel  207:     }
                    208:     return $result;
                    209: }
                    210: 
1.6       albertel  211: sub end_organicresponse {
1.1       albertel  212:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    213:     my $result;
1.45      albertel  214:     if ($target eq 'grade' && &Apache::response::submitted()) {
1.31      albertel  215: 	&Apache::response::setup_params($$tagstack[-1],$safeeval);
1.1       albertel  216: 	my $response = &Apache::response::getresponse();
                    217: 	if ( $response =~ /[^\s]/) {
                    218: 	    my $partid = $Apache::inputtags::part;
                    219: 	    my $id = $Apache::inputtags::response['-1'];
1.13      albertel  220: 	    my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
1.1       albertel  221: 	    my %previous = &Apache::response::check_for_previous($response,$partid,$id);
                    222: 	    $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
                    223: 	    my $ad;
1.13      albertel  224: 	    foreach my $answer (@answers) {
                    225: 		&Apache::lonxml::debug("submitted a $response for $answer<br \>\n");
                    226: 		if ($response eq $answer) {
                    227: 		    $ad='EXACT_ANS';
                    228: 		    last;
                    229: 		} else {
                    230: 		    $ad='INCORRECT';
                    231: 		}
1.1       albertel  232: 	    }
1.42      albertel  233: 	    if ($ad && $Apache::lonhomework::type eq 'survey') {
                    234: 		$ad='SUBMITTED';
                    235: 	    }
1.1       albertel  236: 	    &Apache::response::handle_previous(\%previous,$ad);
                    237: 	    $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
                    238: 	    $Apache::lonhomework::results{"resource.$partid.$id.molecule"}=$ENV{"form.MOLECULE_$id"};
                    239: 	}
1.2       albertel  240:     } elsif ($target eq "edit") {
                    241: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.15      albertel  242:     } elsif ($target eq 'answer') {
                    243: 	my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,
                    244: 						     $safeeval);
                    245: 	$result.=&Apache::response::answer_header('organicresponse');
                    246: 	foreach my $answer (@answers) {
                    247: 	    $result.=&Apache::response::answer_part('organicresponse',$answer);
                    248: 	}
                    249: 	$result.=&Apache::response::answer_footer('organicresponse');
1.1       albertel  250:     }
                    251:     &Apache::response::end_response;
                    252:     return $result;
                    253: }
                    254: 
1.6       albertel  255: sub start_organicstructure {
1.3       albertel  256:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    257:     my $result;
                    258:     if ($target eq 'web') {
                    259: 	my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval);
                    260: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);
1.12      albertel  261: 	my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);
1.23      albertel  262: 	my $id=&Apache::loncommon::get_cgi_id();
1.19      albertel  263: 	$result="<img src='/cgi-bin/convertjme.pl?$id'";
                    264: 	if ($options =~ /border/) { $result.= ' border="1"'; }
                    265: 	$result.=' />';
1.16      albertel  266: 	&Apache::lonnet::appenv(
                    267:             'cgi.'.$id.'.JME'   => &Apache::lonnet::escape($molecule),
1.17      albertel  268: 	    'cgi.'.$id.'.PNG' => 1,
1.16      albertel  269: 	    'cgi.'.$id.'.WIDTH' => $width );
1.17      albertel  270:     } elsif ($target eq 'tex') {
1.38      albertel  271: 	my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,undef,1);
1.17      albertel  272: 	if (!$texwidth) { $texwidth='90'; }
                    273: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);
                    274: 	my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);
                    275: 	my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}.
                    276: 	    '_'.time.'_'.$$.int(rand(1000)).'_organicstructure';
                    277: 	my $id=$filename;
                    278: 	&Apache::lonnet::appenv(
                    279: 		     'cgi.'.$id.'.JME'   => &Apache::lonnet::escape($molecule),
                    280: 		     'cgi.'.$id.'.PS' => 1,
                    281: 		     'cgi.'.$id.'.WIDTH' => $texwidth );
                    282: 	$id=&Apache::lonnet::escape($id);
                    283: 	&Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id");
1.20      albertel  284: 	if ($options =~ /border/) { $result.= '\fbox{'; }
                    285: 	$result .= '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}';
                    286: 	if ($options =~ /border/) { $result.= '} '; }
1.3       albertel  287:     } elsif ($target eq 'edit') {
                    288: 	$result .=&Apache::edit::tag_start($target,$token);
1.22      albertel  289: 	$result .=&Apache::edit::text_arg('Width (pixels):','width',$token,5);
                    290: 	$result .=&Apache::edit::text_arg('TeXwidth (mm):','texwidth',$token,5);
1.12      albertel  291: 	$result .='<nobr>';
1.3       albertel  292: 	$result .=&Apache::edit::text_arg('Molecule:','molecule',$token,40);
                    293: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,
                    294: 						$safeeval);
1.12      albertel  295: 	my $options=&Apache::lonxml::get_param('options',$parstack,
                    296: 					       $safeeval);
                    297: 	if ($options !~ /reaction/) {
                    298: 	    $options.= ',multipart,number';
                    299: 	}
                    300: 						   
1.30      www       301: 	$result .=&separate_jme_window(undef,
1.12      albertel  302: 				 &Apache::edit::html_element_name('molecule'),
                    303: 				       $molecule,$options);
                    304: 	$result.="</nobr><br />";
                    305: 	$result .=&Apache::edit::checked_arg('Options:','options',
1.18      albertel  306: 					     [ ['reaction','Is a reaction'],
1.12      albertel  307: 					       ['border','Draw a border'] ],
                    308: 					     $token);
1.24      albertel  309: 	$result .=&Apache::edit::end_row();
1.3       albertel  310:     } elsif ($target eq 'modified') {
                    311: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    312: 						     $safeeval,'molecule',
1.22      albertel  313: 						     'width','texwidth',
                    314: 						     'options');
1.3       albertel  315: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                    316:     }
                    317:     return $result;
1.1       albertel  318: }
                    319: 
1.6       albertel  320: sub end_organicstructure {
1.3       albertel  321:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    322:     my $result;
                    323:     if ($target eq "edit") {
                    324: 	$result.= &Apache::edit::tag_end($target,$token,'');
                    325:     }
1.4       albertel  326:     return $result;
                    327: }
                    328: 
1.9       albertel  329: sub edit_reaction_button {
1.11      albertel  330:     my ($id,$field,$reaction)=@_;
1.10      albertel  331:     my $id_es=&Apache::lonnet::escape($id);
                    332:     my $field_es=&Apache::lonnet::escape($field);
1.11      albertel  333:     my $reaction_es=&Apache::lonnet::escape($reaction);
1.41      www       334:     my $docopen=&Apache::lonhtmlcommon::javascript_docopen();
1.9       albertel  335:     my $result=<<EDITREACTION;
1.10      albertel  336: <script type="text/javascript">
1.47      albertel  337: // <!--
1.10      albertel  338:     function create_reaction_window_${id}_${field} () {
                    339: 	editor=window.open('','','width=500,height=270,scrollbars=no,resizable=yes');
1.41      www       340: 	editor.$docopen;
1.37      albertel  341: 	editor.document.writeln('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><html> <head><title>LON-CAPA Reaction Editor</title></head><frameset rows="30%,*" border="0">  <frame src="/res/adm/pages/reactionresponse/reaction_viewer.html?inhibitmenu=yes" name="viewer" scrolling="no" />  <frame src="/res/adm/pages/reactionresponse/reaction_editor.html?inhibitmenu=yes&reaction=$reaction_es&id=$id_es&field=$field_es" name="editor" scrolling="no" /> </frameset> </html>');
1.10      albertel  342:     }
1.47      albertel  343: // -->
1.10      albertel  344: </script>
1.47      albertel  345: <input type='button' value='Edit Answer' onclick="javascript:create_reaction_window_${id}_${field}();void(0);" />
1.9       albertel  346: EDITREACTION
                    347:     return $result;
                    348: }
                    349: 
1.4       albertel  350: sub start_reactionresponse {
                    351:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    352:     my $result;
                    353:     my $id = &Apache::response::start_response($parstack,$safeeval);
1.10      albertel  354:     if ($target eq 'meta') {
1.28      albertel  355: 	$result=&Apache::response::meta_package_write('reactionresponse');
1.10      albertel  356:     } elsif ($target eq 'web') {
1.11      albertel  357: 	my $partid = $Apache::inputtags::part;
                    358: 	my $id = $Apache::inputtags::response['-1'];
                    359: 	my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"};
1.35      albertel  360: 	if ($reaction eq '') {  $reaction=&Apache::lonxml::get_param('initial',$parstack,$safeeval); }
1.33      albertel  361: 	my $status=$Apache::inputtags::status['-1'];
                    362: 	if ($status eq 'CAN_ANSWER') {
                    363: 	    $result.=&edit_reaction_button($id,"HWVAL_$id",$reaction);
                    364: 	}
                    365: 	if (  &Apache::response::show_answer() ) {
                    366: 	    my $ans=&Apache::lonxml::get_param('answer',$parstack,$safeeval);
                    367: 	    $ans=~s/(\\|\')/\\$1/g;
                    368: 	    $Apache::inputtags::answertxt{$id}=&Apache::run::run("return &chemparse('$ans');",$safeeval);
                    369: 	}
1.4       albertel  370:     } elsif ($target eq "edit") {
1.9       albertel  371: 	$result .=&Apache::edit::tag_start($target,$token);
                    372: 	my $answer=&Apache::lonxml::get_param('answer',$parstack,
                    373: 						$safeeval);
1.10      albertel  374: 	$result .='<nobr>'.
                    375: 	    &Apache::edit::text_arg('Answer:','answer',$token,40);
                    376: 	$result .=&edit_reaction_button($id,&Apache::edit::html_element_name('answer'),$answer).'</nobr>';
1.35      albertel  377: 	my $initial=&Apache::lonxml::get_param('initial',$parstack,$safeeval);
                    378: 	$result.='<nobr>'.
1.43      albertel  379: 	    &Apache::edit::text_arg('Initial Reaction:','initial',$token,40);
1.35      albertel  380: 	$result .=&edit_reaction_button($id,&Apache::edit::html_element_name('initial'),$initial).'</nobr>';
1.10      albertel  381: 	
1.9       albertel  382: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1.10      albertel  383:     }  elsif ($target eq 'modified') {
                    384: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.35      albertel  385: 						     $safeeval,'answer',
                    386: 						     'initial');
1.10      albertel  387: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.4       albertel  388:     }
                    389:     return $result;
                    390: }
                    391: 
                    392: sub end_reactionresponse {
                    393:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    394:     my $result;
1.45      albertel  395:     if ($target eq 'grade' && &Apache::response::submitted()) {
1.31      albertel  396: 	&Apache::response::setup_params($$tagstack[-1],$safeeval);
1.10      albertel  397: 	my $response = &Apache::response::getresponse();
                    398: 	if ( $response =~ /[^\s]/) {
                    399: 	    my $partid = $Apache::inputtags::part;
                    400: 	    my $id = $Apache::inputtags::response['-1'];
1.15      albertel  401: 	    my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
1.10      albertel  402: 	    my %previous = &Apache::response::check_for_previous($response,$partid,$id);
                    403: 	    $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
                    404: 	    my $ad;
1.13      albertel  405: 	    foreach my $answer (@answers) {
                    406: 		&Apache::lonxml::debug("submitted a $response for $answer<br \>\n");
1.34      albertel  407: 		if (&chem_standard_order($response) eq 
                    408: 		    &chem_standard_order($answer)) {
1.13      albertel  409: 		    $ad='EXACT_ANS';
                    410: 		} else {
                    411: 		    $ad='INCORRECT';
                    412: 		}
1.10      albertel  413: 	    }
1.42      albertel  414: 	    if ($ad && $Apache::lonhomework::type eq 'survey') {
                    415: 		$ad='SUBMITTED';
                    416: 	    }
1.10      albertel  417: 	    &Apache::response::handle_previous(\%previous,$ad);
                    418: 	    $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
                    419: 	}
                    420:     }  elsif ($target eq "edit") {
1.4       albertel  421: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.15      albertel  422:     } elsif ($target eq 'answer') {
                    423: 	my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,
                    424: 						     $safeeval);
                    425: 	$result.=&Apache::response::answer_header('reactionresponse');
                    426: 	foreach my $answer (@answers) {
                    427: 	    $result.=&Apache::response::answer_part('reactionresponse',
                    428: 						    $answer);
                    429: 	}
                    430: 	$result.=&Apache::response::answer_footer('reactionresponse');
1.4       albertel  431:     }
                    432:     &Apache::response::end_response;
1.3       albertel  433:     return $result;
1.1       albertel  434: }
                    435: 
1.46      albertel  436: sub start_chem {
                    437:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
                    438:     my $result = '';
1.48      albertel  439:     my $inside = &Apache::lonxml::get_all_text_unbalanced("/chem",$parser);
1.46      albertel  440:     if ($target eq 'tex' || $target eq 'web') {
1.48      albertel  441: 	$inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
                    442: 	if (!$Apache::lonxml::default_homework_loaded) {
                    443: 	    &Apache::lonxml::default_homework_load($safeeval);
                    444: 	}
                    445: 	@Apache::scripttag::parser_env = @_;
                    446: 	$result=&Apache::run::run("return &chemparse(q\0$inside\0);",$safeeval);
1.46      albertel  447:     }    
                    448:     return $result;
                    449: }
                    450: 
                    451: sub end_chem {
                    452:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
                    453:     my $result = '';
                    454:     return $result;
                    455: }
                    456: 
1.1       albertel  457: 1;
                    458: __END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.