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

1.1       albertel    1: # The LearningOnline Network with CAPA
                      2: # chemical equation style response
                      3: #
1.77    ! raeburn     4: # $Id: chemresponse.pm,v 1.76 2008/02/01 22:05:45 raeburn 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;
1.55      albertel   33: use Apache::lonlocal;
1.66      www        34: use lib '/home/httpd/lib/perl/';
                     35: use LONCAPA;
                     36:  
1.1       albertel   37: 
                     38: BEGIN {
1.46      albertel   39:     &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse','chem'));
1.1       albertel   40: }
                     41: 
1.34      albertel   42: sub chem_standard_order {
                     43:     my ($reaction) = @_;
                     44:     my ($re,$pr) = split(/->|<=>/,$reaction);
                     45:     my @reactants = split(/\s\+/,$re);
                     46:     my @products =  split(/\s\+/,$pr);
                     47:     foreach my $substance (@reactants,@products) {
                     48: 	$substance =~ s/(\^\d*)\s+/$1_/g;         # protect superscript space
                     49: 	$substance =~ s/\s*//g;                   # strip whitespace
                     50: 	$substance =~ s/_/ /g;                    # restore superscript space
                     51:     }
                     52:     @reactants = sort @reactants;
                     53:     @products = sort @products;
                     54:     my $standard = '';
                     55:     foreach my $substance (@reactants) {
                     56: 	$standard .= $substance;
                     57: 	$standard .= ' + ';
                     58:     }
                     59:     $standard =~ s/ \+ $//;              # get rid of trailing plus sign
                     60:     $standard .= ' -> ';
                     61:     foreach my $substance (@products) {
                     62: 	$standard .= $substance;
                     63: 	$standard .= ' + ';
                     64:     }
                     65:     $standard =~ s/ \+ $//;              # get rid of trailing plus sign
                     66:     return $standard;
                     67: }
                     68: 
