Annotation of loncom/homework/structuretags.pm, revision 1.400

1.34      albertel    1: # The LearningOnline Network with CAPA 
                      2: # definition of tags that give a structure to a document
1.74      albertel    3: #
1.400   ! albertel    4: # $Id: structuretags.pm,v 1.399 2007/09/12 08:35:44 www Exp $
1.74      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: #
1.254     www        28: ###
1.54      www        29: 
1.133     sakharuk   30: 
1.1       albertel   31: package Apache::structuretags; 
                     32: 
                     33: use strict;
                     34: use Apache::lonnet;
1.101     sakharuk   35: use Apache::File();
1.147     www        36: use Apache::lonmenu;
1.210     albertel   37: use Apache::lonlocal;
1.231     sakharuk   38: use Apache::lonxml;
1.338     albertel   39: use Apache::lonenc();
1.267     albertel   40: use Time::HiRes qw( gettimeofday tv_interval );
1.356     www        41: use lib '/home/httpd/lib/perl/';
                     42: use LONCAPA;
                     43:  
1.78      harris41   44: BEGIN {
1.397     albertel   45:     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag'));
1.10      albertel   46: }
                     47: 
                     48: sub start_web {
1.326     albertel   49:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.383     albertel   50:     if ($target ne 'edit' && $target ne 'modified') {
                     51: 	my $bodytext=&Apache::lonxml::get_all_text("/web",$parser,$style);
                     52: 	if ($target eq 'web' || $target eq 'webgrade') {
                     53: 	    return $bodytext;
                     54: 	}
                     55:     } elsif ($target eq "edit" ) {
                     56: 	my $bodytext = 
                     57: 	    &Apache::lonxml::get_all_text_unbalanced("/web",$parser);
                     58: 	my $result = &Apache::edit::tag_start($target,$token);
                     59: 	$result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
                     60: 	return $result;
                     61:     } elsif ( $target eq "modified" ) {
                     62: 	return $token->[4].&Apache::edit::modifiedfield("/web",$parser);
1.159     albertel   63:     }
                     64:     return '';
1.10      albertel   65: }
                     66: 
                     67: sub end_web {
1.44      ng         68:     return '';
1.10      albertel   69: }
                     70: 
                     71: sub start_tex {
1.326     albertel   72:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.198     sakharuk   73:     my $result='';
1.383     albertel   74:     if ($target ne 'edit' && $target ne 'modified') {
                     75: 	my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style);
                     76: 	if ($target eq 'tex') {
                     77: 	    return $bodytext.' ';
                     78: 	}
                     79:     } elsif ($target eq "edit" ) {
                     80: 	my $bodytext = 
                     81: 	    &Apache::lonxml::get_all_text_unbalanced("/tex",$parser);
                     82: 	my $result = &Apache::edit::tag_start($target,$token);
                     83: 	$result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
                     84: 	return $result;
                     85:     } elsif ( $target eq "modified" ) {
                     86: 	return $token->[4].&Apache::edit::modifiedfield("/tex",$parser);
1.159     albertel   87:     }
1.198     sakharuk   88:     return $result;;
1.10      albertel   89: }
                     90: 
                     91: sub end_tex {
1.44      ng         92:     return '';
1.9       albertel   93: }
                     94: 
1.400   ! albertel   95: sub homework_js {
        !            96:     return &Apache::loncommon::resize_textarea_js().
        !            97: 	<<'JS';
        !            98: <script type="text/javascript">
        !            99: function setSubmittedPart (part) {
        !           100:    this.document.lonhomework.submitted.value="part_"+part;
        !           101: }
        !           102: 
        !           103: function image_response_click (which, e) {
        !           104:     init_geometry();
        !           105:     if (!e) { e = window.event; } //IE
        !           106:     var input_element = document.lonhomework.elements[which];
        !           107:     var token_element = document.lonhomework.elements['token_'+which];
        !           108:     var token = token_element.value;
        !           109:     var img_element   = document.getElementById('imageresponse_'+which);
        !           110:     var x= e.clientX-getX(img_element)+Geometry.getHorizontalScroll();
        !           111:     var y= e.clientY-getY(img_element)+Geometry.getVerticalScroll();
        !           112:     var click = x+':'+y;
        !           113:     input_element.value = click;
        !           114:     img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click;
        !           115: }
        !           116: </script>
        !           117: JS
        !           118: }
        !           119: 
1.48      albertel  120: sub page_start {
1.345     albertel  121:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
                    122: 	$extra_head)=@_;
1.159     albertel  123:     my %found;
1.207     albertel  124:     foreach my $taginside (@$tagstack) {
1.159     albertel  125: 	foreach my $taglookedfor ('html','body','form') {
                    126: 	    if ($taginside =~ /^$taglookedfor$/i) {$found{$taglookedfor} = 1;}
                    127: 	}
                    128:     }
                    129: 
1.343     albertel  130:     if ($target eq 'tex') {
                    131: 	return
                    132: 	    &Apache::londefdef::start_html($target,$token,$tagstack,
                    133: 					   $parstack,$parser,$safeeval);
                    134:     }
                    135: 
1.400   ! albertel  136:     $extra_head .= &homework_js();
1.374     albertel  137: 
1.344     albertel  138:     my %body_args;
                    139:     if (defined($found{'html'})) {
                    140: 	$body_args{'skip_phases'}{'head'}=1;
                    141:     } else {
1.343     albertel  142: 	
1.345     albertel  143: 	$extra_head .= &Apache::lonhtmlcommon::spellheader();
1.343     albertel  144: 
1.379     albertel  145: 	$extra_head .= &Apache::londefdef::generate_css_links();
                    146: 
1.384     albertel  147: 	if ($env{'request.state'} eq 'construct') {
1.343     albertel  148: 	    $extra_head.=&Apache::edit::js_change_detection().
                    149: 		"<script type=\"text/javascript\">\n".
                    150: 		"if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
                    151: 		&Apache::loncommon::browser_and_searcher_javascript().
                    152:                 "\n</script>\n";
                    153: 	}
1.159     albertel  154:     }
1.343     albertel  155: 
1.344     albertel  156:     if (defined($found{'body'})) {
                    157: 	$body_args{'skip_phases'}{'body'}=1;
                    158:     } elsif (!defined($found{'body'}) 
                    159: 	     && $env{'request.state'} eq 'construct') {
1.343     albertel  160: 	if ($target eq 'web' || $target eq 'edit') {
1.344     albertel  161: 	    # no extra args to bodytag
1.297     albertel  162: 	}
1.272     albertel  163:     } elsif (!defined($found{'body'})) {
1.343     albertel  164: 	my %add_entries;
1.159     albertel  165: 	my $background=&Apache::lonxml::get_param('background',$parstack,
                    166: 						  $safeeval);
1.343     albertel  167: 	if ($background ne '' ) {
                    168: 	    $add_entries{'background'} = $background;
                    169: 	}
1.344     albertel  170: 
1.290     albertel  171: 	my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
                    172: 					       $safeeval);
1.344     albertel  173:        	if ($bgcolor eq '' ) { $bgcolor = '#FFFFFF'; }
                    174: 
                    175: 	$body_args{'bgcolor'}        = $bgcolor;
                    176: 	$body_args{'no_title'}       = 1;
                    177: 	$body_args{'force_register'} = 1;
                    178: 	$body_args{'add_entries'}    = \%add_entries;	
1.391     albertel  179: 	if ($env{'environment.remote'} eq 'off'
                    180: 	    && $env{'request.state'} eq   'construct') {
                    181: 	    $body_args{'only_body'}  = 1;
                    182: 	}
1.344     albertel  183:     }
1.365     albertel  184:     $body_args{'no_auto_mt_title'} = 1;
1.344     albertel  185:     my $page_start = &Apache::loncommon::start_page($name,$extra_head,
                    186: 						    \%body_args);
                    187: 
                    188:     if (!defined($found{'body'}) 
                    189: 	&& $env{'request.state'} ne 'construct'
                    190: 	&& ($target eq 'web' || $target eq 'webgrade')) {
                    191: 
1.367     albertel  192: 	my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser();
1.344     albertel  193: 	if ($symb eq '' && !$publicuser) {
                    194: 	    my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");
                    195: 	    $help=&mt("Browsing resource, all submissions are temporary.")."<br />";
                    196: 	    $page_start .= $help;
1.159     albertel  197: 	}
1.344     albertel  198:     }
                    199: 
                    200:     if (!defined($found{'body'})) {
1.343     albertel  201: 	$page_start .= &Apache::lonxml::message_location();
1.159     albertel  202:     }
1.344     albertel  203:     
1.159     albertel  204:     my $form_tag_start;
                    205:     if (!defined($found{'form'})) {
1.337     albertel  206: 	$form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="post" action="';
1.338     albertel  207: 	my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.327     albertel  208: 	$form_tag_start.=$uri.'" ';
                    209: 	if ($target eq 'edit') {
                    210: 	    $form_tag_start.=&Apache::edit::form_change_detection();
                    211: 	}
1.368     albertel  212: 	$form_tag_start.='>'."\n";
1.355     albertel  213: 
                    214: 	my $symb=&Apache::lonnet::symbread();
                    215: 	if ($symb =~ /\S/) {
                    216: 	    $symb=
                    217: 		&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb));
                    218: 	    $form_tag_start.=
1.368     albertel  219: 		"\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n";
1.355     albertel  220: 	}
1.159     albertel  221:     }
1.343     albertel  222:     return ($page_start,$form_tag_start);
1.105     albertel  223: }
                    224: 
1.141     matthew   225: #use Time::HiRes();
1.105     albertel  226: sub get_resource_name {
1.159     albertel  227:     my ($parstack,$safeeval)=@_;
1.388     foxr      228:     my $name;
1.204     albertel  229:     if (defined($Apache::lonhomework::name)) {
1.388     foxr      230: 	$name = $Apache::lonhomework::name;
                    231:     } else {
                    232: 	my ($symb)=&Apache::lonnet::whichuser();
1.392     albertel  233: 	$name=&Apache::lonnet::gettitle($symb);
1.388     foxr      234: 	if ($name eq '') {
                    235: 	    $name=&Apache::lonnet::EXT('resource.title');
                    236: 	    if ($name eq 'con_lost') { $name = ''; }
                    237: 	}
                    238: 	if ($name!~/\S+/) {
                    239: 	    $name=$env{'request.uri'};
                    240: 	    $name=~s-.*/([^/]+)$-$1-;
                    241: 	}
                    242: 	# The name has had html tags escaped:
                    243:        
                    244: 	$name=~s/&lt;/</gs;
                    245: 	$name=~s/&gt;/>/gs;
                    246: 
                    247: 	$Apache::lonhomework::name=$name;
1.204     albertel  248:     }
1.159     albertel  249:     return $name;
1.105     albertel  250: }
                    251: 
                    252: sub setup_rndseed {
1.159     albertel  253:     my ($safeeval)=@_;
                    254:     my $rndseed;
1.367     albertel  255:     my ($symb)=&Apache::lonnet::whichuser();
1.333     albertel  256:     if ($env{'request.state'} eq "construct" 
                    257: 	|| $symb eq '' 
                    258: 	|| $Apache::lonhomework::type eq 'practice'
                    259: 	|| $Apache::lonhomework::history{'resource.CODE'}) {
1.316     www       260: 	&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.317     albertel  261: 						['rndseed']);
1.284     albertel  262: 	$rndseed=$env{'form.rndseed'};
1.159     albertel  263: 	if (!$rndseed) {
1.162     albertel  264: 	    $rndseed=$Apache::lonhomework::history{'rndseed'};
                    265: 	    if (!$rndseed) {
                    266: 		$rndseed=time;
                    267: 	    }
1.284     albertel  268: 	    $env{'form.rndseed'}=$rndseed;
1.162     albertel  269: 	}
1.374     albertel  270: 	if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')
                    271: 	      && $env{'form.submitted'} eq 'yes')  ||
1.284     albertel  272: 	    $env{'form.newrandomization'} eq &mt('New Randomization')) {
1.190     albertel  273: 	    srand(time);
                    274: 	    $rndseed=int(rand(2100000000));
1.284     albertel  275: 	    $env{'form.rndseed'}=$rndseed;
                    276: 	    delete($env{'form.resetdata'});
                    277: 	    delete($env{'form.newrandomization'});
1.159     albertel  278: 	}
1.187     albertel  279: 	if (defined($rndseed) && $rndseed ne int($rndseed)) {
1.307     albertel  280: 	    $rndseed=join(':',&Apache::lonnet::digest($rndseed));
1.187     albertel  281:         }
1.247     albertel  282:         if ($Apache::lonhomework::history{'resource.CODE'}) {
                    283: 	   $rndseed=&Apache::lonnet::rndseed();
                    284: 	}
1.221     albertel  285: 	if ($safeeval) {
                    286: 	    &Apache::lonxml::debug("Setting rndseed to $rndseed");
1.250     albertel  287: 	    &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
1.221     albertel  288: 	}
1.159     albertel  289:     }
                    290:     return $rndseed;
1.105     albertel  291: }
                    292: 
1.268     albertel  293: sub remember_problem_state {
                    294:     return '
1.284     albertel  295:        <input type="hidden" name="problemstate" value="'.$env{'form.problemstate'}.'" />
                    296:        <input type="hidden" name="problemtype" value="'.$env{'form.problemtype'}.'" />
                    297:        <input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />';
1.268     albertel  298: }
                    299: 
1.105     albertel  300: sub problem_edit_header {
1.268     albertel  301:     return '<input type="hidden" name="submitted" value="edit" />'.
                    302: 	&Apache::structuretags::remember_problem_state().'
1.210     albertel  303:        <input type="hidden" name="problemmode" value="'.&mt('Edit').'" />
1.243     matthew   304:        <input type="submit" name="problemmode" accesskey="d" value="'.&mt('Discard Edits and View').'" />
1.328     albertel  305:        <input '.&Apache::edit::submit_ask_anyway().' type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />
1.243     matthew   306:        <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" /> <hr />
                    307:        <input type="submit" name="submit" accesskey="s" value="'.&mt('Submit Changes and Edit').'" />
                    308:        <input type="submit" name="submit" accesskey="v" value="'.&mt('Submit Changes and View').'" /><table><tr><td>'.
1.359     albertel  309:        &Apache::loncommon::help_open_menu('Problem Editing Help','Problem_Editor_XML_Index',5,'Authoring',undef,undef,undef,'Problem Editing Help')
1.260     albertel  310:        .'</td></tr></table>'.
1.282     albertel  311:        '<table border="0" width="100%"><tr><td bgcolor="#DDDDDD">';
1.105     albertel  312: }
                    313: 
                    314: sub problem_edit_footer {
1.210     albertel  315:     return '</td></tr></table><br /><input type="submit" name="submit" value="'.&mt('Submit Changes and Edit').'" />
1.255     www       316:     <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" />'.
1.348     albertel  317:     &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields()).
1.342     albertel  318:     "\n</form>\n".&Apache::loncommon::end_page();
1.105     albertel  319: }
                    320: 
1.235     albertel  321: sub option {
                    322:     my ($value,$name) = @_;
                    323:     my $result ="<option value='".$value."' ";
1.284     albertel  324:     if ($env{'form.'.$name} eq $value) {
1.235     albertel  325: 	$result.=" selected='on' ";
                    326:     }
                    327:     $result.='>';
                    328:     return $result;
                    329: }
                    330: 
1.105     albertel  331: sub problem_web_to_edit_header {
1.159     albertel  332:     my ($rndseed)=@_;
1.313     albertel  333:     my $result.='<input type="hidden" name="problemmode" value="'.&mt('View').'" />';
1.373     albertel  334:     $result .= '<input type="submit" name="problemmode" accesskey="e" value="'.&mt('Edit').'" />';
1.313     albertel  335:     $result .= '<input type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />
1.243     matthew   336:              <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />
                    337:              <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
1.210     albertel  338:              <nobr><input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />
1.270     albertel  339:               <input type="text" name="rndseed" size="10" value="'.
1.175     albertel  340: 	       $rndseed.'"
1.270     albertel  341:            onchange="javascript:document.lonhomework.changerandseed.click()" /></nobr>
1.384     albertel  342:              <span class="LC_nobreak"><label><input type="checkbox" name="showallfoils" ';
1.315     albertel  343:     my $show_all_foils_text = 
                    344: 	($Apache::lonhomework::parsing_a_task) ?
                    345: 	&mt('&nbsp;Show&nbsp;All&nbsp;Instances')
                    346: 	: &mt('&nbsp;Show&nbsp;All&nbsp;Foils');
                    347: 
1.284     albertel  348:     if (defined($env{'form.showallfoils'})) { $result.='checked="on"'; }
1.384     albertel  349:     $result.= ' />'.$show_all_foils_text.'</label></span>'.
1.228     www       350: 	&Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area','Testing Problems').
1.371     albertel  351: 	'<hr />';
1.386     albertel  352:     $result.=&mt('Apply style file: ').'
1.384     albertel  353: <input type="text" name="style_file" value="'.&HTML::Entities::encode($env{'construct.style'},'"<>&').'" />
                    354:  <a href="javascript:openbrowser(\'lonhomework\',\'style_file\',\'sty\')">'.&mt('Select').'</a>
                    355: <input type="submit" name="clear_style_file" value="'.&mt('Clear').'" />
                    356: <br />';
                    357: 
1.313     albertel  358:     if (!$Apache::lonhomework::parsing_a_task) {
                    359: 	$result.="
1.235     albertel  360: <nobr>
                    361: Problem Status:
                    362: <select name='problemstate'>
1.270     albertel  363:   <option value=''></option>
1.235     albertel  364:   ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>
                    365:   ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>
                    366:   ".&option('CANNOT_ANSWER_tries'  ,'problemstate').&mt("Open with full tries")."</option>
                    367:   ".&option('CANNOT_ANSWER_correct','problemstate').&mt("Open and correct")."</option>
                    368:   ".&option('SHOW_ANSWER'          ,'problemstate').&mt("Show Answer")."</option>
                    369: </select>
                    370: </nobr>
                    371: <nobr>
                    372: Problem Type:
                    373: <select name='problemtype'>
1.270     albertel  374:   <option value=''></option>
1.242     albertel  375:   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>
                    376:   ".&option('problem','problemtype').&mt("Homework problem")."</option>
                    377:   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
1.235     albertel  378: </select>
                    379: </nobr>
                    380: <nobr>
                    381: Feedback Mode:
                    382: <select name='problemstatus'>
                    383:   <option value=''></option>
1.242     albertel  384:   ".&option('yes','problemstatus').&mt("Show Feedback")."</option>
                    385:   ".&option('no', 'problemstatus').&mt("Don't Show Feedback")."</option>
1.235     albertel  386: </select>
                    387: </nobr>
1.242     albertel  388: <input type='submit' name='changeproblemmode' value='".&mt("Change")."' />
1.235     albertel  389: <hr />";
1.313     albertel  390: 	my $numtoanalyze=$env{'form.numtoanalyze'};
                    391: 	if (!$numtoanalyze) { $numtoanalyze=20; }
                    392: 	$result.= '<input type="submit" name="problemmode" value='.
                    393: 	    &mt('"Calculate answers').'" /> for
1.136     albertel  394:              <input type="text" name="numtoanalyze" value="'.
1.210     albertel  395: 	     $numtoanalyze.'" size="5" /> '.&mt('versions of this problem').
                    396: 	     '.'.&Apache::loncommon::help_open_topic("Analyze_Problem",
1.176     albertel  397: 						     '',undef,undef,300).
1.210     albertel  398: 						     '<hr />';
1.376     albertel  399:     } elsif ($Apache::lonhomework::parsing_a_task) {
                    400: 	$result.="
                    401: <nobr>
                    402: Problem Status:
                    403: <select name='problemstate'>
                    404:   <option value=''></option>
                    405:   ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>
                    406:   ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>
                    407:   ".&option('WEB_GRADE'            ,'problemstate').&mt("Criteria Grading")."</option>
                    408:   ".&option('SHOW_ANSWER'          ,'problemstate').&mt("Show Feedback")."</option>
                    409: </select>
                    410: </nobr>
                    411: <input type='submit' name='changeproblemmode' value='".&mt("Change")."' />
                    412: <hr />";
1.313     albertel  413:     }
1.159     albertel  414:     return $result;
1.48      albertel  415: }
                    416: 
1.65      albertel  417: sub initialize_storage {
1.357     albertel  418:     my ($given_symb) = @_;
1.353     albertel  419:     undef(%Apache::lonhomework::results);
                    420:     undef(%Apache::lonhomework::history);
1.357     albertel  421:     my ($symb,$courseid,$domain,$name) = 
1.367     albertel  422: 	&Apache::lonnet::whichuser($given_symb);
1.353     albertel  423:     
                    424:     # anonymous users (CODEd exams) have no data
                    425:     if ($name eq 'anonymous' 
                    426: 	&& !defined($domain)) {
                    427: 	return;
                    428:     }
                    429: 
1.333     albertel  430:     if ($env{'request.state'} eq 'construct' 
                    431: 	|| $symb eq ''
                    432: 	|| $Apache::lonhomework::type eq 'practice') {
                    433: 	
                    434: 	my $namespace = $symb || $env{'request.uri'};
                    435: 	if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
1.374     albertel  436: 	    ($env{'form.resetdata'} eq &mt('New Problem Variation')
                    437: 	     && $env{'form.submitted'} eq 'yes') ||
1.333     albertel  438: 	    $env{'form.newrandomization'} eq &mt('New Randomization')) {
                    439: 	    &Apache::lonnet::tmpreset($namespace,'',$domain,$name);
                    440: 	    &Apache::lonxml::debug("Attempt reset");
                    441: 	}
1.159     albertel  442: 	%Apache::lonhomework::history=
1.333     albertel  443: 	    &Apache::lonnet::tmprestore($namespace,'',$domain,$name);
1.159     albertel  444: 	my ($temp)=keys %Apache::lonhomework::history ;
                    445: 	&Apache::lonxml::debug("Return message of $temp");
                    446:     } else {
                    447: 	%Apache::lonhomework::history=
                    448: 	    &Apache::lonnet::restore($symb,$courseid,$domain,$name);
                    449:     }
1.353     albertel  450: 
1.159     albertel  451:     #ignore error conditions
1.67      albertel  452:     my ($temp)=keys %Apache::lonhomework::history ;
1.159     albertel  453:     if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
1.65      albertel  454: }
                    455: 
                    456: # -------------------------------------------------------------finalize_storage
                    457: # Stores away the result has to a student's environment
                    458: # checks form.grade_ for specific values, other wises stores
                    459: # to the running users environment