1.30      www        69: sub separate_jme_window {
1.55      albertel   70:     my ($smile_input,$jme_input,$molecule,$options,$shown_text)=@_;
1.2       albertel   71:     my $smilesection;
                     72:     if (defined($smile_input)) {
                     73: 	$smilesection=<<SMILESECTION;
1.21      albertel   74:         smiles = document.applets.JME.smiles();
1.2       albertel   75: 	opener.document.lonhomework.$smile_input.value = smiles;
                     76: SMILESECTION
                     77:     }
                     78:     my $jmesection;
                     79:     if (defined($jme_input)) {
                     80: 	$jmesection=<<JMESECTION;
                     81: 	jmeFile = document.applets.JME.jmeFile();
                     82: 	opener.document.lonhomework.$jme_input.value = jmeFile;
                     83: JMESECTION
                     84:     }
                     85: 
1.14      albertel   86:     if ($molecule) { $molecule='<param name="jme" value="'.$molecule.'" />'; }
1.57      albertel   87:     my $insert_answer;
1.59      albertel   88:     if ($shown_text eq '') { 
1.57      albertel   89: 	$insert_answer=
                     90: 	    '<input type="button" name="submit" value="Insert Answer" onclick="javascript:submitSmiles();" />';
                     91:     }
                     92: 
1.65      albertel   93:     my $js = <<CHEMJS;
1.47      albertel   94: <script type="text/javascript">
1.1       albertel   95: function submitSmiles() {
1.21      albertel   96:     jmeFile = document.applets.JME.jmeFile();
                     97:     if (jmeFile == "") {
1.1       albertel   98: 	alert("Nothing to submit");
                     99:     } else {
1.21      albertel  100:         $jmesection
1.2       albertel  101:         $smilesection
1.1       albertel  102: 	window.close();
                    103:     }
                    104: }
                    105: function openHelpWindow() {
1.2       albertel  106:     window.open("/adm/jme/jme_help.html","","scrollbars=yes,resizable=yes,width=500,height=600");
1.1       albertel  107: }
1.60      albertel  108: function substituent(r) {document.applets.JME.setSubstituent(r);}
1.1       albertel  109: </script>
1.65      albertel  110: CHEMJS
                    111: 
                    112:     my $start_page = 
1.69      albertel  113:         &Apache::loncommon::start_page('Molecule Editor',undef,
1.65      albertel  114: 				       {'only_body' => 1,
1.69      albertel  115: 					'js_ready'  => 1,
1.65      albertel  116: 					'bgcolor'   => '#FFFFFF',});
1.69      albertel  117:     my $end_page =
                    118:  	&Apache::loncommon::end_page({'js_ready' => 1,});
                    119: 	
1.65      albertel  120:     my $body=<<CHEMPAGE;
1.69      albertel  121: $js
1.1       albertel  122: <center>
1.60      albertel  123: <form>
                    124:   <table width="440"><tr>
                    125:     <td></td>
                    126:     <td align="right">
                    127:       <select onchange="javascript:substituent(options[selectedIndex].text)">
                    128:         <option>Select substituent</option>
                    129:         <option>-C(=O)OH</option>
                    130:         <option>-C(=O)OMe</option>
                    131:         <option>-OC(=O)Me</option>
                    132:         <option>-CMe3</option>
                    133:         <option>-CF3</option>
                    134:         <option>-CCl3</option>
                    135:         <option>-NO2</option>
                    136:         <option>-SO2-NH2</option>
                    137:         <option>-NH-SO2-Me</option>
                    138:         <option>-NMe2</option>
                    139:         <option>-C#N</option>
                    140:         <option>-C#C-Me</option>
                    141:         <option>-C#CH</option>
                    142:       </select>
                    143:     </td></tr>
                    144:   </table>
                    145: <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="440" height="390" mayscript>
1.1       albertel  146: You have to enable Java and JavaScript on your machine.
1.12      albertel  147: $molecule
1.6       albertel  148: <param name="options" value="$options" />
1.1       albertel  149: </applet><br />
1.49      albertel  150: <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.61      albertel  151: <br />
1.57      albertel  152: $insert_answer
1.1       albertel  153: <br />
1.57      albertel  154: <input type="button" value="  Close  " onclick = "javascript:window.close()" />
1.1       albertel  155: &nbsp;&nbsp;
1.57      albertel  156: <input type="button" value="  Help  " onclick = "javascript:openHelpWindow()" />
1.1       albertel  157: </form>
                    158: </center>
                    159: CHEMPAGE
1.65      albertel  160: 
1.69      albertel  161:     $body=&Apache::loncommon::js_ready($body);
1.53      albertel  162:     my $nothing=&Apache::lonhtmlcommon::javascript_nothing();
1.41      www       163:     my $docopen=&Apache::lonhtmlcommon::javascript_docopen();
1.55      albertel  164:     my $display=&mt('Draw Molecule');
                    165:     if (defined($shown_text)) { $display=&mt($shown_text); }
1.69      albertel  166:     my $function = 
                    167: 	'LONCAPA_draw_molecule_'.&Apache::lonhtmlcommon::get_uniq_name();
1.1       albertel  168:     my $result=<<CHEMINPUT;
1.69      albertel  169: <script type="text/javascript">
                    170:     function $function() {
                    171: 	editor=window.open($nothing,'jmeedit','width=500,height=500,menubar=no,scrollbars=no,resizable=yes');
                    172: 	editor.$docopen;
                    173: 	editor.document.write('$start_page $body $end_page');
                    174: 	editor.document.close();
                    175: 	editor.focus();
                    176:     }
                    177: </script>
                    178: <input type="button" value="$display" onclick="javascript:$function();void(0);" />
1.1       albertel  179: CHEMINPUT
                    180:     return $result;
                    181: }
                    182: 
1.56      albertel  183: sub jme_img {
                    184:     my ($jme,$smile,$width,$options)=@_;
                    185:     my $id=&Apache::loncommon::get_cgi_id();
                    186:     my $result='<img alt="'.$smile.'" src="/cgi-bin/convertjme.pl?'.$id.'"';
                    187:     if ($options =~ /border/) { $result.= ' border="1"'; }
                    188:     $result.=' />';
                    189:     &Apache::lonnet::appenv('cgi.'.$id.'.JME'   =>
1.66      www       190: 			    &escape($jme),
1.56      albertel  191: 			    'cgi.'.$id.'.PNG'   => 1,
                    192: 			    'cgi.'.$id.'.WIDTH' => $width);
                    193:     return $result;
                    194: }
                    195: 