1.285     raeburn   460: # Will increment totals for attempts, students, and corrects
                    461: # if running user has student role.  
1.65      albertel  462: sub finalize_storage {
1.357     albertel  463:     my ($given_symb) = @_;
1.159     albertel  464:     my $result;
1.289     albertel  465:     if (%Apache::lonhomework::results) {
1.323     albertel  466: 	my @remove = grep(/^INTERNAL_/,keys(%Apache::lonhomework::results));
                    467: 	delete(@Apache::lonhomework::results{@remove});
1.357     albertel  468: 	my ($symb,$courseid,$domain,$name) = 
1.367     albertel  469: 	    &Apache::lonnet::whichuser($given_symb);
1.333     albertel  470: 	if ($env{'request.state'} eq 'construct' 
                    471: 	    || $symb eq ''
                    472: 	    || $Apache::lonhomework::type eq 'practice') {
                    473: 	    my $namespace = $symb || $env{'request.uri'};
1.284     albertel  474: 	    $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'};
1.159     albertel  475: 	    $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
1.333     albertel  476: 					      $namespace,'',$domain,$name);
1.159     albertel  477: 	    &Apache::lonxml::debug('Construct Store return message:'.$result);
                    478: 	} else {
                    479: 	    $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
                    480: 					    $symb,$courseid,$domain,$name);
                    481: 	    &Apache::lonxml::debug('Store return message:'.$result);
1.285     raeburn   482:             if ($env{'request.role'} =~/^st/) {
                    483:                 &store_aggregates($symb,$courseid);
                    484:             }
1.159     albertel  485: 	}
1.323     albertel  486:     } else {
                    487: 	&Apache::lonxml::debug('Nothing to store');
1.67      albertel  488:     }
1.159     albertel  489:     return $result;
1.65      albertel  490: }
                    491: 
1.285     raeburn   492: # -------------------------------------------------------------store_aggregates
                    493: # Sends hash of values to be incremented in nohist_resourcetracker.db
                    494: # for the course. Increments total number of attempts, unique students 
                    495: # and corrects for each part for an instance of a problem, as appropriate.
                    496: sub store_aggregates {
                    497:     my ($symb,$courseid) = @_;
1.286     albertel  498:     my %aggregate;
                    499:     my @parts;
1.288     albertel  500:     my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    501:     my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
1.286     albertel  502:     foreach my $key (keys(%Apache::lonhomework::results)) {
1.287     albertel  503:         if ($key =~ /resource\.([^\.]+)\.tries/) {
1.286     albertel  504:             push(@parts, $1);
1.285     raeburn   505:         }
                    506:     }
1.286     albertel  507:     foreach my $part (@parts) {
                    508:         if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
                    509: 	    eq 'APPROX_ANS' ||
                    510: 	    $Apache::lonhomework::results{'resource.'.$part.'.award'}
                    511: 	    eq 'EXACT_ANS') {
1.287     albertel  512:             $aggregate{$symb."\0".$part."\0correct"} = 1;
1.285     raeburn   513:         }
1.286     albertel  514:         if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {
1.287     albertel  515:             $aggregate{$symb."\0".$part."\0users"} = 1;
1.292     raeburn   516:         } else {
1.293     albertel  517:             my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]); 
1.292     raeburn   518:             if ($last_reset) {
1.293     albertel  519:                 if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {
1.292     raeburn   520:                     $aggregate{$symb."\0".$part."\0users"} = 1;
                    521:                 }
                    522:             }
1.285     raeburn   523:         }
1.287     albertel  524:         $aggregate{$symb."\0".$part."\0attempts"} = 1;
1.285     raeburn   525:     }
1.292     raeburn   526:     if (keys (%aggregate) > 0) {
1.289     albertel  527: 	&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
1.292     raeburn   528:                             $cdomain,$cname);
                    529:     }
                    530: }
1.289     albertel  531: 
1.65      albertel  532: sub checkout_msg {
1.211     albertel  533:     my %lt=&Apache::lonlocal::texthash( 
                    534: 		'resource'=>'The resource needs to be checked out',
                    535: 		'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.',
                    536:                 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
                    537:                 'checkout'=>'Check out Exam for Viewing',
                    538: 		'checkout?'=>'Check out Exam?');
1.352     albertel  539:     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.159     albertel  540:     return (<<ENDCHECKOUT);
1.211     albertel  541: <h2>$lt{'resource'}</h2>
                    542:     <p>$lt{'id_expln'}</p>
                    543: <font color="red">
                    544: <p>$lt{'warning'}</p>
1.91      albertel  545: </font>
1.352     albertel  546: <form name="checkout" method="POST" action="$uri">
1.91      albertel  547: <input type="hidden" name="doescheckout" value="yes" />
1.211     albertel  548: <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
1.65      albertel  549: </form>
                    550: ENDCHECKOUT
                    551: }
                    552: 
1.252     albertel  553: sub firstaccess_msg {
1.253     albertel  554:     my ($time,$symb)=@_;
                    555:     my ($map)=&Apache::lonnet::decode_symb($symb);
                    556:     my $foldertitle=&Apache::lonnet::gettitle($map);
                    557:     &Apache::lonxml::debug("map is $map title is $foldertitle");
1.352     albertel  558:     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.252     albertel  559:     return (<<ENDCHECKOUT);
1.253     albertel  560: <h2>The resources in "$foldertitle" are open for a limited time. Once you click the 'Show Resource' button below you have $time to complete all resources "$foldertitle".</h2>
1.352     albertel  561: <form name="markaccess" method="POST" action="$uri">
1.252     albertel  562: <input type="hidden" name="markaccess" value="yes" />
                    563: <input type="button" name="accessbutton" value="Show Resource" onClick="javascript:if (confirm('Start Timer?')) { document.markaccess.submit(); }" />
                    564: </form>
                    565: ENDCHECKOUT
                    566: }
                    567: 
1.204     albertel  568: sub init_problem_globals {
                    569:     my ($type)=@_;
                    570:     #initialize globals
1.308     foxr      571:     #   For problems, we start out in part 0 (outside a <part> tag).
                    572:     #   and part 0 is used to describe the main body of the <problem>
                    573:     #
1.204     albertel  574:     if ($type eq 'problem') {
                    575: 	$Apache::inputtags::part='0';
                    576: 	@Apache::inputtags::partlist=('0');
1.266     albertel  577: 	$Apache::lonhomework::problemstatus=&get_problem_status('0');
                    578: 	$Apache::lonhomework::ignore_response_errors=0;
1.308     foxr      579: 
1.266     albertel  580:     } elsif ($type eq 'library') {
1.204     albertel  581: 	$Apache::inputtags::part='';
                    582: 	@Apache::inputtags::partlist=();
                    583: 	$Apache::lonhomework::problemstatus='';	
1.266     albertel  584: 	$Apache::lonhomework::ignore_response_errors=1;
1.308     foxr      585: 
1.304     albertel  586:     } elsif ($type eq 'Task') {
                    587: 	$Apache::inputtags::part='0';
                    588: 	@Apache::inputtags::partlist=('0');
                    589: 	$Apache::lonhomework::problemstatus='';	
                    590: 	$Apache::lonhomework::ignore_response_errors=1;
1.204     albertel  591:     }
                    592:     @Apache::inputtags::responselist = ();
                    593:     @Apache::inputtags::importlist = ();
                    594:     @Apache::inputtags::previous=();
                    595:     @Apache::inputtags::previous_version=();
                    596:     $Apache::structuretags::printanswer='No';
                    597:     @Apache::structuretags::whileconds=();
                    598:     @Apache::structuretags::whilebody=();
                    599:     @Apache::structuretags::whileline=();
                    600:     $Apache::lonhomework::scantronmode=0;
                    601:     undef($Apache::lonhomework::name);
1.358     albertel  602:     undef($Apache::lonhomework::default_type);
                    603:     undef($Apache::lonhomework::type);
1.204     albertel  604: }
                    605: 
                    606: sub reset_problem_globals {
                    607:     my ($type)=@_;
                    608:     undef(%Apache::lonhomework::history);
                    609:     undef(%Apache::lonhomework::results);
                    610:     undef($Apache::inputtags::part);
1.208     albertel  611: #don't undef this, lonhomework.pm takes care of this, we use this to 
                    612: #detect if we try to do 2 problems in one file
                    613: #   undef($Apache::lonhomework::parsing_a_problem);
1.204     albertel  614:     undef($Apache::lonhomework::name);
1.358     albertel  615:     undef($Apache::lonhomework::default_type);
                    616:     undef($Apache::lonhomework::type);
                    617:     undef($Apache::lonhomework::scantronmode);
                    618:     undef($Apache::lonhomework::problemstatus);
                    619:     undef($Apache::lonhomework::ignore_response_errors);
1.204     albertel  620: }
                    621: 
1.241     albertel  622: sub set_problem_state {
1.240     albertel  623:     my ($part)=@_;
1.284     albertel  624:     if ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {
1.240     albertel  625: 	$Apache::lonhomework::history{"resource.$part.solved"}=
                    626: 	    'correct_by_student';
                    627:     }
                    628: }
                    629: 
1.241     albertel  630: sub get_problem_status {
                    631:     my ($part)=@_;
1.267     albertel  632:     my $problem_status;
1.284     albertel  633:     if ($env{'request.state'} eq 'construct' &&
                    634: 	defined($env{'form.problemstatus'})) {
                    635: 	$problem_status=$env{'form.problemstatus'};
1.267     albertel  636:     } else {
                    637: 	$problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");
                    638: 	&Apache::lonxml::debug("problem status for $part is $problem_status");
1.284     albertel  639: 	&Apache::lonxml::debug("env probstat is ".$env{'form.problemstatus'});
1.241     albertel  640:     }
                    641:     return $problem_status;
                    642: }
                    643: 
1.9       albertel  644: sub start_problem {
1.326     albertel  645:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.19      albertel  646: 
1.311     foxr      647:     # We'll use the redirection to fix up printing of duedates.
1.321     albertel  648:     if (!$Apache::lonxml::metamode) {
                    649: 	&Apache::lonxml::startredirection();
                    650:     }
1.311     foxr      651: 
1.308     foxr      652:     # Problems don't nest and we don't allow more than one <problem> in
                    653:     # a .problem file.
                    654:     #
1.184     albertel  655:     if ( $Apache::inputtags::part ne '' ||
                    656: 	 $Apache::lonhomework::parsing_a_problem) {
                    657: 	&Apache::lonxml::error('Only one &lt;problem&gt; allowed in a .problem file');
1.326     albertel  658: 	#my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,$style);
1.159     albertel  659: 	return '';
                    660:     }
1.184     albertel  661: 
                    662:     $Apache::lonhomework::parsing_a_problem=1;
1.204     albertel  663:     &init_problem_globals('problem');
1.166     albertel  664: 
1.284     albertel  665:     if (defined($env{'scantron.maxquest'})) {
1.166     albertel  666: 	$Apache::lonhomework::scantronmode=1;
                    667:     }
1.161     albertel  668: 
1.159     albertel  669:     if ($target ne 'analyze') {
                    670: 	$Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
1.284     albertel  671: 	if (($env{'request.state'} eq 'construct') &&
                    672: 	    defined($env{'form.problemtype'})) {
                    673: 	    $Apache::lonhomework::type=$env{'form.problemtype'};
1.237     albertel  674: 	}
1.332     albertel  675: 	&Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
1.159     albertel  676:     }
1.164     albertel  677:     if ($Apache::lonhomework::type eq '' ) {
1.284     albertel  678: 	my $uri=$env{'request.uri'};
1.159     albertel  679: 	if ($uri=~/\.(\w+)$/) {
                    680: 	    $Apache::lonhomework::type=$1;
                    681: 	    &Apache::lonxml::debug("Using type of $1");
                    682: 	} else {
                    683: 	    $Apache::lonhomework::type='problem';
                    684: 	    &Apache::lonxml::debug("Using default type, problem, :$uri:");
                    685: 	}
1.87      albertel  686:     }
1.301     albertel  687:     $Apache::lonhomework::default_type = $Apache::lonhomework::type;
1.58      www       688: 
1.363     albertel  689:     &initialize_storage();
1.389     albertel  690:     if ($target ne 'analyze'
                    691:        	&& $env{'request.state'} eq 'construct') {
                    692: 	&set_problem_state('0');
                    693:     }
                    694: 
1.366     albertel  695:     if ($target eq 'web') {
                    696: 	&Apache::lonxml::debug(" grading history ");
                    697: 	&Apache::lonhomework::showhash(%Apache::lonhomework::history);
                    698:     }
1.363     albertel  699: 
1.159     albertel  700:     #added vars to the scripting enviroment
1.213     albertel  701:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.248     albertel  702:     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.24      albertel  703:     &Apache::run::run($expression,$safeeval);
1.159     albertel  704:     my $status;
                    705:     my $accessmsg;
                    706: 
1.343     albertel  707:     my $name= &get_resource_name($parstack,$safeeval);
1.350     albertel  708:     my ($result,$form_tag_start);
1.354     albertel  709:     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
                    710: 	|| $target eq 'edit') {
1.350     albertel  711: 	($result,$form_tag_start) =
                    712: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
                    713: 			$name);
                    714:     }
                    715: 
1.284     albertel  716:     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
1.159     albertel  717: 
                    718:     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
                    719:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    720: 	$target eq 'tex') {
                    721: 	#handle exam checkout
                    722: 	if ($Apache::lonhomework::type eq 'exam') {
                    723: 	    my $token=
                    724: 		$Apache::lonhomework::history{"resource.0.outtoken"};
1.284     albertel  725: 	    if (($env{'form.doescheckout'}) && (!$token)) {
1.159     albertel  726: 		$token=&Apache::lonxml::maketoken();
                    727: 		$Apache::lonhomework::history{"resource.0.outtoken"}=
                    728: 		    $token;
                    729: 	    }
1.343     albertel  730: 	    $result.=&Apache::lonxml::printtokenheader($target,$token);
1.142     albertel  731: 	}
1.284     albertel  732: 	if ($env{'form.markaccess'}) {
1.252     albertel  733: 	    &Apache::lonnet::set_first_access('map');
                    734: 	}
1.159     albertel  735: 	#handle rand seed in construction space
                    736: 	my $rndseed=&setup_rndseed($safeeval);
1.367     albertel  737: 	my ($symb)=&Apache::lonnet::whichuser();
1.333     albertel  738: 	if ($env{'request.state'} ne "construct" && 
                    739: 	    ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
1.162     albertel  740: 	    $form_tag_start.='<input type="hidden" name="rndseed" value="'.
                    741: 		$rndseed.'" />'.
                    742: 		    '<input type="submit" name="resetdata"
1.334     albertel  743:                              value="'.&mt('New Problem Variation').'" />';
                    744: 	    if (exists($env{'form.username'})) {
                    745: 		$form_tag_start.=
1.164     albertel  746: 		    '<input type="hidden" name="username"
1.284     albertel  747:                              value="'.$env{'form.username'}.'" />';
1.334     albertel  748: 	    }
1.333     albertel  749: 	    if ($env{'request.role.adv'}) {
1.267     albertel  750: 		$form_tag_start.=
1.300     albertel  751: 		    ' <label><input type="checkbox" name="showallfoils" ';
1.284     albertel  752: 		if (defined($env{'form.showallfoils'})) {
1.267     albertel  753: 		    $form_tag_start.='checked="on"';
                    754: 		}
1.300     albertel  755: 		$form_tag_start.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').
                    756: 		    '</label>';
1.267     albertel  757: 	    }
                    758: 	    $form_tag_start.='<hr />';
1.162     albertel  759: 	}
1.324     albertel  760: 
                    761: 	($status,$accessmsg,my $slot_name,my $slot) = 
                    762: 	    &Apache::lonhomework::check_slot_access('0','problem');
1.159     albertel  763: 	push (@Apache::inputtags::status,$status);
1.324     albertel  764: 
1.159     albertel  765: 	my $expression='$external::datestatus="'.$status.'";';
                    766: 	$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
                    767: 	&Apache::run::run($expression,$safeeval);
                    768: 	&Apache::lonxml::debug("Got $status");
1.324     albertel  769: 
1.159     albertel  770: 	if (( $status eq 'CLOSED' ) ||
                    771: 	    ( $status eq 'UNCHECKEDOUT') ||
1.252     albertel  772: 	    ( $status eq 'NOT_YET_VIEWED') ||
1.159     albertel  773: 	    ( $status eq 'BANNED') ||
1.216     albertel  774: 	    ( $status eq 'UNAVAILABLE') ||
1.324     albertel  775: 	    ( $status eq 'NOT_IN_A_SLOT') ||
1.216     albertel  776: 	    ( $status eq 'INVALID_ACCESS')) {
1.326     albertel  777: 	    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
                    778: 						       $style);
1.159     albertel  779: 	    if ( $target eq "web" ) {
1.343     albertel  780: 		my $msg;
1.159     albertel  781: 		if ($status eq 'UNAVAILABLE') {
1.245     albertel  782: 		    $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
1.253     albertel  783: 		} elsif ($status ne 'NOT_YET_VIEWED') {
1.245     albertel  784: 		    $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
1.159     albertel  785: 		}
1.216     albertel  786: 		if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
1.393     www       787: 		    $msg.=&mt('The problem ').$accessmsg;
1.159     albertel  788: 		} elsif ($status eq 'UNCHECKEDOUT') {
1.343     albertel  789: 		    $msg.=&checkout_msg();
1.252     albertel  790: 		} elsif ($status eq 'NOT_YET_VIEWED') {
1.253     albertel  791: 		    $msg.=&firstaccess_msg($accessmsg,$symb);
1.325     albertel  792: 		} elsif ($status eq 'NOT_IN_A_SLOT') {
                    793: 		    $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work.");
1.159     albertel  794: 		}
                    795: 		$result.=$msg.'<br />';
                    796: 	    } elsif ($target eq 'tex') {
1.332     albertel  797: 		my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
                    798: 		                    : '\begin{minipage}{\textwidth}';
                    799: 		$result.='\begin{document}\noindent \vskip 1 mm '.
                    800: 		    $startminipage.'\vskip 0 mm';
1.159     albertel  801: 		if ($status eq 'UNAVAILABLE') {
1.211     albertel  802: 		    $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
1.159     albertel  803: 		} else {
1.211     albertel  804: 		    $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
1.159     albertel  805: 		}
                    806: 	    }
1.324     albertel  807: 	} elsif ($status eq 'NEEDS_CHECKIN') {
1.326     albertel  808: 	    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
                    809: 						       $style);
1.324     albertel  810: 	    if ($target eq 'web') {
1.375     albertel  811: 		$result .= 
                    812: 		    &Apache::bridgetask::proctor_validation_screen($slot);
1.324     albertel  813: 	    } elsif ($target eq 'grade') {
                    814: 		&Apache::bridgetask::proctor_check_auth($slot_name,$slot,
                    815: 							'problem');
                    816: 	    }