1.6       albertel  196: sub start_organicresponse {
1.1       albertel  197:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    198:     my $result;
                    199:     my $partid = $Apache::inputtags::part;
                    200:     my $id = &Apache::response::start_response($parstack,$safeeval);
                    201:     if ($target eq 'meta') {
1.28      albertel  202: 	$result=&Apache::response::meta_package_write('organicresponse');
1.1       albertel  203:     } elsif ($target eq 'web') {
1.55      albertel  204: 	my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack,
                    205: 						 $safeeval);
                    206: 	if (  &Apache::response::show_answer() && $jmeanswer ne '') {
1.44      albertel  207: 	    my $options=&Apache::lonxml::get_param('options',$parstack,
                    208: 						   $safeeval);
                    209: 	    my $width=&Apache::lonxml::get_param('width',$parstack,
                    210: 						   $safeeval);
1.56      albertel  211: 	    my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,
                    212: 							 $safeeval);
                    213: 	    $result.=&jme_img($jmeanswer,$answers[0],$width,$options);
1.1       albertel  214: 	} else {
1.44      albertel  215: 	    my $molecule;
                    216: 	    if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) {
                    217: 		$molecule=$Apache::lonhomework::history{"resource.$partid.$id.molecule"};
                    218: 	    } else {
                    219: 		$molecule=&Apache::lonxml::get_param('molecule',$parstack,
                    220: 						     $safeeval);
                    221: 	    }
                    222: 	    my $options=&Apache::lonxml::get_param('options',$parstack,
                    223: 						   $safeeval);
1.55      albertel  224: 	    my $shown_text;
                    225: 	    if (&Apache::response::show_answer()) {
                    226: 		$shown_text="Show Your Last Answer";
                    227: 	    }
                    228: 	    $result=&separate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule,
                    229: 					 $options,$shown_text);
1.44      albertel  230: 	    $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />';
1.1       albertel  231: 	}
1.2       albertel  232:     } elsif ($target eq 'edit') {
                    233: 	$result .=&Apache::edit::tag_start($target,$token);
1.12      albertel  234: 	my $options=&Apache::lonxml::get_param('options',$parstack,
                    235: 					       $safeeval);
                    236: 	if ($options !~ /multipart/) { $options.=',multipart'; }
1.7       albertel  237: 	$result .='<nobr>'.
                    238: 	    &Apache::edit::text_arg('Starting Molecule:','molecule',
                    239: 				    $token,40);
1.2       albertel  240: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,
                    241: 						$safeeval);
1.30      www       242: 	$result .=&separate_jme_window(undef,
1.2       albertel  243: 		      &Apache::edit::html_element_name('molecule'),
1.12      albertel  244: 		      $molecule,$options);
1.7       albertel  245: 	$result .='</nobr><br /><nobr>';
1.2       albertel  246: 	$result .=&Apache::edit::text_arg('Correct Answer:','answer',
                    247: 					  $token,40);
1.70      albertel  248: 	$result .='</nobr><br /><nobr>';
1.67      albertel  249: 	$result .=&Apache::edit::text_arg('JME string of the answer (automatically updated when using the Draw Molecule button):',
                    250: 					  'jmeanswer',$token);
1.2       albertel  251: 	my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack,
                    252: 						 $safeeval);
1.30      www       253: 	$result .=&separate_jme_window(
1.2       albertel  254:                       &Apache::edit::html_element_name('answer'),
                    255:                       &Apache::edit::html_element_name('jmeanswer'),
1.12      albertel  256: 		      $jmeanswer,$options);
                    257: 	$result .='</nobr><br />';
                    258: 	$result .=&Apache::edit::checked_arg('Options:','options',
1.29      www       259: 				    [ ['autoez','Auto E,Z stereochemistry'],
1.18      albertel  260: 				      ['multipart','Multipart Structures'],
1.12      albertel  261: 				      ['nostereo','No stereochemistry'],
                    262: 				      ['reaction','Is a reaction'],
1.18      albertel  263: 				      ['number','Able to number atoms'] ],
1.12      albertel  264: 					     ,$token);
1.44      albertel  265: 	$result .=&Apache::edit::text_arg('Width of correct answer image:',
                    266: 					  'width',$token,10);
1.2       albertel  267: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    268:     } elsif ($target eq 'modified') {
                    269: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    270: 						     $safeeval,'molecule',
1.6       albertel  271: 						     'answer','jmeanswer',
1.44      albertel  272: 						     'options','width');
1.2       albertel  273: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.1       albertel  274:     }
1.63      albertel  275: 
1.1       albertel  276:     return $result;
                    277: }
                    278: 