1.159     albertel  817: 	} elsif ($target eq 'web') {
1.360     albertel  818: 	    if ($status eq 'CAN_ANSWER' 
                    819: 		&& $slot_name ne ''
                    820: 		&& $Apache::lonhomework::history{'resource.0.checkedin'} eq '') {
                    821: 		# unproctored slot access, self checkin
                    822: 		&Apache::bridgetask::check_in('problem',undef,undef,
                    823: 					      $slot_name);
                    824: 	    }
1.368     albertel  825: 	    $result.="\n $form_tag_start \t".	
1.227     albertel  826: 	      '<input type="hidden" name="submitted" value="yes" />';
                    827: 	    # create a page header and exit
1.284     albertel  828: 	    if ($env{'request.state'} eq "construct") {
                    829: 		$result.= &problem_web_to_edit_header($env{'form.rndseed'});
1.227     albertel  830: 	    }
                    831: 	    # if we are viewing someone else preserve that info
1.284     albertel  832: 	    if (defined $env{'form.grade_symb'}) {
1.227     albertel  833: 		foreach my $field ('symb','courseid','domain','username') {
                    834: 		    $result .= '<input type="hidden" name="grade_'.$field.
1.284     albertel  835: 			'" value="'.$env{"form.grade_$field"}.'" />'."\n";
1.159     albertel  836: 		}
                    837: 	    }
                    838: 	} elsif ($target eq 'tex') {
1.319     foxr      839: 	    $result .= 'INSERTTEXFRONTMATTERHERE';
                    840: 
1.99      sakharuk  841: 	}
1.159     albertel  842:     } elsif ($target eq 'edit') {
1.343     albertel  843: 	$result .= $form_tag_start.&problem_edit_header();
1.226     albertel  844: 	$Apache::lonxml::warnings_error_header=
                    845: 	    &mt("Editor Errors - these errors might not effect the running of the problem, but they will likely cause problems with further use of the Edit mode. Please use the EditXML mode to fix these errors.")."<br />";
1.159     albertel  846: 	my $temp=&Apache::edit::insertlist($target,$token);
                    847: 	$result.=$temp;
                    848:     } elsif ($target eq 'modified') {
                    849: 	$result=$token->[4];
                    850:     } else {
                    851: 	# page_start returned a starting result, delete it if we don't need it
                    852: 	$result = '';
1.99      sakharuk  853:     }
1.159     albertel  854:     return $result;
1.9       albertel  855: }
                    856: 
                    857: sub end_problem {
1.159     albertel  858:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.321     albertel  859:     my $result;
1.310     foxr      860: 
1.321     albertel  861:     if (!$Apache::lonxml::metamode) {
                    862: 	$result = &Apache::lonxml::endredirection(); #started in &start_problem
1.329     albertel  863: 	$Apache::lonxml::post_evaluate=0;
1.321     albertel  864:     }
1.319     foxr      865: 
                    866:     if ($target eq 'tex') {
1.321     albertel  867: 	# Figure out the front matter and replace the
                    868: 	# INSERTTEXFRONTMATTERHERE in result with it.  note that we do
                    869: 	# this in end_problem because whether or not we display due
                    870: 	# dates depends on whether due dates have already been
                    871: 	# displayed in the problem parts.
                    872: 
1.319     foxr      873: 	my $frontmatter   = '';
                    874: 	my $startminipage = '';
                    875: 	if (not $env{'form.problem_split'}=~/yes/) {
                    876: 	    $startminipage = '\begin{minipage}{\textwidth}';
                    877: 	}
                    878: 	my $id = $Apache::inputtags::part;
                    879: 	my $weight = &Apache::lonnet::EXT("resource.$id.weight");
                    880: 	my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
                    881: 	my @packages = split /,/,$packages;
                    882: 	my $allow_print_points = 0;
                    883: 	foreach my $partial_key (@packages) {
                    884: 	    if ($partial_key=~m/^part_0$/) {
                    885: 		$allow_print_points=1;
                    886: 	    }
                    887: 	}
                    888: 	my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
                    889: 	if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; }
                    890: 	if (lc($env{'course.'.$env{'request.course.id'}.
                    891: 			'.disableexampointprint'}) eq 'yes') {
                    892: 	    $allow_print_points=0;
                    893: 	}
                    894: 	my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
                    895: 	my $begin_doc='\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$env{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent ';
                    896: 	my $toc_line='\vskip 1 mm\noindent '.$startminipage.
                    897: 	    '\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
                    898: 	
                    899: 	#  Figure out what the due date is and if we need to print
                    900: 	#  it in the problem header.  We have been logging the
                    901: 	#  last due date written to file. 
                    902: 	
                    903: 	my $duetime = &Apache::lonnet::EXT("resource.$id.duedate"); 
                    904: 	my $duedate = POSIX::strftime("%c",localtime($duetime));
                    905: 	my $temp_file;
                    906: 	my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
                    907: 	
                    908: 	# Figure out what the last printed due date is or set it
                    909: 	# to the epoch if no duedates have been printed.
                    910: 	
                    911: 	my $due_file_content = 0;      #   If the file does not yet exist, time is the epoch.
                    912: 	if (-e $filename) {
                    913: 	    $temp_file = Apache::File->new($filename);
                    914: 	    my @due_file      = <$temp_file>;
                    915: 	    $due_file_content = $due_file[$#due_file];
                    916: 	    chomp $due_file_content;
                    917: 	} 
                    918: 	
                    919: 	# We display the due date iff it is not the same as the last
                    920: 	# duedate in problem header ($due_file_content), and
                    921: 	# none of our parts displayed a duedate.
                    922: 	#
                    923: 	my $parts_with_displayduedate;
                    924: 	if (defined $Apache::outputtags::showonce{'displayduedate'}) {
                    925: 	    $parts_with_displayduedate = 
                    926: 		scalar(@{$Apache::outputtags::showonce{'displayduedate'}});
                    927: 	} else {
                    928: 	    $parts_with_displayduedate = 0;
                    929: 	}
                    930: 	if (($due_file_content != $duetime) && ($parts_with_displayduedate == 0) ) {
                    931: 	    $temp_file = Apache::File->new('>'.$filename);
                    932: 	    print $temp_file "$duetime\n";
                    933: 	    if (not $env{'request.symb'} =~ m/\.page_/) {
                    934: 		if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
                    935: 		    $frontmatter .= $begin_doc.
                    936: 			'\textit{Due date: '.$duedate.'} '.$toc_line;
                    937: 		} else {
                    938: 		    $frontmatter.= $begin_doc.$toc_line;
                    939: 		    if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}
                    940: 		}
                    941: 	    } else {
1.381     albertel  942: 		$frontmatter .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\'.$startminipage;
1.319     foxr      943: 	    }
                    944: 	} else {
                    945: 	    if (not $env{'request.symb'} =~ m/\.page_/) {
                    946: 		$frontmatter .= $begin_doc.$toc_line;
                    947: 		if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';}
                    948: 	    } else {
1.381     albertel  949: 		$frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
1.319     foxr      950: 	    }
                    951: 	}
                    952: 	$result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
                    953:     }
                    954: 
1.159     albertel  955:     my $status=$Apache::inputtags::status['-1'];
                    956:     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
                    957: 	$target eq 'tex') {
1.249     albertel  958: 	if ( $target eq 'grade' && $Apache::inputtags::part eq '0') {
1.159     albertel  959: 	    # if part is zero, no <part>s existed, so we need to the grading
1.249     albertel  960: 	    if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) {
                    961: 		&Apache::inputtags::grade;
1.324     albertel  962: 	    } elsif ($status eq 'NEEDS_CHECKIN') {
                    963: 		# no need to grade, and don't want to hide data
1.249     albertel  964: 	    } else {
                    965: 		# move any submission data to .hidden
                    966: 		&Apache::inputtags::hidealldata($Apache::inputtags::part);
                    967: 	    }
1.159     albertel  968: 	} elsif ( ($target eq 'web' || $target eq 'tex') &&
                    969: 		  $Apache::inputtags::part eq '0' &&
1.252     albertel  970: 		  $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
1.159     albertel  971: 	    # if part is zero, no <part>s existed, so we need show the current
                    972: 	    # grading status
                    973: 	    my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
                    974: 	    $result.= $gradestatus;
                    975: 	}
                    976: 	if (
1.284     albertel  977: 	    (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
1.159     albertel  978: 	    ($target eq 'answer') || ($target eq 'tex')
                    979: 	   ) {
1.227     albertel  980: 	    if ($target ne 'tex' &&
1.284     albertel  981: 		$env{'form.answer_output_mode'} ne 'tex') {
1.254     www       982: 		$result.="</form>";
1.348     albertel  983: 		$result.= &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields());
1.159     albertel  984: 	    }
                    985: 	    if ($target eq 'web') {
1.346     albertel  986: 		$result.= &Apache::loncommon::end_page({'discussion' => 1});
1.159     albertel  987: 	    } elsif ($target eq 'tex') {
1.178     sakharuk  988: 		my $endminipage = '';
1.284     albertel  989: 		if (not $env{'form.problem_split'}=~/yes/) {
1.178     sakharuk  990: 		    $endminipage = '\end{minipage}';
                    991: 		}
1.284     albertel  992:                 if ($env{'form.print_discussions'} eq 'yes') {
1.263     sakharuk  993: 		    $result.=&Apache::lonxml::xmlend($target,$parser);
1.159     albertel  994: 		} else {
1.262     sakharuk  995: 		    $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
1.284     albertel  996: 		    if (not $env{'request.symb'} =~ m/\.page_/) {
1.262     sakharuk  997: 			$result .= $endminipage.'\end{document} ';
                    998: 		    } else {
1.382     albertel  999: 			$result .= $endminipage;
1.262     sakharuk 1000: 		    }
1.159     albertel 1001: 		}
                   1002: 	    }
                   1003: 	}
                   1004: 	if ($target eq 'grade') {
                   1005: 	    &Apache::lonhomework::showhash(%Apache::lonhomework::results);
                   1006: 	    &finalize_storage();
                   1007: 	}
1.284     albertel 1008: 	if ($target eq 'answer' && ($env{'request.state'} eq 'construct')
                   1009: 	    && $env{'form.answer_output_mode'} ne 'tex') {
1.346     albertel 1010: 	    $result.=&Apache::loncommon::end_page({'discussion' => 1});
1.294     albertel 1011: 	                        # normally we get it from above, but in CSTR
1.172     albertel 1012: 	                        # we always show answer mode too.
1.159     albertel 1013: 	}
                   1014:     } elsif ($target eq 'meta') {
                   1015: 	if ($Apache::inputtags::part eq '0') {
1.179     albertel 1016: 	    @Apache::inputtags::response=();
1.159     albertel 1017: 	    $result=&Apache::response::mandatory_part_meta;
                   1018: 	}
1.215     albertel 1019: 	$result.=&Apache::response::meta_part_order();
1.258     albertel 1020: 	$result.=&Apache::response::meta_response_order();
1.159     albertel 1021:     } elsif ($target eq 'edit') {
                   1022: 	&Apache::lonxml::debug("in end_problem with $target, edit");
1.314     albertel 1023: 	$result .= &problem_edit_footer();
1.320     albertel 1024:     } elsif ($target eq 'modified') {
                   1025: 	 $result .= $token->[2];
1.159     albertel 1026:     }
1.155     albertel 1027: 
1.284     albertel 1028:     if ($env{'request.state'} eq 'construct' && $target eq 'web') {
1.177     albertel 1029: 	&Apache::inputtags::check_for_duplicate_ids();
                   1030:     }
1.204     albertel 1031: 
                   1032:     &reset_problem_globals('problem');
1.159     albertel 1033: 
                   1034:     return $result;
1.48      albertel 1035: }
                   1036: 
1.108     albertel 1037: 
1.48      albertel 1038: sub start_library {
1.159     albertel 1039:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.343     albertel 1040:     my ($result,$form_tag_start);
1.371     albertel 1041:     if ($#$tagstack eq 0 && $$tagstack[0] eq 'library') {
1.244     albertel 1042: 	&init_problem_globals('library');
                   1043: 	$Apache::lonhomework::type='problem';
                   1044:     }
1.159     albertel 1045:     if ($target eq 'edit') {
1.343     albertel 1046: 	($result,$form_tag_start)=
                   1047: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
                   1048: 			'Edit');
                   1049: 	$result.=$form_tag_start.&problem_edit_header();
1.159     albertel 1050: 	my $temp=&Apache::edit::insertlist($target,$token);
                   1051: 	$result.=$temp;
                   1052:     } elsif ($target eq 'modified') {
                   1053: 	$result=$token->[4];
1.340     albertel 1054:     } elsif (($target eq 'web' || $target eq 'webgrade')
1.371     albertel 1055: 	     && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')
1.340     albertel 1056: 	     && $env{'request.state'} eq "construct" ) {
1.159     albertel 1057: 	my $name=&get_resource_name($parstack,$safeeval);
1.343     albertel 1058: 	($result,$form_tag_start)=
                   1059: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
                   1060: 			$name);
1.159     albertel 1061: 	my $rndseed=&setup_rndseed($safeeval);
1.343     albertel 1062: 	$result.=" \n $form_tag_start".	
1.159     albertel 1063: 		  '<input type="hidden" name="submitted" value="yes" />';
                   1064: 	$result.=&problem_web_to_edit_header($rndseed);
                   1065:     }
                   1066:     return $result;
1.48      albertel 1067: }
                   1068: 
                   1069: sub end_library {
1.159     albertel 1070:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1071:     my $result='';
                   1072:     if ($target eq 'edit') {
                   1073: 	$result=&problem_edit_footer();
1.371     albertel 1074:     } elsif ($target eq 'web' 
                   1075: 	     && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') 
                   1076: 	     && $env{'request.state'} eq "construct") {
1.349     albertel 1077: 	$result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
1.159     albertel 1078:     }
1.371     albertel 1079:     if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
                   1080: 	&reset_problem_globals('library');
                   1081:     }
1.159     albertel 1082:     return $result;
1.197     www      1083: }
                   1084: 
                   1085: sub start_definetag {
1.326     albertel 1086:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.197     www      1087: 
                   1088:     my $result;
                   1089: 
                   1090:     my $name = $token->[2]->{'name'};
1.326     albertel 1091:     my $skip=&Apache::lonxml::get_all_text("/definetag",$parser,$style);
1.396     albertel 1092:     if ($target eq 'web') {
                   1093: 	if ($name=~/^\//) {
                   1094: 	    $result=
                   1095: 		'<br /><table class="LC_sty_end"><tr><th>'.
                   1096: 		&mt('END [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
                   1097: 	} else {
                   1098: 	    $result=
                   1099: 		'<br /><table class="LC_sty_begin"><tr><th>'.
                   1100: 		&mt('BEGIN [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
                   1101: 	}
                   1102: 	$skip = &HTML::Entities::encode($skip, '<>&"');
                   1103: 	$result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';
1.197     www      1104:     }
                   1105:     return $result;
                   1106: }
                   1107: 
                   1108: sub end_definetag {
                   1109:     return '';
1.1       albertel 1110: }
                   1111: 
                   1112: sub start_block {
1.201     albertel 1113:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.131     albertel 1114: 
                   1115:     my $result;
1.1       albertel 1116: 
1.339     albertel 1117:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer'  ||
                   1118: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.159     albertel 1119: 	my $code = $token->[2]->{'condition'};
1.385     albertel 1120: 	if (defined($code) && $code ne '') {
1.137     albertel 1121: 	    if (!$Apache::lonxml::default_homework_loaded) {
                   1122: 		&Apache::lonxml::default_homework_load($safeeval);
                   1123: 	    }
1.131     albertel 1124: 	    $result = &Apache::run::run($code,$safeeval);
                   1125: 	    &Apache::lonxml::debug("block :$code: returned :$result:");
                   1126: 	} else {
                   1127: 	    $result='1';
                   1128: 	}
                   1129: 	if ( ! $result ) {
1.201     albertel 1130: 	    my $skip=&Apache::lonxml::get_all_text("/block",$parser,$style);
1.131     albertel 1131: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                   1132: 	}
                   1133: 	$result='';
                   1134:     } elsif ($target eq 'edit') {
                   1135: 	$result .=&Apache::edit::tag_start($target,$token);
                   1136: 	$result .=&Apache::edit::text_arg('Test Condition:','condition',
                   1137: 					  $token,40);
                   1138: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1139:     } elsif ($target eq 'modified') {
                   1140: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1141: 						     $safeeval,'condition');
                   1142: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.38      albertel 1143:     }
1.131     albertel 1144:     return $result;
1.1       albertel 1145: }
                   1146: 
                   1147: sub end_block {
1.167     www      1148:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1149:     my $result;
                   1150:     if ($target eq "edit") {
                   1151: 	$result.= &Apache::edit::tag_end($target,$token,'');
                   1152:     }
                   1153:     return $result;
                   1154: }
                   1155: 
                   1156: sub start_languageblock {
1.201     albertel 1157:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.167     www      1158: 
                   1159:     my $result;
                   1160: 
1.339     albertel 1161:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1162: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.201     albertel 1163: 	my $include = $token->[2]->{'include'};
                   1164: 	my $exclude = $token->[2]->{'exclude'};
1.398     www      1165:         my @preferred_languages=&Apache::loncommon::preferred_languages();
1.394     www      1166: # This should not even happen, since we should at least have the server language
1.398     www      1167:         if (!$preferred_languages[0]) { $preferred_languages[0]='en'; }
                   1168: # Now loop over all languages in order of preference
                   1169:         foreach my $preferred_language (@preferred_languages) {
1.394     www      1170: # If the languageblock has no arguments, show the contents
1.399     www      1171:            $result=1;
                   1172:            my $found=0;
1.394     www      1173: # Do we have an include argument?
1.398     www      1174: 	   if ($include) {
1.394     www      1175: # If include is specified, by default, don't render the block
1.399     www      1176:               $result=0;
1.398     www      1177:               foreach my $included_language (split(/\,/,$include)) {
1.394     www      1178: # ... but if my preferred language is included, render it
1.398     www      1179:                  if ($included_language eq $preferred_language) {
1.399     www      1180:                     $result=1; 
                   1181:                     $found=1; 
1.398     www      1182:                  }
                   1183:               }
                   1184: 	   }
1.394     www      1185: # Do we have an exclude argument?
1.398     www      1186:            if ($exclude) {
1.399     www      1187:               $result=1;
1.398     www      1188:               foreach my $excluded_language (split(/\,/,$exclude)) {
                   1189:                  if ($excluded_language eq $preferred_language) {
1.399     www      1190:                     $result=0;
                   1191:                     $found=1;
1.398     www      1192:                  }
                   1193:               }
                   1194: 	   }
1.399     www      1195:            if ($found) { last; }
1.398     www      1196:         }
1.201     albertel 1197: 	if ( ! $result ) {
                   1198: 	    my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,
                   1199: 						   $style);
                   1200: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                   1201: 	}
                   1202: 	$result='';
1.167     www      1203:     } elsif ($target eq 'edit') {
                   1204: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel 1205: 	$result .=&Apache::edit::text_arg(&mt('Include Language:'),'include',
1.167     www      1206: 					  $token,40);
1.211     albertel 1207: 	$result .=&Apache::edit::text_arg(&mt('Exclude Language:'),'exclude',
1.167     www      1208: 					  $token,40);
                   1209: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1210:     } elsif ($target eq 'modified') {
                   1211: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.168     albertel 1212: 						     $safeeval,'include',
                   1213: 						     'exclude');
1.167     www      1214: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   1215:     }
                   1216:     return $result;
                   1217: }
                   1218: 
                   1219: sub end_languageblock {
1.170     www      1220:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1221:     my $result;
1.201     albertel 1222:     if ($target eq "edit") {
1.170     www      1223: 	$result.= &Apache::edit::tag_end($target,$token,'');
                   1224:     }
                   1225:     return $result;
                   1226: }
                   1227: 
1.397     albertel 1228: {
                   1229:     my %available_texts;
                   1230:     sub start_translated {
                   1231: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1232: 	&Apache::lonxml::register('Apache::structuretags',('lang'));
                   1233: 	undef(%available_texts);
                   1234:     }
                   1235:     
                   1236:     sub end_translated {
                   1237: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1238: 	my $result;
                   1239: 	#show the translation on viewable targets
                   1240: 	if ($target eq 'web'     || $target eq 'tex' || $target eq 'webgrade'||
                   1241: 	    # or non-viewable targets, if it's embedded in something that
                   1242: 	    # wants the output
                   1243: 	    (($target eq 'answer' || $target eq 'analyze'|| $target eq 'grade')
                   1244: 	     && &Apache::lonxml::in_redirection() ) ) {
                   1245: 	    my @possibilities = keys(%available_texts);
                   1246: 	    my $which = 
                   1247: 		&Apache::loncommon::languages(\@possibilities) || 'default';
                   1248: 	    $result = $available_texts{$which};
                   1249: 	}
                   1250: 	undef(%available_texts);
                   1251: 	&Apache::lonxml::deregister('Apache::structuretags',('lang'));
                   1252: 	return $result;
                   1253:     }
                   1254: 
                   1255: 
                   1256:     sub start_lang {
                   1257: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1258: 	if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1259: 	    $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
                   1260: 	    &Apache::lonxml::startredirection();
                   1261: 	}
                   1262: 	return '';
                   1263:     }
                   1264: 
                   1265:     sub end_lang {
                   1266: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1267: 	if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1268: 	    $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
                   1269: 	    my $result = &Apache::lonxml::endredirection();
                   1270: 	    my $which = &Apache::lonxml::get_param('which',$parstack,
                   1271: 						   $safeeval);
                   1272: 	    $available_texts{$which} = $result;
                   1273: 	}
                   1274: 	return '';
                   1275:     }
                   1276: }
                   1277: 
1.170     www      1278: sub start_instructorcomment {
1.201     albertel 1279:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.170     www      1280: 
                   1281:     my $result;
                   1282: 
1.339     albertel 1283:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1284: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.284     albertel 1285:         $result=($env{'request.role'}=~/^(in|cc|au|ca|li)/);
                   1286: 	if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {
1.201     albertel 1287: 	    my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
                   1288: 						   $parser,$style);
1.170     www      1289: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                   1290: 	}
                   1291: 	$result='';
                   1292:     } elsif ($target eq 'edit') {
                   1293: 	$result .=&Apache::edit::tag_start($target,$token);
                   1294: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1295:     }
                   1296:     return $result;
                   1297: }
                   1298: 
                   1299: sub end_instructorcomment {
1.159     albertel 1300:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel 1301:     my $result;
                   1302:     if ($target eq "edit") {
                   1303: 	$result.= &Apache::edit::tag_end($target,$token,'');
                   1304:     }
                   1305:     return $result;
1.4       tsai     1306: }
                   1307: 
                   1308: sub start_while {
1.326     albertel 1309:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 1310: 
1.160     albertel 1311:     my $result;
1.339     albertel 1312:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1313: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160     albertel 1314: 	my $code = $token->[2]->{'condition'};
1.4       tsai     1315: 
1.160     albertel 1316: 	push( @Apache::structuretags::whileconds, $code);
                   1317: 	if (!$Apache::lonxml::default_homework_loaded) {
                   1318: 	    &Apache::lonxml::default_homework_load($safeeval);
                   1319: 	}
                   1320: 	my $result = &Apache::run::run($code,$safeeval);
1.326     albertel 1321: 	my $bodytext=&Apache::lonxml::get_all_text("/while",$parser,$style);
1.160     albertel 1322: 	push( @Apache::structuretags::whilebody, $bodytext);
1.161     albertel 1323: 	push( @Apache::structuretags::whileline, $token->[5]);
                   1324: 	&Apache::lonxml::debug("s code $code got -$result-");
1.160     albertel 1325: 	if ( $result ) {
                   1326: 	    &Apache::lonxml::newparser($parser,\$bodytext);
                   1327: 	}
                   1328:     } elsif ($target eq 'edit') {
                   1329: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel 1330: 	$result .=&Apache::edit::text_arg(&mt('Test Condition:'),'condition',
1.160     albertel 1331: 					  $token,40);
                   1332: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1333:     } elsif ($target eq 'modified') {
                   1334: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1335: 						     $safeeval,'condition');
                   1336: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.159     albertel 1337:     }
1.160     albertel 1338:     return $result;
1.4       tsai     1339: }
                   1340: 
                   1341: sub end_while {
1.159     albertel 1342:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel 1343:     my $result;
                   1344: 
1.339     albertel 1345:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1346: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160     albertel 1347: 	my $code = pop(@Apache::structuretags::whileconds);
                   1348: 	my $bodytext = pop(@Apache::structuretags::whilebody);
1.161     albertel 1349: 	my $line = pop(@Apache::structuretags::whileline);
                   1350: 	my $return = &Apache::run::run($code,$safeeval);
                   1351: 	my $starttime=time;
                   1352: 	my $error=0;
                   1353: 	while ($return) {
                   1354: 	    if (time-$starttime >
                   1355: 		$Apache::lonnet::perlvar{'lonScriptTimeout'}) {
1.378     albertel 1356: 		$return = 0; $error=1; next;
1.161     albertel 1357: 	    }
                   1358: 	    $result.=&Apache::scripttag::xmlparse($bodytext);
1.380     albertel 1359: 	    if ($target eq 'grade' || $target eq 'answer' ||
                   1360: 		$target eq 'analyze') {
                   1361: 		# grade/answer/analyze should produce no output but if we
                   1362: 		# are redirecting, the redirecter should know what to do
                   1363: 		# with the output
                   1364: 		if (!$Apache::lonxml::redirection) { undef($result); }
                   1365: 	    }
1.161     albertel 1366: 	    $return = &Apache::run::run($code,$safeeval);
                   1367: 	}
                   1368: 	if ($error) {
1.270     albertel 1369: 	    &Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occured while running &lt;while&gt; on line').' '.$line.'</pre>');
1.160     albertel 1370: 	}
                   1371:     } elsif ($target eq "edit") {
                   1372: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.159     albertel 1373:     }