1.6       albertel  279: sub end_organicresponse {
1.1       albertel  280:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    281:     my $result;
1.64      albertel  282: 
                    283:     my $partid = $Apache::inputtags::part;
                    284:     my $id = $Apache::inputtags::response['-1'];
                    285: 
                    286:     if ($target eq 'grade' 
                    287: 	&& &Apache::response::submitted()
                    288: 	&& $Apache::lonhomework::type eq 'exam') {
                    289: 
                    290: 	&Apache::response::scored_response($partid,$id);
                    291: 
                    292:     } elsif ($target eq 'grade' 
                    293: 	&& &Apache::response::submitted()
                    294: 	&& $Apache::lonhomework::type ne 'exam') {
                    295: 
1.31      albertel  296: 	&Apache::response::setup_params($$tagstack[-1],$safeeval);
1.1       albertel  297: 	my $response = &Apache::response::getresponse();
                    298: 	if ( $response =~ /[^\s]/) {
1.13      albertel  299: 	    my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
1.1       albertel  300: 	    my %previous = &Apache::response::check_for_previous($response,$partid,$id);
                    301: 	    $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
                    302: 	    my $ad;
1.13      albertel  303: 	    foreach my $answer (@answers) {
                    304: 		&Apache::lonxml::debug("submitted a $response for $answer<br \>\n");
                    305: 		if ($response eq $answer) {
                    306: 		    $ad='EXACT_ANS';
                    307: 		    last;
                    308: 		} else {
                    309: 		    $ad='INCORRECT';
                    310: 		}
1.1       albertel  311: 	    }
1.42      albertel  312: 	    if ($ad && $Apache::lonhomework::type eq 'survey') {
                    313: 		$ad='SUBMITTED';
                    314: 	    }
1.1       albertel  315: 	    &Apache::response::handle_previous(\%previous,$ad);
                    316: 	    $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
1.50      albertel  317: 	    $Apache::lonhomework::results{"resource.$partid.$id.molecule"}=$env{"form.MOLECULE_$id"};
1.1       albertel  318: 	}
1.2       albertel  319:     } elsif ($target eq "edit") {
                    320: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.15      albertel  321:     } elsif ($target eq 'answer') {
                    322: 	my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,
                    323: 						     $safeeval);
                    324: 	$result.=&Apache::response::answer_header('organicresponse');
                    325: 	foreach my $answer (@answers) {
                    326: 	    $result.=&Apache::response::answer_part('organicresponse',$answer);
                    327: 	}
                    328: 	$result.=&Apache::response::answer_footer('organicresponse');
1.1       albertel  329:     }
1.73      albertel  330:     if ($target eq 'web') {
                    331: 	&Apache::response::setup_prior_tries_hash(\&format_prior_answer_organic,
                    332: 						  ['molecule'])
                    333:     }
1.63      albertel  334: 
                    335:     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || 
                    336: 	$target eq 'tex' || $target eq 'analyze') {
1.75      foxr      337: 	&Apache::lonxml::increment_counter(&Apache::response::repetition(), 
                    338: 					   "$partid.$id"); # part.response
1.74      foxr      339: 	if ($target eq 'analyze') {
1.76      raeburn   340:             $Apache::lonhomework::analyze{"$partid.$id.type"} = 'organicresponse';
1.74      foxr      341: 	    &Apache::lonhomework::set_bubble_lines();
                    342: 	}
1.63      albertel  343:     }
                    344:     &Apache::response::end_response();
1.1       albertel  345:     return $result;
                    346: }
                    347: 
1.73      albertel  348: sub format_prior_answer_organic {
                    349:     my ($mode,$answer,$other_data) = @_;
                    350:     my $result=&mt('Smile representation: "[_1]"','<tt>'.$answer.'</tt>');
                    351:     my $jme=$other_data->[0];
                    352:     $result.=&jme_img($jme,$answer,400);
                    353:     return $result;
                    354: }
                    355: 
1.6       albertel  356: sub start_organicstructure {
1.3       albertel  357:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    358:     my $result;
                    359:     if ($target eq 'web') {
                    360: 	my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval);
                    361: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);
1.12      albertel  362: 	my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);
1.23      albertel  363: 	my $id=&Apache::loncommon::get_cgi_id();
1.19      albertel  364: 	$result="<img src='/cgi-bin/convertjme.pl?$id'";
                    365: 	if ($options =~ /border/) { $result.= ' border="1"'; }
                    366: 	$result.=' />';
1.16      albertel  367: 	&Apache::lonnet::appenv(
1.66      www       368:             'cgi.'.$id.'.JME'   => &escape($molecule),
1.17      albertel  369: 	    'cgi.'.$id.'.PNG' => 1,
1.16      albertel  370: 	    'cgi.'.$id.'.WIDTH' => $width );
1.17      albertel  371:     } elsif ($target eq 'tex') {
1.38      albertel  372: 	my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,undef,1);
1.58      foxr      373: 	my $webwidth=&Apache::lonxml::get_param('width', $parstack, $safeeval);
                    374: 	my $webheight=&Apache::lonxml::get_param('height', $parstack, $safeeval);
1.62      foxr      375: 	if (!$webheight) { $webheight = $webwidth; }
1.17      albertel  376: 	if (!$texwidth) { $texwidth='90'; }
1.58      foxr      377: 	$result = "%DYNAMICIMAGE:$webwidth:$webheight:$texwidth\n";
1.17      albertel  378: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);
                    379: 	my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);
1.50      albertel  380: 	my $filename = $env{'user.name'}.'_'.$env{'user.domain'}.
1.17      albertel  381: 	    '_'.time.'_'.$$.int(rand(1000)).'_organicstructure';
                    382: 	my $id=$filename;
                    383: 	&Apache::lonnet::appenv(
1.66      www       384: 		     'cgi.'.$id.'.JME'   => &escape($molecule),
1.17      albertel  385: 		     'cgi.'.$id.'.PS' => 1,
                    386: 		     'cgi.'.$id.'.WIDTH' => $texwidth );
1.66      www       387: 	$id=&escape($id);
1.17      albertel  388: 	&Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id");
1.20      albertel  389: 	if ($options =~ /border/) { $result.= '\fbox{'; }
                    390: 	$result .= '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}';
                    391: 	if ($options =~ /border/) { $result.= '} '; }
1.3       albertel  392:     } elsif ($target eq 'edit') {
                    393: 	$result .=&Apache::edit::tag_start($target,$token);
1.22      albertel  394: 	$result .=&Apache::edit::text_arg('Width (pixels):','width',$token,5);
                    395: 	$result .=&Apache::edit::text_arg('TeXwidth (mm):','texwidth',$token,5);
1.12      albertel  396: 	$result .='<nobr>';
1.3       albertel  397: 	$result .=&Apache::edit::text_arg('Molecule:','molecule',$token,40);
                    398: 	my $molecule=&Apache::lonxml::get_param('molecule',$parstack,
                    399: 						$safeeval);
1.12      albertel  400: 	my $options=&Apache::lonxml::get_param('options',$parstack,
                    401: 					       $safeeval);
                    402: 	if ($options !~ /reaction/) {
                    403: 	    $options.= ',multipart,number';
                    404: 	}
                    405: 						   
1.30      www       406: 	$result .=&separate_jme_window(undef,
1.12      albertel  407: 				 &Apache::edit::html_element_name('molecule'),
                    408: 				       $molecule,$options);
                    409: 	$result.="</nobr><br />";
                    410: 	$result .=&Apache::edit::checked_arg('Options:','options',
1.18      albertel  411: 					     [ ['reaction','Is a reaction'],
1.12      albertel  412: 					       ['border','Draw a border'] ],
                    413: 					     $token);
1.24      albertel  414: 	$result .=&Apache::edit::end_row();
1.3       albertel  415:     } elsif ($target eq 'modified') {
                    416: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    417: 						     $safeeval,'molecule',
1.22      albertel  418: 						     'width','texwidth',
                    419: 						     'options');
1.3       albertel  420: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                    421:     }
                    422:     return $result;
1.1       albertel  423: }
                    424: 
1.6       albertel  425: sub end_organicstructure {
1.3       albertel  426:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    427:     my $result;
                    428:     if ($target eq "edit") {
                    429: 	$result.= &Apache::edit::tag_end($target,$token,'');
                    430:     }
1.4       albertel  431:     return $result;
                    432: }
                    433: 