1.160     albertel 1374:     return $result;
1.1       albertel 1375: }
1.6       tsai     1376: 
1.160     albertel 1377: # <randomlist show="1">
1.6       tsai     1378: #  <tag1>..</tag1>
                   1379: #  <tag2>..</tag2>
                   1380: #  <tag3>..</tag3>
1.160     albertel 1381: #  ...
1.6       tsai     1382: # </randomlist>
                   1383: sub start_randomlist {
1.326     albertel 1384:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 1385:     my $result;
1.339     albertel 1386:     if ($target eq 'answer' || $target eq 'grade'   || $target eq 'web' ||
                   1387: 	$target eq 'tex'    || $target eq 'analyze' || $target eq 'webgrade') {
1.331     albertel 1388: 	my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
1.305     albertel 1389: 	my $b_parser= HTML::LCParser->new(\$body);
                   1390: 	$b_parser->xml_mode(1);
                   1391: 	$b_parser->marked_sections(1);
1.159     albertel 1392: 	my $b_tok;
                   1393: 	my @randomlist;
                   1394: 	my $list_item;
                   1395: 	while($b_tok = $b_parser->get_token() ) {
                   1396: 	    if($b_tok->[0] eq 'S') { # start tag
                   1397: 		# get content of the tag until matching end tag
                   1398: 		# get all text upto the matching tag
                   1399: 		# and push the content into @randomlist
                   1400: 		$list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],
                   1401: 							   $b_parser);
                   1402: 		$list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
                   1403: 		push(@randomlist,$list_item);
                   1404: 		#  print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4],
                   1405:                 #         $list_item</b>";
                   1406: 	    }
                   1407: 	    if($b_tok->[0] eq 'T') { # text
                   1408: 		# what to do with text in between tags?
                   1409: 		#  print "<b>TEXT $b_tok->[1]</b><br />";
                   1410: 	    }
                   1411: 	    # if($b_tok->[0] eq 'E') { # end tag, should not happen
                   1412: 	    #  print "<b>END-TAG $b_tok->[1]</b><br />";
                   1413: 	    # }
                   1414: 	}
1.303     albertel 1415: 	if (@randomlist) {
                   1416: 	    my @idx_arr = (0 .. $#randomlist);
                   1417: 	    &Apache::structuretags::shuffle(\@idx_arr);
                   1418: 	    my $bodytext = '';
                   1419: 	    my $show=$#randomlist;
                   1420: 	    my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
                   1421: 	    $showarg--;
                   1422: 	    if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
                   1423: 	    for(0 .. $show) {
                   1424: 		$bodytext .= "$randomlist[ $idx_arr[$_] ]";
                   1425: 	    }
                   1426: 	    &Apache::lonxml::newparser($parser,\$bodytext);
1.159     albertel 1427: 	}
                   1428:     } elsif ($target eq 'edit' ) {
                   1429: 	$result .=&Apache::edit::tag_start($target,$token);
                   1430: 	$result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
                   1431: 					   $token,5);
                   1432: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1433:     } elsif ($target eq 'modified' ) {
                   1434: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1435: 						     $safeeval,'show');
                   1436: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   1437:     }
                   1438:     return $result;
1.7       tsai     1439: }
                   1440: 
                   1441: sub shuffle {
                   1442:     my $a=shift;
                   1443:     my $i;
1.303     albertel 1444:     if (ref($a) eq 'ARRAY' && @$a) {
1.251     albertel 1445: 	&Apache::response::pushrandomnumber();
1.159     albertel 1446: 	for($i=@$a;--$i;) {
                   1447: 	    my $j=int(&Math::Random::random_uniform() * ($i+1));
                   1448: 	    next if $i == $j;
                   1449: 	    @$a[$i,$j] = @$a[$j,$i];
                   1450: 	}
1.251     albertel 1451: 	&Apache::response::poprandomnumber();
1.7       tsai     1452:     }
1.6       tsai     1453: }
                   1454: 
                   1455: sub end_randomlist {
1.159     albertel 1456:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1457:     my $result;
                   1458:     if ($target eq 'edit' ) {
                   1459: 	$result=&Apache::edit::tag_end($target,$token,
                   1460: 				       'End Randomly Parsed Block');
                   1461:     }
                   1462:     return $result;
1.6       tsai     1463: }
                   1464: 
1.283     albertel 1465: sub ordered_show_check {
                   1466:     my $last_part=$Apache::inputtags::partlist[-2];
                   1467:     my $in_order=
                   1468: 	&Apache::lonnet::EXT('resource.'.$Apache::inputtags::part.'.ordered');
                   1469:     my $in_order_show=1;
                   1470:     if ($last_part ne '0' && lc($in_order) eq 'yes') {
                   1471: 	$in_order_show=&Apache::response::check_status($last_part);
                   1472:     }
                   1473:     return $in_order_show;
                   1474: }
                   1475: 
1.11      albertel 1476: sub start_part {
1.326     albertel 1477:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.321     albertel 1478:     if (!$Apache::lonxml::metamode) {
                   1479: 	&Apache::lonxml::startredirection(); # we'll use redirection to fix up 
                   1480: 	                                     # duedates.
                   1481:     }
1.159     albertel 1482:     my $result='';
1.386     albertel 1483:     my $id= &Apache::lonxml::get_id($parstack,$safeeval);
1.159     albertel 1484:     $Apache::inputtags::part=$id;
1.177     albertel 1485:     push(@Apache::inputtags::partlist,$id);
                   1486:     @Apache::inputtags::response=();
1.159     albertel 1487:     @Apache::inputtags::previous=();
                   1488:     @Apache::inputtags::previous_version=();
1.241     albertel 1489:     $Apache::lonhomework::problemstatus=&get_problem_status($id);
1.159     albertel 1490:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.259     albertel 1491:     my $newtype=&Apache::lonnet::EXT("resource.$id.type");
                   1492:     if ($newtype) { $Apache::lonhomework::type=$newtype; }
1.283     albertel 1493:     my $in_order_show=&ordered_show_check();
1.214     albertel 1494:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.259     albertel 1495:     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.209     albertel 1496:     &Apache::run::run($expression,$safeeval);
1.159     albertel 1497: 
                   1498:     if ($target eq 'meta') {
1.224     www      1499: 	my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
                   1500: 	return &Apache::response::mandatory_part_meta.
                   1501: 	       &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
1.159     albertel 1502:     } elsif ($target eq 'web' || $target eq 'grade' ||
                   1503: 	     $target eq 'answer' || $target eq 'tex') {
1.283     albertel 1504: 	if ($hidden || !$in_order_show) {
1.326     albertel 1505: 	    my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,$style);
1.159     albertel 1506: 	} else {
                   1507: 	    my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
                   1508: 	    push (@Apache::inputtags::status,$status);
                   1509: 	    my $expression='$external::datestatus="'.$status.'";';
                   1510: 	    $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
                   1511: 	    &Apache::run::run($expression,$safeeval);
1.284     albertel 1512: 	    if ($env{'request.state'} eq 'construct') {
1.241     albertel 1513: 		&set_problem_state($Apache::inputtags::part); 
1.240     albertel 1514: 	    }
1.216     albertel 1515: 	    if (( $status eq 'CLOSED' ) ||
                   1516: 		( $status eq 'UNCHECKEDOUT') ||
1.252     albertel 1517: 		( $status eq 'NOT_YET_VIEWED') ||
1.216     albertel 1518: 		( $status eq 'BANNED') ||
                   1519: 		( $status eq 'UNAVAILABLE') ||
                   1520: 		( $status eq 'INVALID_ACCESS')) {
1.326     albertel 1521: 		my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,
                   1522: 							   $style);
1.159     albertel 1523: 		if ( $target eq "web" ) {
1.211     albertel 1524: 		    $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";
1.159     albertel 1525: 		} elsif ( $target eq 'tex' ) {
1.284     albertel 1526: 		    if (not $env{'form.problem_split'}=~/yes/) {
1.211     albertel 1527: 			$result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";
1.195     sakharuk 1528: 		    } else {
1.211     albertel 1529: 			$result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";
1.195     sakharuk 1530: 		    }
1.159     albertel 1531: 		}
                   1532: 	    } else {
                   1533: 		if ($target eq 'tex') {
1.284     albertel 1534: 		    if (not $env{'form.problem_split'}=~/yes/) {
1.264     sakharuk 1535: 			if ($$tagstack[-2] eq 'td') {
1.388     foxr     1536: 			    $result.='\noindent \begin{minipage}{\textwidth}\noindent';
1.264     sakharuk 1537: 			} else {
                   1538: 			    $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
                   1539: 			}
1.195     sakharuk 1540: 		    }
1.159     albertel 1541: 		    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.284     albertel 1542: 		    my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1.222     sakharuk 1543: 		    my @allkeys = split /,/,$allkeys;
                   1544: 		    my $allow_print_points = 0;
                   1545: 		    foreach my $partial_key (@allkeys) {
1.230     albertel 1546: 			if ($partial_key=~m/^part_(.*)$/) {
1.222     sakharuk 1547: 			    if ($1 ne '0') {$allow_print_points=1;}
                   1548: 			}
                   1549: 		    }
1.275     albertel 1550: 		    my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
                   1551: 		    if (defined($maxtries) && $maxtries < 0) {
                   1552: 			$allow_print_points=0;
                   1553: 		    }
1.302     albertel 1554: 		    if (lc($env{'course.'.$env{'request.course.id'}.
                   1555: 				    '.disableexampointprint'}) eq 'yes') {
                   1556: 			$allow_print_points=0;
                   1557: 		    }
1.222     sakharuk 1558: 		    if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
1.233     www      1559: 		} elsif ($target eq 'web') {
1.356     www      1560: 		    $result.='<a name="'.&escape($Apache::inputtags::part).'" />';
1.159     albertel 1561: 		}
                   1562: 	    }
                   1563: 	}
                   1564:     } elsif ($target eq 'edit') {
                   1565: 	$result.=&Apache::edit::tag_start($target,$token);
                   1566: 	$result.=&Apache::edit::text_arg('Part ID:','id',$token).
                   1567: 	    &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
1.224     www      1568: 	    '&nbsp;&nbsp;'.
                   1569: &Apache::edit::text_arg('Displayed Part Description:','display',$token).
1.159     albertel 1570: 		&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1571:     } elsif ($target eq 'modified') {
                   1572: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.225     albertel 1573: 						     $safeeval,'id','display');
1.159     albertel 1574: 	if ($constructtag) {
1.225     albertel 1575: 	    #limiting ids to only letters numbers, and space
1.224     www      1576: 	    $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
1.159     albertel 1577: 	    $result = &Apache::edit::rebuild_tag($token);
                   1578: 	}
                   1579:     }
                   1580:     return $result;