1.9       albertel  434: sub edit_reaction_button {
1.11      albertel  435:     my ($id,$field,$reaction)=@_;
1.66      www       436:     my $id_es=&escape($id);
                    437:     my $field_es=&escape($field);
                    438:     my $reaction_es=&escape($reaction);
1.41      www       439:     my $docopen=&Apache::lonhtmlcommon::javascript_docopen();
1.65      albertel  440:     my $start_page = 
                    441: 	&Apache::loncommon::start_page('LON-CAPA Reaction Editor',undef,
                    442: 				       {'frameset'    => 1,
                    443: 					'js_ready'    => 1,
                    444: 					'add_entries' => {
1.68      albertel  445: 					    'rows'   => "30%,*",
1.65      albertel  446: 					    'border' => "0",}},);
                    447:     my $end_page = 
                    448: 	&Apache::loncommon::end_page({'frameset' => 1,
                    449: 				      'js_ready' => 1});
1.9       albertel  450:     my $result=<<EDITREACTION;
1.10      albertel  451: <script type="text/javascript">
1.47      albertel  452: // <!--
1.10      albertel  453:     function create_reaction_window_${id}_${field} () {
                    454: 	editor=window.open('','','width=500,height=270,scrollbars=no,resizable=yes');
1.41      www       455: 	editor.$docopen;
1.65      albertel  456: 	editor.document.writeln('$start_page <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" /> $end_page');
1.68      albertel  457: 	editor.document.close();
1.10      albertel  458:     }
1.47      albertel  459: // -->
1.10      albertel  460: </script>
1.47      albertel  461: <input type='button' value='Edit Answer' onclick="javascript:create_reaction_window_${id}_${field}();void(0);" />
1.9       albertel  462: EDITREACTION
                    463:     return $result;
                    464: }
                    465: 
1.4       albertel  466: sub start_reactionresponse {
                    467:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    468:     my $result;
                    469:     my $id = &Apache::response::start_response($parstack,$safeeval);
1.10      albertel  470:     if ($target eq 'meta') {
1.28      albertel  471: 	$result=&Apache::response::meta_package_write('reactionresponse');
1.10      albertel  472:     } elsif ($target eq 'web') {
1.11      albertel  473: 	my $partid = $Apache::inputtags::part;
                    474: 	my $id = $Apache::inputtags::response['-1'];
                    475: 	my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"};
1.35      albertel  476: 	if ($reaction eq '') {  $reaction=&Apache::lonxml::get_param('initial',$parstack,$safeeval); }
1.33      albertel  477: 	my $status=$Apache::inputtags::status['-1'];
                    478: 	if ($status eq 'CAN_ANSWER') {
                    479: 	    $result.=&edit_reaction_button($id,"HWVAL_$id",$reaction);
                    480: 	}
                    481: 	if (  &Apache::response::show_answer() ) {
                    482: 	    my $ans=&Apache::lonxml::get_param('answer',$parstack,$safeeval);
1.51      albertel  483: 	    if (!$Apache::lonxml::default_homework_loaded) {
                    484: 		&Apache::lonxml::default_homework_load($safeeval);
                    485: 	    }
                    486: 	    @Apache::scripttag::parser_env = @_;
1.71      albertel  487: 	    $Apache::inputtags::answertxt{$id}=[&Apache::run::run("return &chemparse(q\0$ans\0);",$safeeval)];
1.33      albertel  488: 	}
1.4       albertel  489:     } elsif ($target eq "edit") {
1.9       albertel  490: 	$result .=&Apache::edit::tag_start($target,$token);
                    491: 	my $answer=&Apache::lonxml::get_param('answer',$parstack,
                    492: 						$safeeval);
1.10      albertel  493: 	$result .='<nobr>'.
                    494: 	    &Apache::edit::text_arg('Answer:','answer',$token,40);
                    495: 	$result .=&edit_reaction_button($id,&Apache::edit::html_element_name('answer'),$answer).'</nobr>';
1.35      albertel  496: 	my $initial=&Apache::lonxml::get_param('initial',$parstack,$safeeval);
                    497: 	$result.='<nobr>'.
1.43      albertel  498: 	    &Apache::edit::text_arg('Initial Reaction:','initial',$token,40);
1.35      albertel  499: 	$result .=&edit_reaction_button($id,&Apache::edit::html_element_name('initial'),$initial).'</nobr>';
1.10      albertel  500: 	
1.9       albertel  501: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
1.10      albertel  502:     }  elsif ($target eq 'modified') {
                    503: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.35      albertel  504: 						     $safeeval,'answer',
                    505: 						     'initial');
1.10      albertel  506: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.4       albertel  507:     }
                    508:     return $result;
                    509: }
                    510: 
                    511: sub end_reactionresponse {
                    512:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                    513:     my $result;
1.64      albertel  514: 
                    515:     my $partid = $Apache::inputtags::part;
                    516:     my $id = $Apache::inputtags::response['-1'];
                    517: 
                    518:     if ($target eq 'grade' 
                    519: 	&& &Apache::response::submitted()
                    520: 	&& $Apache::lonhomework::type eq 'exam') {
                    521: 
                    522: 	&Apache::response::scored_response($partid,$id);
                    523: 
                    524:     } elsif ($target eq 'grade' 
                    525: 	&& &Apache::response::submitted()
                    526: 	&& $Apache::lonhomework::type ne 'exam') {
                    527: 
1.31      albertel  528: 	&Apache::response::setup_params($$tagstack[-1],$safeeval);
1.10      albertel  529: 	my $response = &Apache::response::getresponse();
                    530: 	if ( $response =~ /[^\s]/) {
1.15      albertel  531: 	    my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval);
1.10      albertel  532: 	    my %previous = &Apache::response::check_for_previous($response,$partid,$id);
                    533: 	    $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response;
                    534: 	    my $ad;
1.13      albertel  535: 	    foreach my $answer (@answers) {
                    536: 		&Apache::lonxml::debug("submitted a $response for $answer<br \>\n");
1.34      albertel  537: 		if (&chem_standard_order($response) eq 
                    538: 		    &chem_standard_order($answer)) {
1.13      albertel  539: 		    $ad='EXACT_ANS';
                    540: 		} else {
                    541: 		    $ad='INCORRECT';
                    542: 		}
1.10      albertel  543: 	    }
1.42      albertel  544: 	    if ($ad && $Apache::lonhomework::type eq 'survey') {
                    545: 		$ad='SUBMITTED';
                    546: 	    }
1.10      albertel  547: 	    &Apache::response::handle_previous(\%previous,$ad);
                    548: 	    $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad;
                    549: 	}
                    550:     }  elsif ($target eq "edit") {
1.4       albertel  551: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.15      albertel  552:     } elsif ($target eq 'answer') {
                    553: 	my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,
                    554: 						     $safeeval);
                    555: 	$result.=&Apache::response::answer_header('reactionresponse');
                    556: 	foreach my $answer (@answers) {
                    557: 	    $result.=&Apache::response::answer_part('reactionresponse',
                    558: 						    $answer);
                    559: 	}
                    560: 	$result.=&Apache::response::answer_footer('reactionresponse');