1.11      albertel 1581: }
                   1582: 
                   1583: sub end_part {
1.159     albertel 1584:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1585:     &Apache::lonxml::debug("in end_part $target ");
                   1586:     my $status=$Apache::inputtags::status['-1'];
                   1587:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.283     albertel 1588:     my $in_order_show=&ordered_show_check();
1.321     albertel 1589:     my $result;
                   1590:     if (!$Apache::lonxml::metamode) {
                   1591: 	$result = &Apache::lonxml::endredirection(); # started in &start_part
1.329     albertel 1592: 	$Apache::lonxml::post_evaluate=0;
1.321     albertel 1593:     }
1.312     albertel 1594:     if ($target eq 'grade') {
1.249     albertel 1595: 	if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&
1.283     albertel 1596: 	    !$hidden && $in_order_show) {
1.311     foxr     1597: 	    $result.=&Apache::inputtags::grade;
1.249     albertel 1598: 	} else {
                   1599: 	    # move any submission data to .hidden
                   1600: 	    &Apache::inputtags::hidealldata($Apache::inputtags::part);
                   1601: 	}
1.283     albertel 1602:     } elsif (($target eq 'web' || $target eq 'tex') &&
                   1603: 	     !$hidden && $in_order_show) {
1.159     albertel 1604: 	my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
                   1605: 							$target);
1.212     albertel 1606: 	if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
                   1607: 	    $gradestatus='';
                   1608: 	}
1.311     foxr     1609: 	$result.=$gradestatus;
1.265     sakharuk 1610: 	if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} 
1.181     albertel 1611:     } elsif ($target eq 'edit') {
1.311     foxr     1612: 	$result.=&Apache::edit::end_table();
1.322     albertel 1613:     } elsif ($target eq 'modified') {
                   1614: 	 $result .= $token->[2];
1.159     albertel 1615:     }
                   1616:     pop @Apache::inputtags::status;
                   1617:     $Apache::inputtags::part='';
1.295     albertel 1618:     $Apache::lonhomework::type = $Apache::lonhomework::default_type;
1.159     albertel 1619:     return $result;
1.11      albertel 1620: }
1.1       albertel 1621: 
1.25      albertel 1622: sub start_preduedate {
1.326     albertel 1623:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.339     albertel 1624:     if ($target eq 'web' || $target eq 'grade'    || $target eq 'answer' ||
                   1625: 	$target eq 'tex' || $target eq 'webgrade') {
1.236     albertel 1626: 	&Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);
1.300     albertel 1627: 	if (!$Apache::lonhomework::scantronmode &&
                   1628: 	    $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
1.236     albertel 1629: 	    $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
                   1630: 	    &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));
1.326     albertel 1631: 	    &Apache::lonxml::get_all_text("/preduedate",$parser,$style);
1.159     albertel 1632: 	}
1.24      albertel 1633:     }
1.159     albertel 1634:     return '';
1.24      albertel 1635: }
                   1636: 
1.25      albertel 1637: sub end_preduedate {
1.159     albertel 1638:     return '';
1.24      albertel 1639: }
                   1640: 
1.369     foxr     1641: # In all the modes where <postanswerdate> text is 
                   1642: # displayable,  all we do is eat up the text between the start/stop
                   1643: # tags if the conditions are not right to display it.
1.25      albertel 1644: sub start_postanswerdate {
1.326     albertel 1645:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.370     foxr     1646:     my $pav = &Apache::lonnet::allowed('pav', $env{'request.course.id'}) ||
                   1647: 	&Apache::lonnet::allowed('pav',
                   1648: 			   $env{'request.course.id'}.'/'.$env{'request.course.sec'});
1.369     foxr     1649:     if ($target eq 'web' || $target eq 'grade' || $target eq 'webgrade' ||
1.370     foxr     1650: 	$target eq 'tex' ) {
1.300     albertel 1651: 	if ($Apache::lonhomework::scantronmode ||
1.370     foxr     1652: 	    $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER' ||
                   1653: 	    (($target eq 'tex') && !$pav)) {
1.326     albertel 1654: 	    &Apache::lonxml::get_all_text("/postanswerdate",$parser,$style);
1.159     albertel 1655: 	}
                   1656:     }
                   1657:     return '';
1.24      albertel 1658: }
                   1659: 
1.25      albertel 1660: sub end_postanswerdate {
1.159     albertel 1661:     return '';
1.24      albertel 1662: }
                   1663: 
1.25      albertel 1664: sub start_notsolved {
1.326     albertel 1665:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 1666:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.339     albertel 1667: 	$target eq 'tex' || $target eq 'webgrade') {
1.159     albertel 1668: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
                   1669: 	&Apache::lonxml::debug("not solved has :$gradestatus:");
1.239     albertel 1670: 	if ($gradestatus =~ /^correct/ &&
                   1671: 	    &Apache::response::show_answer()) {
1.159     albertel 1672: 	    &Apache::lonxml::debug("skipping");
1.326     albertel 1673: 	    &Apache::lonxml::get_all_text("/notsolved",$parser,$style);
1.159     albertel 1674: 	}
1.24      albertel 1675:     }
1.159     albertel 1676:     return '';
1.24      albertel 1677: }
                   1678: 
1.25      albertel 1679: sub end_notsolved {
1.159     albertel 1680:     return '';
1.24      albertel 1681: }
                   1682: 
                   1683: sub start_solved {
1.326     albertel 1684:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 1685:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1686: 	$target eq 'tex') {
                   1687: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
1.239     albertel 1688: 	if ($gradestatus !~ /^correct/ ||
                   1689: 	    !&Apache::response::show_answer()) {
1.326     albertel 1690: 	    &Apache::lonxml::get_all_text("/solved",$parser,$style);
1.159     albertel 1691: 	}
1.24      albertel 1692:     }
1.159     albertel 1693:     return '';
1.24      albertel 1694: }
                   1695: 
                   1696: sub end_solved {
1.248     albertel 1697:     return '';
                   1698: }
                   1699: 
                   1700: sub start_problemtype {
1.326     albertel 1701:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.248     albertel 1702:     my $result;
1.339     albertel 1703:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1704: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.248     albertel 1705: 	my $mode=lc(&Apache::lonxml::get_param('mode',$parstack,$safeeval));
                   1706: 	if (!defined($mode)) { $mode='show'; }
                   1707: 	my $for=&Apache::lonxml::get_param('for',$parstack,$safeeval);
                   1708: 	my $found=0;
                   1709: 	foreach my $type (split(',',$for)) {
                   1710: 	    if ($Apache::lonhomework::type eq lc($type)) { $found=1; }
                   1711: 	}
                   1712: 	if ($mode eq 'show' && !$found) {
1.326     albertel 1713: 	    &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248     albertel 1714: 	}
                   1715: 	if ($mode eq 'hide' && $found) {
1.326     albertel 1716: 	    &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248     albertel 1717: 	}
                   1718:     } elsif ($target eq 'edit') {
                   1719: 	$result .=&Apache::edit::tag_start($target,$token);
                   1720: 	$result.=&Apache::edit::select_arg('Mode:','mode',
                   1721: 					   [['show','Show'],
                   1722: 					    ['hide','Hide']]
                   1723: 					   ,$token);
                   1724: 	$result .=&Apache::edit::checked_arg('When used as type(s):','for',
                   1725: 					     [ ['exam','Exam/Quiz Problem'],
                   1726: 					       ['survey','Survey'],
                   1727: 					       ['problem','Homework Problem'] ]
                   1728: 					     ,$token);
                   1729: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1730:     } elsif ($target eq 'modified') {
                   1731: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1732: 						     $safeeval,'mode','for');
                   1733: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   1734:     }
                   1735:     return $result;
                   1736: }
                   1737: 
                   1738: sub end_problemtype {
1.159     albertel 1739:     return '';
1.24      albertel 1740: }
1.34      albertel 1741: 
                   1742: sub start_startouttext {
1.159     albertel 1743:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1744:     my @result=(''.'');
                   1745:     if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
                   1746:     return (@result);
1.34      albertel 1747: }
1.159     albertel 1748: 
1.34      albertel 1749: sub end_startouttext {
1.326     albertel 1750:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 1751:     my $result='';
                   1752:     my $text='';
                   1753: 
                   1754:     if ($target eq 'edit') {
1.326     albertel 1755: 	$text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.211     albertel 1756: 	$result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>
                   1757: <td>".&mt('Delete:').
1.159     albertel 1758:                  &Apache::edit::deletelist($target,$token)
                   1759: 		 ."</td>
1.42      albertel 1760: <td>".
1.159     albertel 1761:                  &Apache::edit::insertlist($target,$token).
1.362     albertel 1762: 		 '</td><td align="right" valign="top">' .
                   1763: 		 &Apache::loncommon::helpLatexCheatsheet().
1.159     albertel 1764: 		 &Apache::edit::end_row().
1.362     albertel 1765:                  &Apache::edit::start_spanning_row()."\n".
1.255     www      1766: 		 &Apache::edit::editfield($token->[1],$text,"",80,8,1);
1.159     albertel 1767:     }
                   1768:     if ($target eq 'modified') {
1.219     albertel 1769: 	$result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);
1.159     albertel 1770:     }
                   1771:     if ($target eq 'tex') {
                   1772: 	$result .= '\noindent ';
                   1773:     }
                   1774:     return $result;
1.34      albertel 1775: }
1.159     albertel 1776: 
1.34      albertel 1777: sub start_endouttext {
1.159     albertel 1778:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1779:     my $result='';
                   1780:     if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
                   1781:     if ($target eq "modified") {
                   1782: 	$result='<endouttext />'.
1.377     albertel 1783: 	    &Apache::edit::handle_insertafter('startouttext');
                   1784:     }
1.159     albertel 1785:     return $result;
1.34      albertel 1786: }
1.159     albertel 1787: 
1.34      albertel 1788: sub end_endouttext {
1.159     albertel 1789:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1790:     my @result=('','');
                   1791:     if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
                   1792:     return (@result);
1.34      albertel 1793: }
1.159     albertel 1794: 
1.45      albertel 1795: sub delete_startouttext {
1.326     albertel 1796:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1797:     #  my $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.159     albertel 1798:     my $text=$$parser['-1']->get_text("/endouttext");
                   1799:     my $ntoken=$$parser['-1']->get_token();
                   1800:     &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
                   1801:     &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
                   1802:     # Deleting 2 parallel tag pairs, but we need the numbers later to look like
                   1803:     # they did the last time round
                   1804:     &Apache::lonxml::increasedepth($ntoken);
                   1805:     &Apache::lonxml::decreasedepth($ntoken);
                   1806:     return 1;
1.193     www      1807: }
                   1808: 
                   1809: sub start_simpleeditbutton {
                   1810:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1811:     my $result='';
1.284     albertel 1812:     if (($env{'form.simple_edit_button'} ne 'off') &&
1.273     albertel 1813: 	($target eq 'web') &&
1.330     albertel 1814:         (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
1.284     albertel 1815:         my $url=$env{'request.noversionuri'};
1.193     www      1816:         $url=~s/\?.*$//;
1.367     albertel 1817: 	my ($symb) = &Apache::lonnet::whichuser();
1.194     www      1818: 	$result='<table width="100%" bgcolor="#FFFFAA" border="2"><tr><td>'.
1.356     www      1819:                 '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'.&mt('Edit').'</a> - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.').
1.196     www      1820: &Apache::loncommon::help_open_topic('Caching').'</td></tr></table><br />';
1.193     www      1821:     }
                   1822:     return $result;
                   1823: }
                   1824: 
                   1825: sub end_simpleeditbutton {
                   1826:     return '';
1.45      albertel 1827: }
1.34      albertel 1828: 
1.1       albertel 1829: 1;
                   1830: __END__

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