1.4       albertel  561:     }
1.72      albertel  562:     if ($target eq 'web') {
                    563: 	&Apache::response::setup_prior_tries_hash(\&format_prior_response_reaction);
                    564:     }
1.63      albertel  565: 
                    566:     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || 
                    567: 	$target eq 'tex' || $target eq 'analyze') {
1.75      foxr      568: 	&Apache::lonxml::increment_counter(&Apache::response::repetition(), "$partid.$id");
1.77    ! raeburn   569:         if ($target eq 'analyze') {
        !           570:             $Apache::lonhomework::analyze{"$partid.$id.type"} = 'reactionresponse';
        !           571:             &Apache::lonhomework::set_bubble_lines();
        !           572:         }
1.63      albertel  573:     }
                    574:     &Apache::response::end_response();
1.3       albertel  575:     return $result;
1.1       albertel  576: }
                    577: 
1.72      albertel  578: sub format_prior_response_reaction {
                    579:     my ($mode,$answer) =@_;
                    580:     return '<span class="LC_prior_reaction">'.
                    581: 	    &HTML::Entities::encode($answer,'"<>&').'</span>';
                    582: }
                    583: 
1.46      albertel  584: sub start_chem {
                    585:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
                    586:     my $result = '';
1.48      albertel  587:     my $inside = &Apache::lonxml::get_all_text_unbalanced("/chem",$parser);
1.46      albertel  588:     if ($target eq 'tex' || $target eq 'web') {
1.48      albertel  589: 	$inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
                    590: 	if (!$Apache::lonxml::default_homework_loaded) {
                    591: 	    &Apache::lonxml::default_homework_load($safeeval);
                    592: 	}
                    593: 	@Apache::scripttag::parser_env = @_;
                    594: 	$result=&Apache::run::run("return &chemparse(q\0$inside\0);",$safeeval);
1.46      albertel  595:     }    
                    596:     return $result;
                    597: }
                    598: 
                    599: sub end_chem {
                    600:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
                    601:     my $result = '';
                    602:     return $result;
                    603: }
                    604: 
1.1       albertel  605: 1;
                    606: __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.