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

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.484   ! raeburn     4: # $Id: structuretags.pm,v 1.483 2010/12/31 02:40:14 raeburn 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.435     jms        30: =pod
                     31: 
                     32: =head1 NAME
                     33: 
                     34: Apache::structuretags
                     35: 
                     36: =head1 SYNOPSIS
                     37: 
                     38: 
                     39: This is part of the LearningOnline Network with CAPA project
                     40: described at http://www.lon-capa.org.
                     41: 
                     42: 
                     43: =head1 NOTABLE SUBROUTINES
                     44: 
                     45: =over
                     46: 
                     47: =item 
                     48: 
                     49: =back
                     50: 
                     51: =cut
                     52: 
1.133     sakharuk   53: 
1.1       albertel   54: package Apache::structuretags; 
                     55: 
                     56: use strict;
                     57: use Apache::lonnet;
1.101     sakharuk   58: use Apache::File();
1.147     www        59: use Apache::lonmenu;
1.210     albertel   60: use Apache::lonlocal;
1.231     sakharuk   61: use Apache::lonxml;
1.434     foxr       62: use Apache::londefdef;
1.338     albertel   63: use Apache::lonenc();
1.267     albertel   64: use Time::HiRes qw( gettimeofday tv_interval );
1.356     www        65: use lib '/home/httpd/lib/perl/';
                     66: use LONCAPA;
                     67:  
1.78      harris41   68: BEGIN {
1.469     www        69:     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));
1.10      albertel   70: }
                     71: 
                     72: sub start_web {
1.326     albertel   73:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.383     albertel   74:     if ($target ne 'edit' && $target ne 'modified') {
                     75: 	my $bodytext=&Apache::lonxml::get_all_text("/web",$parser,$style);
                     76: 	if ($target eq 'web' || $target eq 'webgrade') {
                     77: 	    return $bodytext;
                     78: 	}
                     79:     } elsif ($target eq "edit" ) {
                     80: 	my $bodytext = 
                     81: 	    &Apache::lonxml::get_all_text_unbalanced("/web",$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("/web",$parser);
1.159     albertel   87:     }
                     88:     return '';
1.10      albertel   89: }
                     90: 
                     91: sub end_web {
1.44      ng         92:     return '';
1.10      albertel   93: }
                     94: 
                     95: sub start_tex {
1.326     albertel   96:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.198     sakharuk   97:     my $result='';
1.383     albertel   98:     if ($target ne 'edit' && $target ne 'modified') {
                     99: 	my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style);
                    100: 	if ($target eq 'tex') {
1.434     foxr      101: 	    
                    102: 	    # If inside a table, occurrences of \\ must be removed;
                    103: 	    # else the table blows up.
                    104: 
                    105: 	    if (&Apache::londefdef::is_inside_of($tagstack, "table")) {
                    106: 		$bodytext =~ s/\\\\//g;
                    107: 	    }
1.432     foxr      108: 	    return $bodytext.'{}';
1.383     albertel  109: 	}
                    110:     } elsif ($target eq "edit" ) {
                    111: 	my $bodytext = 
                    112: 	    &Apache::lonxml::get_all_text_unbalanced("/tex",$parser);
                    113: 	my $result = &Apache::edit::tag_start($target,$token);
                    114: 	$result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1);
                    115: 	return $result;
                    116:     } elsif ( $target eq "modified" ) {
                    117: 	return $token->[4].&Apache::edit::modifiedfield("/tex",$parser);
1.159     albertel  118:     }
1.198     sakharuk  119:     return $result;;
1.10      albertel  120: }
                    121: 
                    122: sub end_tex {
1.44      ng        123:     return '';
1.9       albertel  124: }
                    125: 
1.400     albertel  126: sub homework_js {
                    127:     return &Apache::loncommon::resize_textarea_js().
1.416     raeburn   128:            &setmode_javascript().
1.400     albertel  129: 	<<'JS';
                    130: <script type="text/javascript">
1.483     raeburn   131: // <![CDATA[
1.400     albertel  132: function setSubmittedPart (part) {
                    133:    this.document.lonhomework.submitted.value="part_"+part;
                    134: }
                    135: 
                    136: function image_response_click (which, e) {
                    137:     init_geometry();
                    138:     if (!e) { e = window.event; } //IE
                    139:     var input_element = document.lonhomework.elements[which];
1.401     albertel  140:     var token_element = document.lonhomework.elements[which+'_token'];
1.400     albertel  141:     var token = token_element.value;
1.401     albertel  142:     var img_element   = document.getElementById(which+'_imageresponse');
1.400     albertel  143:     var x= e.clientX-getX(img_element)+Geometry.getHorizontalScroll();
                    144:     var y= e.clientY-getY(img_element)+Geometry.getVerticalScroll();
                    145:     var click = x+':'+y;
                    146:     input_element.value = click;
1.483     raeburn   147:     img_element.src = '/adm/randomlabel.png?token='+token+'&amp;clickdata='+click;
1.400     albertel  148: }
1.483     raeburn   149: // ]]>
1.400     albertel  150: </script>
                    151: JS
                    152: }
                    153: 
1.416     raeburn   154: sub setmode_javascript {
                    155:     return <<"ENDSCRIPT";
                    156: <script type="text/javascript">
                    157: function setmode(form,probmode) {
                    158:     form.problemmode.value = probmode;
                    159:     form.submit();
                    160: }
                    161: </script>
                    162: ENDSCRIPT
                    163: }
                    164: 
1.478     raeburn   165: sub file_delchk_js {
1.484   ! raeburn   166:     my $delfilewarn = &mt('You have indicated you wish to remove some files previously included in your submission.').'\\n'.
        !           167:                       &mt('Continue submission with these files removed?');
1.478     raeburn   168:     return <<"ENDSCRIPT";
                    169: <script type="text/javascript">
1.483     raeburn   170: // <![CDATA[
1.478     raeburn   171: function file_deletion_check(formname) {
                    172:     var elemnum = formname.elements.length;
                    173:     if (elemnum == 0) {
                    174:         return true;
                    175:     }
1.482     raeburn   176:     var str = new RegExp("^HWFILE.+_delete\$");
                    177:     var delboxes = new Array();
                    178:     for (var i=0; i<formname.elements.length; i++) {
1.478     raeburn   179:         var id = formname.elements[i].id;
                    180:         if (id != '') {
                    181:             if (str.test(id)) {
                    182:                 if (formname.elements[i].type == 'checkbox') {
                    183:                     if (formname.elements[i].checked) {
1.482     raeburn   184:                         delboxes.push(id);
1.478     raeburn   185:                     }
                    186:                 }
                    187:             }
                    188:         }
                    189:     }
1.482     raeburn   190:     if (delboxes.length > 0) {
1.478     raeburn   191:         if (confirm("$delfilewarn")) {
                    192:             return true;
                    193:         } else {
1.482     raeburn   194:             for (var j=0; j<delboxes.length; j++) {
                    195:                 formname.elements[delboxes[j]].checked = false;
                    196:             }
1.478     raeburn   197:             return false;
                    198:         }
                    199:     } else {
                    200:         return true;
                    201:     }
                    202: }
1.483     raeburn   203: // ]]>
1.478     raeburn   204: </script>
                    205: ENDSCRIPT
                    206: }
                    207: 
1.48      albertel  208: sub page_start {
1.345     albertel  209:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
                    210: 	$extra_head)=@_;
1.159     albertel  211:     my %found;
1.207     albertel  212:     foreach my $taginside (@$tagstack) {
1.159     albertel  213: 	foreach my $taglookedfor ('html','body','form') {
                    214: 	    if ($taginside =~ /^$taglookedfor$/i) {$found{$taglookedfor} = 1;}
                    215: 	}
                    216:     }
                    217: 
1.343     albertel  218:     if ($target eq 'tex') {
                    219: 	return
                    220: 	    &Apache::londefdef::start_html($target,$token,$tagstack,
                    221: 					   $parstack,$parser,$safeeval);
                    222:     }
                    223: 
1.474     raeburn   224:     $extra_head .= &homework_js().
                    225:                    &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
                    226:     if (&Apache::lonhtmlcommon::htmlareabrowser()) {
                    227:         my %textarea_args = (
                    228:                                 dragmath => 'math',
                    229:                               );
                    230:         $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);
1.425     raeburn   231:     }
1.478     raeburn   232:     my $is_task = ($env{'request.uri'} =~ /\.task$/);
                    233:     if ($is_task) {
                    234:         $extra_head .= &file_delchk_js();
                    235:     }
1.425     raeburn   236: 
1.344     albertel  237:     my %body_args;
                    238:     if (defined($found{'html'})) {
                    239: 	$body_args{'skip_phases'}{'head'}=1;
                    240:     } else {
1.343     albertel  241: 	
1.345     albertel  242: 	$extra_head .= &Apache::lonhtmlcommon::spellheader();
1.343     albertel  243: 
1.379     albertel  244: 	$extra_head .= &Apache::londefdef::generate_css_links();
                    245: 
1.384     albertel  246: 	if ($env{'request.state'} eq 'construct') {
1.343     albertel  247: 	    $extra_head.=&Apache::edit::js_change_detection().
                    248: 		"<script type=\"text/javascript\">\n".
                    249: 		"if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
                    250: 		&Apache::loncommon::browser_and_searcher_javascript().
                    251:                 "\n</script>\n";
                    252: 	}
1.159     albertel  253:     }
1.343     albertel  254: 
1.446     bisitz    255:     my $pageheader = '';
1.344     albertel  256:     if (defined($found{'body'})) {
                    257: 	$body_args{'skip_phases'}{'body'}=1;
                    258:     } elsif (!defined($found{'body'}) 
                    259: 	     && $env{'request.state'} eq 'construct') {
1.343     albertel  260: 	if ($target eq 'web' || $target eq 'edit') {
1.450     bisitz    261:         # Breadcrumbs for Construction Space
                    262:         &Apache::lonhtmlcommon::clear_breadcrumbs();
                    263:         &Apache::lonhtmlcommon::add_breadcrumb({
                    264:             'text'  => 'Construction Space',
                    265:             'href'  => &Apache::loncommon::authorspace(),
                    266:         });
1.460     droeschl  267:         # breadcrumbs (and tools) will be created 
                    268:         # in start_page->bodytag->innerregister
                    269: 
1.450     bisitz    270: # FIXME Where are we?
                    271: #        &Apache::lonhtmlcommon::add_breadcrumb({
                    272: #            'text'  => 'Problem Editing', # 'Problem Testing'
                    273: #            'href'  => '',
                    274: #        });
1.460     droeschl  275:         $pageheader =&Apache::loncommon::head_subbox(
1.446     bisitz    276:                 &Apache::loncommon::CSTR_pageheader());
1.297     albertel  277: 	}
1.272     albertel  278:     } elsif (!defined($found{'body'})) {
1.343     albertel  279: 	my %add_entries;
1.159     albertel  280: 	my $background=&Apache::lonxml::get_param('background',$parstack,
                    281: 						  $safeeval);
1.343     albertel  282: 	if ($background ne '' ) {
                    283: 	    $add_entries{'background'} = $background;
                    284: 	}
1.344     albertel  285: 
1.290     albertel  286: 	my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
                    287: 					       $safeeval);
1.446     bisitz    288:         if ($bgcolor eq '' ) { $bgcolor = '#FFFFFF'; }
1.344     albertel  289: 
1.446     bisitz    290:         $body_args{'bgcolor'}        = $bgcolor;
                    291:         # $body_args{'no_title'}       = 1;
                    292:         $body_args{'force_register'} = 1;
                    293:         $body_args{'add_entries'}    = \%add_entries;
1.466     droeschl  294:         if ( $env{'request.state'} eq   'construct') {
1.446     bisitz    295:             $body_args{'only_body'}  = 1;
                    296:         }
1.344     albertel  297:     }
1.365     albertel  298:     $body_args{'no_auto_mt_title'} = 1;
1.344     albertel  299:     my $page_start = &Apache::loncommon::start_page($name,$extra_head,
                    300: 						    \%body_args);
1.446     bisitz    301:     $page_start .= $pageheader;
1.462     raeburn   302:     if (!defined($found{'body'}) 
                    303: 	&& $env{'request.state'} ne 'construct'
                    304: 	&& ($target eq 'web' || $target eq 'webgrade')) {
                    305: 
                    306: 	my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser();
                    307:         if ($symb eq '' && !$publicuser) {
                    308:             $page_start .= '<p class="LC_info">'
                    309:                           .&mt('Browsing resource, all submissions are temporary.')
                    310:                           .'</p>';
1.457     bisitz    311:         }
1.344     albertel  312:     }
                    313: 
1.409     albertel  314:     if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') {
1.343     albertel  315: 	$page_start .= &Apache::lonxml::message_location();
1.159     albertel  316:     }
1.344     albertel  317:     
1.159     albertel  318:     my $form_tag_start;
                    319:     if (!defined($found{'form'})) {
1.337     albertel  320: 	$form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="post" action="';
1.465     raeburn   321: 	my $uri = &Apache::loncommon::inhibit_menu_check(
1.455     droeschl  322:                 &Apache::lonenc::check_encrypt($env{'request.uri'}));
1.464     raeburn   323:         $uri = &HTML::Entities::encode($uri,'<>&"');
1.327     albertel  324: 	$form_tag_start.=$uri.'" ';
                    325: 	if ($target eq 'edit') {
                    326: 	    $form_tag_start.=&Apache::edit::form_change_detection();
                    327: 	}
1.478     raeburn   328:         if ($is_task) {
                    329:             $form_tag_start .= ' onsubmit="return file_deletion_check(this);"';
                    330:         }
1.368     albertel  331: 	$form_tag_start.='>'."\n";
1.355     albertel  332: 
                    333: 	my $symb=&Apache::lonnet::symbread();
                    334: 	if ($symb =~ /\S/) {
                    335: 	    $symb=
                    336: 		&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb));
                    337: 	    $form_tag_start.=
1.368     albertel  338: 		"\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n";
1.355     albertel  339: 	}
1.159     albertel  340:     }
1.343     albertel  341:     return ($page_start,$form_tag_start);
1.105     albertel  342: }
                    343: 
1.141     matthew   344: #use Time::HiRes();
1.105     albertel  345: sub get_resource_name {
1.159     albertel  346:     my ($parstack,$safeeval)=@_;
1.388     foxr      347:     my $name;
1.204     albertel  348:     if (defined($Apache::lonhomework::name)) {
1.388     foxr      349: 	$name = $Apache::lonhomework::name;
                    350:     } else {
                    351: 	my ($symb)=&Apache::lonnet::whichuser();
1.392     albertel  352: 	$name=&Apache::lonnet::gettitle($symb);
1.388     foxr      353: 	if ($name eq '') {
                    354: 	    $name=&Apache::lonnet::EXT('resource.title');
                    355: 	    if ($name eq 'con_lost') { $name = ''; }
                    356: 	}
                    357: 	if ($name!~/\S+/) {
                    358: 	    $name=$env{'request.uri'};
                    359: 	    $name=~s-.*/([^/]+)$-$1-;
                    360: 	}
                    361: 	# The name has had html tags escaped:
                    362:        
                    363: 	$name=~s/&lt;/</gs;
                    364: 	$name=~s/&gt;/>/gs;
                    365: 
                    366: 	$Apache::lonhomework::name=$name;
1.204     albertel  367:     }
1.159     albertel  368:     return $name;
1.105     albertel  369: }
                    370: 
                    371: sub setup_rndseed {
1.479     raeburn   372:     my ($safeeval,$target)=@_;
1.367     albertel  373:     my ($symb)=&Apache::lonnet::whichuser();
1.479     raeburn   374:     my ($questiontype,$set_safespace,$rndseed);
                    375:     if ($target eq 'analyze') {
                    376:         $questiontype = $env{'form.grade_questiontype'};
                    377:     }
                    378:     unless (defined($questiontype)) {
                    379:         $questiontype = $Apache::lonhomework::type;
                    380:     }
1.333     albertel  381:     if ($env{'request.state'} eq "construct" 
                    382: 	|| $symb eq '' 
                    383: 	|| $Apache::lonhomework::type eq 'practice'
                    384: 	|| $Apache::lonhomework::history{'resource.CODE'}) {
1.316     www       385: 	&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
1.317     albertel  386: 						['rndseed']);
1.284     albertel  387: 	$rndseed=$env{'form.rndseed'};
1.159     albertel  388: 	if (!$rndseed) {
1.162     albertel  389: 	    $rndseed=$Apache::lonhomework::history{'rndseed'};
                    390: 	    if (!$rndseed) {
                    391: 		$rndseed=time;
                    392: 	    }
1.284     albertel  393: 	    $env{'form.rndseed'}=$rndseed;
1.162     albertel  394: 	}
1.479     raeburn   395:         if (($env{'request.state'} eq "construct") && 
                    396:             ($Apache::lonhomework::type eq 'randomizetry')) {
                    397:             my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
                    398:             if ($tries) {
                    399:                 $rndseed += $tries;
                    400:             }
1.480     raeburn   401:             $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
1.479     raeburn   402:         }
1.374     albertel  403: 	if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')
                    404: 	      && $env{'form.submitted'} eq 'yes')  ||
1.284     albertel  405: 	    $env{'form.newrandomization'} eq &mt('New Randomization')) {
1.190     albertel  406: 	    srand(time);
                    407: 	    $rndseed=int(rand(2100000000));
1.284     albertel  408: 	    $env{'form.rndseed'}=$rndseed;
                    409: 	    delete($env{'form.resetdata'});
                    410: 	    delete($env{'form.newrandomization'});
1.159     albertel  411: 	}
1.187     albertel  412: 	if (defined($rndseed) && $rndseed ne int($rndseed)) {
1.307     albertel  413: 	    $rndseed=join(':',&Apache::lonnet::digest($rndseed));
1.187     albertel  414:         }
1.247     albertel  415:         if ($Apache::lonhomework::history{'resource.CODE'}) {
                    416: 	   $rndseed=&Apache::lonnet::rndseed();
                    417: 	}
1.479     raeburn   418:         $set_safespace = 1;
                    419:     } elsif ($questiontype eq 'randomizetry') {
                    420:         if ($target eq 'analyze') {
                    421:             if (defined($env{'form.grade_rndseed'})) {
                    422:                 $rndseed = $env{'form.grade_rndseed'};
                    423:             }
                    424:         }
                    425:         unless (($target eq 'analyze') && (defined($rndseed))) {
                    426:             $rndseed=&Apache::lonnet::rndseed();
                    427:             my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
                    428:             if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                    429:                 $curr_try ++;
                    430:             }
                    431:             if ($rndseed =~/^(\d+)[,:](\d+)$/) {
                    432:                 $rndseed = $1;
                    433:             }
                    434:             if ($curr_try) {
                    435:                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                    436:                 if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
                    437:                     my $inc = int(($curr_try-1)/$reqtries);
                    438:                     $rndseed += $inc;
                    439:                 } else {
                    440:                     $rndseed += $curr_try;
                    441:                 }
                    442:             }
                    443:         }
                    444:         $set_safespace = 1;
                    445:     }
                    446:     if ($set_safespace) {
                    447:         if ($safeeval) {
                    448:             &Apache::lonxml::debug("Setting rndseed to $rndseed");
                    449:             &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
                    450:         }
                    451:     }
                    452:     unless (($env{'request.state'} eq "construct") || ($symb eq '')) {
                    453:         $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
1.159     albertel  454:     }
                    455:     return $rndseed;
1.105     albertel  456: }
                    457: 
1.268     albertel  458: sub remember_problem_state {
                    459:     return '
1.284     albertel  460:        <input type="hidden" name="problemstate" value="'.$env{'form.problemstate'}.'" />
                    461:        <input type="hidden" name="problemtype" value="'.$env{'form.problemtype'}.'" />
                    462:        <input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />';
1.268     albertel  463: }
                    464: 
1.423     www       465: sub problem_edit_buttons {
                    466:    return  '
1.408     albertel  467: <div class="LC_edit_problem_discards">
1.416     raeburn   468:        <input type="button" name="submitmode" accesskey="d" value="'.&mt('Discard Edits and View').'" '.
1.423     www       469:        ' onclick="javscript:setmode(this.form,'."'discard'".')"  />
1.416     raeburn   470:        <input '.&Apache::edit::submit_ask_anyway('setmode(this.form,'."'editxml'".')').' type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" />
1.407     albertel  471:        <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" />
1.408     albertel  472: </div>
                    473: <div class="LC_edit_problem_saves">
1.416     raeburn   474:        <input type="submit" name="submitbutton" accesskey="s" value="'.&mt('Save and Edit').'" />
                    475:        <input type="submit" name="submitbutton" accesskey="v" value="'.&mt('Save and View').'" />
1.423     www       476: </div>';
                    477: }
                    478: 
                    479: sub problem_edit_header {
                    480:     return '<input type="hidden" name="submitted" value="edit" /><input type="hidden" name="problemmode" value="edit" />'.
                    481: 	&Apache::structuretags::remember_problem_state().'
                    482: <div class="LC_edit_problem_header">
                    483: <div class="LC_edit_problem_header_title">
                    484: '.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').'
                    485: </div>'.
                    486: &problem_edit_buttons().'
1.459     bisitz    487: <hr style="clear:both;" />
1.409     albertel  488: '.&Apache::lonxml::message_location().'
1.408     albertel  489: </div>
                    490: '.
1.458     bisitz    491:        '<table border="0" width="100%"><tr><td bgcolor="#F8F8F8">';
1.105     albertel  492: }
                    493: 
                    494: sub problem_edit_footer {
1.412     albertel  495:     return '</td></tr></table><br />
                    496: <div class="LC_edit_problem_footer">
1.453     bisitz    497:   <hr />'.
1.423     www       498: &problem_edit_buttons().'
1.459     bisitz    499:   <hr style="clear:both;" />
1.412     albertel  500: </div>
                    501: '.
1.342     albertel  502:     "\n</form>\n".&Apache::loncommon::end_page();
1.105     albertel  503: }
                    504: 
1.235     albertel  505: sub option {
                    506:     my ($value,$name) = @_;
                    507:     my $result ="<option value='".$value."' ";
1.284     albertel  508:     if ($env{'form.'.$name} eq $value) {
1.235     albertel  509: 	$result.=" selected='on' ";
                    510:     }
                    511:     $result.='>';
                    512:     return $result;
                    513: }
                    514: 
1.105     albertel  515: sub problem_web_to_edit_header {
1.159     albertel  516:     my ($rndseed)=@_;
1.406     albertel  517:     my $result .= '<div class="LC_edit_problem_header">';
                    518: 
                    519:     if (!$Apache::lonhomework::parsing_a_task) {
                    520: 	$result .= 
                    521: 	    '<div class="LC_edit_problem_header_title">'.
                    522: 	    &mt('Problem Testing').
                    523: 	    &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area').
                    524: 	    '</div>';
                    525:     } else {
                    526: 	$result .= 
                    527: 	    '<div class="LC_edit_problem_header_title">'.
                    528: 	    &mt('Task Testing').
                    529: 	    '</div>';
                    530:     }
                    531:     
1.315     albertel  532:     my $show_all_foils_text = 
                    533: 	($Apache::lonhomework::parsing_a_task) ?
1.452     bisitz    534: 	&mt('Show All Instances')
                    535: 	: &mt('Show All Foils');
1.315     albertel  536: 
1.452     bisitz    537:     my $show_all= '<span class="LC_nobreak"><label for="showallfoils">'
                    538:                  .'<input type="checkbox" name="showallfoils"';
1.440     bisitz    539:     if (defined($env{'form.showallfoils'})) { $show_all.=' checked="checked"'; }
1.452     bisitz    540:     $show_all.= ' /> '.$show_all_foils_text
                    541:                .'</label></span>';
1.406     albertel  542: 
                    543: 
1.384     albertel  544: 
1.406     albertel  545:     $result .= '<div class="LC_edit_problem_header_status_row">';
1.313     albertel  546:     if (!$Apache::lonhomework::parsing_a_task) {
                    547: 	$result.="
1.406     albertel  548: <div class='LC_edit_problem_header_row1'>
                    549: <span class=\"LC_nobreak\">
1.405     albertel  550: ".&mt("Problem Status:")."
1.235     albertel  551: <select name='problemstate'>
1.270     albertel  552:   <option value=''></option>
1.235     albertel  553:   ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>
                    554:   ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>
                    555:   ".&option('CANNOT_ANSWER_tries'  ,'problemstate').&mt("Open with full tries")."</option>
                    556:   ".&option('CANNOT_ANSWER_correct','problemstate').&mt("Open and correct")."</option>
                    557:   ".&option('SHOW_ANSWER'          ,'problemstate').&mt("Show Answer")."</option>
                    558: </select>
1.406     albertel  559: </span>
                    560: <span class=\"LC_nobreak\">
1.405     albertel  561: ".&mt("Problem Type:")."
1.235     albertel  562: <select name='problemtype'>
1.270     albertel  563:   <option value=''></option>
1.242     albertel  564:   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>
1.428     raeburn   565:   ".&option('problem','problemtype').&mt("Homework Problem")."</option>
1.242     albertel  566:   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
1.465     raeburn   567:   ".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option>
                    568:   ".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."</option>
                    569:   ".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."</option>
1.428     raeburn   570:   ".&option('practice' ,'problemtype').&mt("Practice Problem")."</option>
1.479     raeburn   571:   ".&option('randomizetry' ,'problemtype').&mt("New Randomization Each Try")."</option>
1.235     albertel  572: </select>
1.406     albertel  573: </span>
                    574: $show_all
                    575: </div>
                    576: <div class='LC_edit_problem_header_row2'>
                    577: <span class=\"LC_nobreak\">
1.405     albertel  578: ".&mt("Feedback Mode:")."
1.235     albertel  579: <select name='problemstatus'>
                    580:   <option value=''></option>
1.242     albertel  581:   ".&option('yes','problemstatus').&mt("Show Feedback")."</option>
1.405     albertel  582:   ".&option('no', 'problemstatus').&mt("Don't Show Incorect/Correct Feedback")."</option>
                    583:   ".&option('no_feedback_ever', 'problemstatus').&mt("Don't Show Any Feedback")."</option>
1.235     albertel  584: </select>
1.406     albertel  585: </span>
                    586: ";
                    587: 
1.376     albertel  588:     } elsif ($Apache::lonhomework::parsing_a_task) {
                    589: 	$result.="
1.406     albertel  590: <div class='LC_edit_problem_header_row1'>
                    591: <span class=\"LC_nobreak\">
1.405     albertel  592: ".&mt("Problem Status:")."
1.376     albertel  593: <select name='problemstate'>
                    594:   <option value=''></option>
                    595:   ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>
                    596:   ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>
                    597:   ".&option('WEB_GRADE'            ,'problemstate').&mt("Criteria Grading")."</option>
                    598:   ".&option('SHOW_ANSWER'          ,'problemstate').&mt("Show Feedback")."</option>
                    599: </select>
1.406     albertel  600: </span>
                    601: $show_all
                    602: ";
                    603:     }
                    604:     $result.='
                    605:        <span class="LC_nobreak">
                    606:        '.&mt('Apply style file: ').'
                    607:          <input type="text" name="style_file" value="'.&HTML::Entities::encode($env{'construct.style'},'"<>&').'" />
                    608:          <a href="javascript:openbrowser(\'lonhomework\',\'style_file\',\'sty\')">'.&mt('Select').'</a>
                    609:        </span>
1.422     www       610:      </div>
                    611:      <div class="LC_edit_problem_header_row1">'.
                    612:        &Apache::lonxml::renderingoptions().'
1.406     albertel  613:      </div>
                    614:      <input type="submit" name="changeproblemmode" value="'.&mt("Change View").'" />
                    615:      <input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" />
                    616:      <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
                    617:    </div>
1.453     bisitz    618:    <hr />
1.406     albertel  619:    <div class="LC_edit_problem_header_randomize_row">
                    620:      <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />
                    621:      <input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />
                    622:      <input type="text" name="rndseed" size="10" value="'.
                    623: 	       $rndseed.'"
                    624:              onchange="javascript:document.lonhomework.changerandseed.click()" />';
                    625: 
                    626:     if (!$Apache::lonhomework::parsing_a_task) {
                    627: 	my $numtoanalyze=$env{'form.numtoanalyze'};
                    628: 	if (!$numtoanalyze) { $numtoanalyze=20; }
1.408     albertel  629: 	$result .= '<span class="LC_nobreak">'.
                    630: 	    &mt('[_1] for [_2] versions.',
1.416     raeburn   631: 		'<input type="button" name="submitmode" value="'.&mt('Calculate answers').'" '.
1.419     bisitz    632:                 'onclick="javascript:setmode(this.form,'."'calcanswers'".')" />'
                    633:                ,'<input type="text" name="numtoanalyze" value="'.
1.408     albertel  634: 		$numtoanalyze.'" size="5" />').
                    635: 		&Apache::loncommon::help_open_topic("Analyze_Problem",'',undef,undef,300).
                    636: 		'</span>';
                    637: 						    
1.313     albertel  638:     }
1.406     albertel  639: 
                    640:     $result.='
                    641:    </div>
1.453     bisitz    642:    <hr />
1.447     bisitz    643:    <div>';
1.416     raeburn   644:     $result.='<input type="hidden" name="problemmode" value="view" />';
                    645:     $result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '.
                    646:                'onclick="javascript:setmode(this.form,'."'edit'".')" />';
                    647:     $result .= '<input type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" '.
                    648:                'onclick="javascript:setmode(this.form,'."'editxml'".')" />';
1.408     albertel  649:     $result.='
                    650:    </div>
1.453     bisitz    651:    <hr />
1.409     albertel  652:    '.&Apache::lonxml::message_location().'
1.406     albertel  653: </div>';
1.159     albertel  654:     return $result;
1.48      albertel  655: }
                    656: 
1.65      albertel  657: sub initialize_storage {
1.357     albertel  658:     my ($given_symb) = @_;
1.353     albertel  659:     undef(%Apache::lonhomework::results);
                    660:     undef(%Apache::lonhomework::history);
1.357     albertel  661:     my ($symb,$courseid,$domain,$name) = 
1.367     albertel  662: 	&Apache::lonnet::whichuser($given_symb);
1.353     albertel  663:     
                    664:     # anonymous users (CODEd exams) have no data
                    665:     if ($name eq 'anonymous' 
                    666: 	&& !defined($domain)) {
                    667: 	return;
                    668:     }
                    669: 
1.333     albertel  670:     if ($env{'request.state'} eq 'construct' 
                    671: 	|| $symb eq ''
                    672: 	|| $Apache::lonhomework::type eq 'practice') {
                    673: 	
                    674: 	my $namespace = $symb || $env{'request.uri'};
                    675: 	if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
1.374     albertel  676: 	    ($env{'form.resetdata'} eq &mt('New Problem Variation')
                    677: 	     && $env{'form.submitted'} eq 'yes') ||
1.333     albertel  678: 	    $env{'form.newrandomization'} eq &mt('New Randomization')) {
                    679: 	    &Apache::lonnet::tmpreset($namespace,'',$domain,$name);
                    680: 	    &Apache::lonxml::debug("Attempt reset");
                    681: 	}
1.159     albertel  682: 	%Apache::lonhomework::history=
1.333     albertel  683: 	    &Apache::lonnet::tmprestore($namespace,'',$domain,$name);
1.159     albertel  684: 	my ($temp)=keys %Apache::lonhomework::history ;
                    685: 	&Apache::lonxml::debug("Return message of $temp");
                    686:     } else {
                    687: 	%Apache::lonhomework::history=
                    688: 	    &Apache::lonnet::restore($symb,$courseid,$domain,$name);
                    689:     }
1.353     albertel  690: 
1.159     albertel  691:     #ignore error conditions
1.67      albertel  692:     my ($temp)=keys %Apache::lonhomework::history ;
1.159     albertel  693:     if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
1.65      albertel  694: }
                    695: 
1.435     jms       696: =pod
                    697: 
                    698: =item finalize_storage()
                    699: 
                    700: 	Stores away the result has to a student's environment
                    701: 	checks form.grade_ for specific values, other wises stores
                    702: 	to the running users environment
                    703: 	Will increment totals for attempts, students, and corrects
                    704: 	if running user has student role.
                    705: 	
                    706: =cut
                    707: 
                    708: 
1.65      albertel  709: sub finalize_storage {
1.357     albertel  710:     my ($given_symb) = @_;
1.159     albertel  711:     my $result;
1.289     albertel  712:     if (%Apache::lonhomework::results) {
1.323     albertel  713: 	my @remove = grep(/^INTERNAL_/,keys(%Apache::lonhomework::results));
                    714: 	delete(@Apache::lonhomework::results{@remove});
1.357     albertel  715: 	my ($symb,$courseid,$domain,$name) = 
1.367     albertel  716: 	    &Apache::lonnet::whichuser($given_symb);
1.333     albertel  717: 	if ($env{'request.state'} eq 'construct' 
                    718: 	    || $symb eq ''
                    719: 	    || $Apache::lonhomework::type eq 'practice') {
                    720: 	    my $namespace = $symb || $env{'request.uri'};
1.284     albertel  721: 	    $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'};
1.159     albertel  722: 	    $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
1.333     albertel  723: 					      $namespace,'',$domain,$name);
1.159     albertel  724: 	    &Apache::lonxml::debug('Construct Store return message:'.$result);
                    725: 	} else {
                    726: 	    $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
                    727: 					    $symb,$courseid,$domain,$name);
                    728: 	    &Apache::lonxml::debug('Store return message:'.$result);
1.470     raeburn   729:             &store_aggregates($symb,$courseid);
1.159     albertel  730: 	}
1.323     albertel  731:     } else {
                    732: 	&Apache::lonxml::debug('Nothing to store');
1.67      albertel  733:     }
1.159     albertel  734:     return $result;
1.65      albertel  735: }
                    736: 
1.435     jms       737: =pod
                    738: 
                    739: item store_aggregates()
                    740: 
                    741: 	Sends hash of values to be incremented in nohist_resourcetracker.db
                    742: 	for the course. Increments total number of attempts, unique students 
                    743: 	and corrects for each part for an instance of a problem, as appropriate.
                    744: 	
                    745: =cut
                    746: 
1.285     raeburn   747: sub store_aggregates {
                    748:     my ($symb,$courseid) = @_;
1.479     raeburn   749:     my (%aggregate,%anoncounter,%randtrycounter);
1.286     albertel  750:     my @parts;
1.288     albertel  751:     my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    752:     my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
1.286     albertel  753:     foreach my $key (keys(%Apache::lonhomework::results)) {
1.287     albertel  754:         if ($key =~ /resource\.([^\.]+)\.tries/) {
1.286     albertel  755:             push(@parts, $1);
1.285     raeburn   756:         }
                    757:     }
1.286     albertel  758:     foreach my $part (@parts) {
1.470     raeburn   759:         if ($env{'request.role'} =~/^st/) {
                    760:             if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
                    761: 	        eq 'APPROX_ANS' ||
                    762: 	        $Apache::lonhomework::results{'resource.'.$part.'.award'}
                    763: 	        eq 'EXACT_ANS') {
                    764:                 $aggregate{$symb."\0".$part."\0correct"} = 1;
                    765:             }
                    766:             if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {
                    767:                 $aggregate{$symb."\0".$part."\0users"} = 1;
                    768:             } else {
                    769:                 my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]); 
                    770:                 if ($last_reset) {
                    771:                     if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {
                    772:                         $aggregate{$symb."\0".$part."\0users"} = 1;
                    773:                     }
                    774:                 }
                    775:             }
                    776:             $aggregate{$symb."\0".$part."\0attempts"} = 1;
1.285     raeburn   777:         }
1.470     raeburn   778:         if (($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurvey') || 
1.479     raeburn   779:             ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred') ||
                    780:             ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry')) {
                    781:             if ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry') {
                    782:                 $randtrycounter{$symb."\0".$part} = 1;
                    783:             } else {
                    784:                 $anoncounter{$symb."\0".$part} = 1;
                    785:             }
1.470     raeburn   786:             my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};
                    787:             if ($needsrelease) {   
                    788:                 my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
                    789:                 if ($curr_required eq '') {
1.471     raeburn   790:                     &Apache::lonnet::update_released_required($needsrelease);
1.470     raeburn   791:                 } else {
                    792:                     my ($currmajor,$currminor) = split(/\./,$curr_required);
                    793:                     my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
                    794:                     if (($currmajor < $needsmajor) || ($currmajor == $needsmajor && $currminor < $needsminor)) {
1.471     raeburn   795:                         &Apache::lonnet::update_released_required($needsrelease);
1.470     raeburn   796:                     }
1.292     raeburn   797:                 }
                    798:             }
1.285     raeburn   799:         }
                    800:     }
1.292     raeburn   801:     if (keys (%aggregate) > 0) {
1.289     albertel  802: 	&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
1.292     raeburn   803:                             $cdomain,$cname);
                    804:     }
1.472     raeburn   805:     if (keys(%anoncounter) > 0) {
1.481     raeburn   806:         &Apache::lonnet::cput('nohist_anonsurveys',\%anoncounter,
                    807:                               $cdomain,$cname);
1.472     raeburn   808:     }
1.479     raeburn   809:     if (keys(%randtrycounter) > 0) {
1.481     raeburn   810:         &Apache::lonnet::cput('nohist_randomizetry',\%randtrycounter,
                    811:                               $cdomain,$cname);
1.479     raeburn   812:     }
1.292     raeburn   813: }
1.289     albertel  814: 
1.65      albertel  815: sub checkout_msg {
1.211     albertel  816:     my %lt=&Apache::lonlocal::texthash( 
                    817: 		'resource'=>'The resource needs to be checked out',
                    818: 		'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.',
                    819:                 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
                    820:                 'checkout'=>'Check out Exam for Viewing',
                    821: 		'checkout?'=>'Check out Exam?');
1.352     albertel  822:     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.159     albertel  823:     return (<<ENDCHECKOUT);
1.211     albertel  824: <h2>$lt{'resource'}</h2>
                    825:     <p>$lt{'id_expln'}</p>
1.449     bisitz    826: <p class="LC_warning">$lt{'warning'}</p>
1.444     bisitz    827: <form name="checkout" method="post" action="$uri">
1.91      albertel  828: <input type="hidden" name="doescheckout" value="yes" />
1.211     albertel  829: <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
1.65      albertel  830: </form>
                    831: ENDCHECKOUT
                    832: }
                    833: 
1.252     albertel  834: sub firstaccess_msg {
1.253     albertel  835:     my ($time,$symb)=@_;
1.414     albertel  836:     my $result;
                    837:     my @interval=&Apache::lonnet::EXT("resource.0.interval");
                    838:     if ($interval[1] eq 'map') {
                    839: 	my ($map)=&Apache::lonnet::decode_symb($symb);
                    840: 	my $foldertitle=&Apache::lonnet::gettitle($map);
                    841:     
                    842: 	&Apache::lonxml::debug("map is $map title is $foldertitle");
1.418     bisitz    843: 	$result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.'
                    844:                              .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
                    845:                              ,$foldertitle,$time)."</h2>";
1.414     albertel  846:     } elsif ($interval[1] eq 'course') {
                    847: 	my $course = $env{'course.'.$env{'request.course.id'}.'.description'};
1.418     bisitz    848:         $result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.'
                    849:                              .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
                    850:                              ,$course,$time)."</h2>";
1.414     albertel  851:     } else {
                    852: 	my $title=&Apache::lonnet::gettitle($symb);
1.418     bisitz    853:         $result .= "<h2>".&mt('This resource "[_1]" is open for a limited time.'
                    854:                              .' Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".'
                    855:                              ,$title,$time)."</h2>";
1.414     albertel  856:     }
1.352     albertel  857:     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
1.418     bisitz    858:     my $buttontext = &mt('Show Resource');
                    859:     my $timertext = &mt('Start Timer?');
1.414     albertel  860:     $result .= (<<ENDCHECKOUT);
1.444     bisitz    861: <form name="markaccess" method="post" action="$uri">
1.252     albertel  862: <input type="hidden" name="markaccess" value="yes" />
1.418     bisitz    863: <input type="button" name="accessbutton" value="$buttontext" onClick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" />
1.252     albertel  864: </form>
                    865: ENDCHECKOUT
1.414     albertel  866:     return $result;
1.252     albertel  867: }
                    868: 
1.204     albertel  869: sub init_problem_globals {
                    870:     my ($type)=@_;
                    871:     #initialize globals
1.308     foxr      872:     #   For problems, we start out in part 0 (outside a <part> tag).
                    873:     #   and part 0 is used to describe the main body of the <problem>
                    874:     #
1.204     albertel  875:     if ($type eq 'problem') {
                    876: 	$Apache::inputtags::part='0';
                    877: 	@Apache::inputtags::partlist=('0');
1.405     albertel  878: 	&Apache::lonhomework::set_show_problem_status(&get_problem_status('0'));
1.266     albertel  879: 	$Apache::lonhomework::ignore_response_errors=0;
1.308     foxr      880: 
1.266     albertel  881:     } elsif ($type eq 'library') {
1.204     albertel  882: 	$Apache::inputtags::part='';
                    883: 	@Apache::inputtags::partlist=();
1.405     albertel  884: 	&Apache::lonhomework::reset_show_problem_status();
1.266     albertel  885: 	$Apache::lonhomework::ignore_response_errors=1;
1.308     foxr      886: 
1.304     albertel  887:     } elsif ($type eq 'Task') {
                    888: 	$Apache::inputtags::part='0';
                    889: 	@Apache::inputtags::partlist=('0');
1.405     albertel  890: 	&Apache::lonhomework::reset_show_problem_status();
1.304     albertel  891: 	$Apache::lonhomework::ignore_response_errors=1;
1.204     albertel  892:     }
1.477     www       893:     @Apache::functionplotresponse::callscripts=();
1.204     albertel  894:     @Apache::inputtags::responselist = ();
                    895:     @Apache::inputtags::importlist = ();
                    896:     @Apache::inputtags::previous=();
                    897:     @Apache::inputtags::previous_version=();
                    898:     $Apache::structuretags::printanswer='No';
                    899:     @Apache::structuretags::whileconds=();
                    900:     @Apache::structuretags::whilebody=();
                    901:     @Apache::structuretags::whileline=();
                    902:     $Apache::lonhomework::scantronmode=0;
                    903:     undef($Apache::lonhomework::name);
1.358     albertel  904:     undef($Apache::lonhomework::default_type);
                    905:     undef($Apache::lonhomework::type);
1.204     albertel  906: }
                    907: 
                    908: sub reset_problem_globals {
                    909:     my ($type)=@_;
                    910:     undef(%Apache::lonhomework::history);
                    911:     undef(%Apache::lonhomework::results);
                    912:     undef($Apache::inputtags::part);
1.208     albertel  913: #don't undef this, lonhomework.pm takes care of this, we use this to 
                    914: #detect if we try to do 2 problems in one file
                    915: #   undef($Apache::lonhomework::parsing_a_problem);
1.204     albertel  916:     undef($Apache::lonhomework::name);
1.358     albertel  917:     undef($Apache::lonhomework::default_type);
                    918:     undef($Apache::lonhomework::type);
                    919:     undef($Apache::lonhomework::scantronmode);
                    920:     undef($Apache::lonhomework::ignore_response_errors);
1.477     www       921:     undef(@Apache::functionplotresponse::callscripts);
1.405     albertel  922:     &Apache::lonhomework::reset_show_problem_status();
1.204     albertel  923: }
                    924: 
1.241     albertel  925: sub set_problem_state {
1.240     albertel  926:     my ($part)=@_;
1.284     albertel  927:     if ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {
1.240     albertel  928: 	$Apache::lonhomework::history{"resource.$part.solved"}=
                    929: 	    'correct_by_student';
                    930:     }
                    931: }
                    932: 
1.241     albertel  933: sub get_problem_status {
                    934:     my ($part)=@_;
1.267     albertel  935:     my $problem_status;
1.284     albertel  936:     if ($env{'request.state'} eq 'construct' &&
                    937: 	defined($env{'form.problemstatus'})) {
                    938: 	$problem_status=$env{'form.problemstatus'};
1.267     albertel  939:     } else {
                    940: 	$problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");
                    941: 	&Apache::lonxml::debug("problem status for $part is $problem_status");
1.284     albertel  942: 	&Apache::lonxml::debug("env probstat is ".$env{'form.problemstatus'});
1.241     albertel  943:     }
                    944:     return $problem_status;
                    945: }
                    946: 
1.9       albertel  947: sub start_problem {
1.326     albertel  948:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.19      albertel  949: 
1.311     foxr      950:     # We'll use the redirection to fix up printing of duedates.
1.321     albertel  951:     if (!$Apache::lonxml::metamode) {
                    952: 	&Apache::lonxml::startredirection();
                    953:     }
1.311     foxr      954: 
1.308     foxr      955:     # Problems don't nest and we don't allow more than one <problem> in
                    956:     # a .problem file.
                    957:     #
1.184     albertel  958:     if ( $Apache::inputtags::part ne '' ||
                    959: 	 $Apache::lonhomework::parsing_a_problem) {
                    960: 	&Apache::lonxml::error('Only one &lt;problem&gt; allowed in a .problem file');
1.326     albertel  961: 	#my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,$style);
1.159     albertel  962: 	return '';
                    963:     }
1.184     albertel  964: 
                    965:     $Apache::lonhomework::parsing_a_problem=1;
1.204     albertel  966:     &init_problem_globals('problem');
1.166     albertel  967: 
1.284     albertel  968:     if (defined($env{'scantron.maxquest'})) {
1.166     albertel  969: 	$Apache::lonhomework::scantronmode=1;
                    970:     }
1.161     albertel  971: 
1.159     albertel  972:     if ($target ne 'analyze') {
1.415     raeburn   973:         my $type = &Apache::lonnet::EXT('resource.0.type');
                    974: 	$Apache::lonhomework::type=$type;
1.284     albertel  975: 	if (($env{'request.state'} eq 'construct') &&
1.410     albertel  976: 	    $env{'form.problemtype'} =~ /\S/) {
1.284     albertel  977: 	    $Apache::lonhomework::type=$env{'form.problemtype'};
1.237     albertel  978: 	}
1.332     albertel  979: 	&Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
1.159     albertel  980:     }
1.164     albertel  981:     if ($Apache::lonhomework::type eq '' ) {
1.284     albertel  982: 	my $uri=$env{'request.uri'};
1.159     albertel  983: 	if ($uri=~/\.(\w+)$/) {
                    984: 	    $Apache::lonhomework::type=$1;
                    985: 	    &Apache::lonxml::debug("Using type of $1");
                    986: 	} else {
                    987: 	    $Apache::lonhomework::type='problem';
                    988: 	    &Apache::lonxml::debug("Using default type, problem, :$uri:");
                    989: 	}
1.87      albertel  990:     }
1.301     albertel  991:     $Apache::lonhomework::default_type = $Apache::lonhomework::type;
1.58      www       992: 
1.363     albertel  993:     &initialize_storage();
1.389     albertel  994:     if ($target ne 'analyze'
                    995:        	&& $env{'request.state'} eq 'construct') {
                    996: 	&set_problem_state('0');
                    997:     }
                    998: 
1.366     albertel  999:     if ($target eq 'web') {
                   1000: 	&Apache::lonxml::debug(" grading history ");
                   1001: 	&Apache::lonhomework::showhash(%Apache::lonhomework::history);
                   1002:     }
1.363     albertel 1003: 
1.159     albertel 1004:     #added vars to the scripting enviroment
1.213     albertel 1005:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.248     albertel 1006:     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.24      albertel 1007:     &Apache::run::run($expression,$safeeval);
1.159     albertel 1008:     my $status;
                   1009:     my $accessmsg;
                   1010: 
1.343     albertel 1011:     my $name= &get_resource_name($parstack,$safeeval);
1.350     albertel 1012:     my ($result,$form_tag_start);
1.354     albertel 1013:     if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
                   1014: 	|| $target eq 'edit') {
1.350     albertel 1015: 	($result,$form_tag_start) =
                   1016: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
                   1017: 			$name);
                   1018:     }
                   1019: 
1.284     albertel 1020:     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
1.159     albertel 1021: 
1.479     raeburn  1022:     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }
1.159     albertel 1023:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1024: 	$target eq 'tex') {
1.284     albertel 1025: 	if ($env{'form.markaccess'}) {
1.414     albertel 1026: 	    my @interval=&Apache::lonnet::EXT("resource.0.interval");
                   1027: 	    &Apache::lonnet::set_first_access($interval[1]);
1.252     albertel 1028: 	}
1.479     raeburn  1029: 
                   1030:         ($status,$accessmsg,my $slot_name,my $slot) =
                   1031:             &Apache::lonhomework::check_slot_access('0','problem');
                   1032:         push (@Apache::inputtags::status,$status);
                   1033: 
1.159     albertel 1034: 	#handle rand seed in construction space
1.479     raeburn  1035: 	my $rndseed=&setup_rndseed($safeeval,$target);
1.367     albertel 1036: 	my ($symb)=&Apache::lonnet::whichuser();
1.479     raeburn  1037: 
1.333     albertel 1038: 	if ($env{'request.state'} ne "construct" && 
                   1039: 	    ($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
1.162     albertel 1040: 	    $form_tag_start.='<input type="hidden" name="rndseed" value="'.
1.462     raeburn  1041: 		$rndseed.'" />'.
                   1042: 		    '<input type="submit" name="resetdata"
                   1043:                              value="'.&mt('New Problem Variation').'" />';
1.334     albertel 1044: 	    if (exists($env{'form.username'})) {
                   1045: 		$form_tag_start.=
1.164     albertel 1046: 		    '<input type="hidden" name="username"
1.284     albertel 1047:                              value="'.$env{'form.username'}.'" />';
1.334     albertel 1048: 	    }
1.462     raeburn  1049: 	    if ($env{'request.role.adv'}) {
                   1050: 		$form_tag_start.= ' <label class="LC_nobreak">'
                   1051:                          .'<input type="checkbox" name="showallfoils"';
                   1052: 		if (defined($env{'form.showallfoils'})) {
                   1053: 		    $form_tag_start.=' checked="checked"';
                   1054: 		}
                   1055:                 $form_tag_start.= ' /> '
                   1056:                                  .&mt('Show All Foils')
                   1057:                                  .'</label>';
                   1058: 	    }
1.417     www      1059:             if ($Apache::lonhomework::type eq 'practice') {
1.428     raeburn  1060:                 $form_tag_start.=&practice_problem_header();
1.417     www      1061:             }
1.462     raeburn  1062: 	    $form_tag_start.='<hr />';
1.479     raeburn  1063:         } elsif (($env{'request.state'} ne "construct") &&
                   1064:                  ($Apache::lonhomework::type eq 'randomizetry') &&
                   1065:                  ($status eq 'CAN_ANSWER')) {
                   1066:             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                   1067:             my $problemstatus = &get_problem_status($Apache::inputtags::part);
                   1068:             $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries);
                   1069:         }
1.324     albertel 1070: 
1.159     albertel 1071: 	my $expression='$external::datestatus="'.$status.'";';
                   1072: 	$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
                   1073: 	&Apache::run::run($expression,$safeeval);
                   1074: 	&Apache::lonxml::debug("Got $status");
1.324     albertel 1075: 
1.159     albertel 1076: 	if (( $status eq 'CLOSED' ) ||
                   1077: 	    ( $status eq 'UNCHECKEDOUT') ||
1.252     albertel 1078: 	    ( $status eq 'NOT_YET_VIEWED') ||
1.159     albertel 1079: 	    ( $status eq 'BANNED') ||
1.216     albertel 1080: 	    ( $status eq 'UNAVAILABLE') ||
1.324     albertel 1081: 	    ( $status eq 'NOT_IN_A_SLOT') ||
1.216     albertel 1082: 	    ( $status eq 'INVALID_ACCESS')) {
1.326     albertel 1083: 	    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
                   1084: 						       $style);
1.159     albertel 1085: 	    if ( $target eq "web" ) {
1.343     albertel 1086: 		my $msg;
1.159     albertel 1087: 		if ($status eq 'UNAVAILABLE') {
1.245     albertel 1088: 		    $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
1.441     raeburn  1089:                 } elsif ($status eq 'NOT_IN_A_SLOT') {
                   1090:                     $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';
1.253     albertel 1091: 		} elsif ($status ne 'NOT_YET_VIEWED') {
1.245     albertel 1092: 		    $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
1.159     albertel 1093: 		}
1.216     albertel 1094: 		if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
1.393     www      1095: 		    $msg.=&mt('The problem ').$accessmsg;
1.159     albertel 1096: 		} elsif ($status eq 'UNCHECKEDOUT') {
1.343     albertel 1097: 		    $msg.=&checkout_msg();
1.252     albertel 1098: 		} elsif ($status eq 'NOT_YET_VIEWED') {
1.253     albertel 1099: 		    $msg.=&firstaccess_msg($accessmsg,$symb);
1.325     albertel 1100: 		} elsif ($status eq 'NOT_IN_A_SLOT') {
1.441     raeburn  1101: 		    $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work");
1.159     albertel 1102: 		}
                   1103: 		$result.=$msg.'<br />';
                   1104: 	    } elsif ($target eq 'tex') {
1.332     albertel 1105: 		my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
                   1106: 		                    : '\begin{minipage}{\textwidth}';
1.443     foxr     1107: 		$result.='\noindent \vskip 1 mm '.
1.332     albertel 1108: 		    $startminipage.'\vskip 0 mm';
1.159     albertel 1109: 		if ($status eq 'UNAVAILABLE') {
1.211     albertel 1110: 		    $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
1.159     albertel 1111: 		} else {
1.211     albertel 1112: 		    $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
1.159     albertel 1113: 		}
                   1114: 	    }
1.324     albertel 1115: 	} elsif ($status eq 'NEEDS_CHECKIN') {
1.326     albertel 1116: 	    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
                   1117: 						       $style);
1.324     albertel 1118: 	    if ($target eq 'web') {
1.375     albertel 1119: 		$result .= 
                   1120: 		    &Apache::bridgetask::proctor_validation_screen($slot);
1.324     albertel 1121: 	    } elsif ($target eq 'grade') {
                   1122: 		&Apache::bridgetask::proctor_check_auth($slot_name,$slot,
                   1123: 							'problem');
                   1124: 	    }
1.159     albertel 1125: 	} elsif ($target eq 'web') {
1.360     albertel 1126: 	    if ($status eq 'CAN_ANSWER' 
                   1127: 		&& $slot_name ne ''
                   1128: 		&& $Apache::lonhomework::history{'resource.0.checkedin'} eq '') {
                   1129: 		# unproctored slot access, self checkin
                   1130: 		&Apache::bridgetask::check_in('problem',undef,undef,
                   1131: 					      $slot_name);
                   1132: 	    }
1.368     albertel 1133: 	    $result.="\n $form_tag_start \t".	
1.227     albertel 1134: 	      '<input type="hidden" name="submitted" value="yes" />';
                   1135: 	    # create a page header and exit
1.284     albertel 1136: 	    if ($env{'request.state'} eq "construct") {
                   1137: 		$result.= &problem_web_to_edit_header($env{'form.rndseed'});
1.428     raeburn  1138:                 if ($Apache::lonhomework::type eq 'practice') {
                   1139:                     $result.= '<input type="submit" name="resetdata" '.
                   1140:                               'value="'.&mt('New Problem Variation').'" />'.
                   1141:                               &practice_problem_header().'<hr />';
                   1142:                 }
1.227     albertel 1143: 	    }
                   1144: 	    # if we are viewing someone else preserve that info
1.284     albertel 1145: 	    if (defined $env{'form.grade_symb'}) {
1.227     albertel 1146: 		foreach my $field ('symb','courseid','domain','username') {
                   1147: 		    $result .= '<input type="hidden" name="grade_'.$field.
1.284     albertel 1148: 			'" value="'.$env{"form.grade_$field"}.'" />'."\n";
1.159     albertel 1149: 		}
1.479     raeburn  1150:                 foreach my $field ('trial','questiontype') {
                   1151:                     if ($env{"form.grade_$field"} ne '') {
                   1152:                         $result .= '<input type="hidden" name="grade_'.$field.
                   1153:                             '" value="'.$env{"form.grade_$field"}.'" />'."\n";
                   1154:                     }
                   1155:                 }
1.159     albertel 1156: 	    }
                   1157: 	} elsif ($target eq 'tex') {
1.319     foxr     1158: 	    $result .= 'INSERTTEXFRONTMATTERHERE';
                   1159: 
1.99      sakharuk 1160: 	}
1.159     albertel 1161:     } elsif ($target eq 'edit') {
1.343     albertel 1162: 	$result .= $form_tag_start.&problem_edit_header();
1.226     albertel 1163: 	$Apache::lonxml::warnings_error_header=
                   1164: 	    &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 1165: 	my $temp=&Apache::edit::insertlist($target,$token);
                   1166: 	$result.=$temp;
                   1167:     } elsif ($target eq 'modified') {
                   1168: 	$result=$token->[4];
                   1169:     } else {
                   1170: 	# page_start returned a starting result, delete it if we don't need it
                   1171: 	$result = '';
1.99      sakharuk 1172:     }
1.159     albertel 1173:     return $result;
1.9       albertel 1174: }
                   1175: 
                   1176: sub end_problem {
1.159     albertel 1177:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.321     albertel 1178:     my $result;
1.310     foxr     1179: 
1.321     albertel 1180:     if (!$Apache::lonxml::metamode) {
                   1181: 	$result = &Apache::lonxml::endredirection(); #started in &start_problem
1.329     albertel 1182: 	$Apache::lonxml::post_evaluate=0;
1.321     albertel 1183:     }
1.319     foxr     1184: 
                   1185:     if ($target eq 'tex') {
1.321     albertel 1186: 	# Figure out the front matter and replace the
                   1187: 	# INSERTTEXFRONTMATTERHERE in result with it.  note that we do
                   1188: 	# this in end_problem because whether or not we display due
                   1189: 	# dates depends on whether due dates have already been
                   1190: 	# displayed in the problem parts.
                   1191: 
1.319     foxr     1192: 	my $frontmatter   = '';
                   1193: 	my $startminipage = '';
                   1194: 	if (not $env{'form.problem_split'}=~/yes/) {
                   1195: 	    $startminipage = '\begin{minipage}{\textwidth}';
                   1196: 	}
                   1197: 	my $id = $Apache::inputtags::part;
                   1198: 	my $weight = &Apache::lonnet::EXT("resource.$id.weight");
                   1199: 	my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
                   1200: 	my @packages = split /,/,$packages;
                   1201: 	my $allow_print_points = 0;
                   1202: 	foreach my $partial_key (@packages) {
                   1203: 	    if ($partial_key=~m/^part_0$/) {
                   1204: 		$allow_print_points=1;
                   1205: 	    }
                   1206: 	}
                   1207: 	my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
                   1208: 	if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; }
                   1209: 	if (lc($env{'course.'.$env{'request.course.id'}.
                   1210: 			'.disableexampointprint'}) eq 'yes') {
                   1211: 	    $allow_print_points=0;
                   1212: 	}
                   1213: 	my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
1.443     foxr     1214: 	my $begin_doc=' \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$env{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent ';
1.319     foxr     1215: 	my $toc_line='\vskip 1 mm\noindent '.$startminipage.
                   1216: 	    '\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
                   1217: 	
                   1218: 	#  Figure out what the due date is and if we need to print
                   1219: 	#  it in the problem header.  We have been logging the
                   1220: 	#  last due date written to file. 
                   1221: 	
                   1222: 	my $duetime = &Apache::lonnet::EXT("resource.$id.duedate"); 
                   1223: 	my $duedate = POSIX::strftime("%c",localtime($duetime));
1.448     bisitz   1224:         my $duedate_text = &mt('Due date: [_1]'
                   1225:                               ,&Apache::lonlocal::locallocaltime($duetime));
1.319     foxr     1226: 	my $temp_file;
                   1227: 	my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
                   1228: 	
                   1229: 	# Figure out what the last printed due date is or set it
                   1230: 	# to the epoch if no duedates have been printed.
                   1231: 	
                   1232: 	my $due_file_content = 0;      #   If the file does not yet exist, time is the epoch.
                   1233: 	if (-e $filename) {
                   1234: 	    $temp_file = Apache::File->new($filename);
                   1235: 	    my @due_file      = <$temp_file>;
                   1236: 	    $due_file_content = $due_file[$#due_file];
                   1237: 	    chomp $due_file_content;
                   1238: 	} 
                   1239: 	
                   1240: 	# We display the due date iff it is not the same as the last
                   1241: 	# duedate in problem header ($due_file_content), and
                   1242: 	# none of our parts displayed a duedate.
                   1243: 	#
                   1244: 	my $parts_with_displayduedate;
                   1245: 	if (defined $Apache::outputtags::showonce{'displayduedate'}) {
                   1246: 	    $parts_with_displayduedate = 
                   1247: 		scalar(@{$Apache::outputtags::showonce{'displayduedate'}});
                   1248: 	} else {
                   1249: 	    $parts_with_displayduedate = 0;
                   1250: 	}
                   1251: 	if (($due_file_content != $duetime) && ($parts_with_displayduedate == 0) ) {
                   1252: 	    $temp_file = Apache::File->new('>'.$filename);
                   1253: 	    print $temp_file "$duetime\n";
                   1254: 	    if (not $env{'request.symb'} =~ m/\.page_/) {
                   1255: 		if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
                   1256: 		    $frontmatter .= $begin_doc.
1.448     bisitz   1257: 			'\textit{'.$duedate_text.'} '.$toc_line;
1.319     foxr     1258: 		} else {
                   1259: 		    $frontmatter.= $begin_doc.$toc_line;
1.463     foxr     1260: 		    if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { 
                   1261: 			$frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
                   1262: 		    }
1.319     foxr     1263: 		}
                   1264: 	    } else {
1.448     bisitz   1265: 		$frontmatter .= '\vskip 1mm\textit{'.$duedate_text.'} \\\\\\\\'.$startminipage;
1.319     foxr     1266: 	    }
                   1267: 	} else {
                   1268: 	    if (not $env{'request.symb'} =~ m/\.page_/) {
                   1269: 		$frontmatter .= $begin_doc.$toc_line;
1.463     foxr     1270: 		if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { 
                   1271: 		    $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
                   1272: 		}
1.319     foxr     1273: 	    } else {
1.381     albertel 1274: 		$frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
1.319     foxr     1275: 	    }
                   1276: 	}
                   1277: 	$result =~ s/INSERTTEXFRONTMATTERHERE/$frontmatter/;
                   1278:     }
                   1279: 
1.159     albertel 1280:     my $status=$Apache::inputtags::status['-1'];
                   1281:     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
                   1282: 	$target eq 'tex') {
1.249     albertel 1283: 	if ( $target eq 'grade' && $Apache::inputtags::part eq '0') {
1.159     albertel 1284: 	    # if part is zero, no <part>s existed, so we need to the grading
1.249     albertel 1285: 	    if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) {
                   1286: 		&Apache::inputtags::grade;
1.324     albertel 1287: 	    } elsif ($status eq 'NEEDS_CHECKIN') {
                   1288: 		# no need to grade, and don't want to hide data
1.249     albertel 1289: 	    } else {
                   1290: 		# move any submission data to .hidden
                   1291: 		&Apache::inputtags::hidealldata($Apache::inputtags::part);
                   1292: 	    }
1.159     albertel 1293: 	} elsif ( ($target eq 'web' || $target eq 'tex') &&
                   1294: 		  $Apache::inputtags::part eq '0' &&
1.252     albertel 1295: 		  $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
1.159     albertel 1296: 	    # if part is zero, no <part>s existed, so we need show the current
                   1297: 	    # grading status
                   1298: 	    my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
                   1299: 	    $result.= $gradestatus;
                   1300: 	}
                   1301: 	if (
1.284     albertel 1302: 	    (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
1.159     albertel 1303: 	    ($target eq 'answer') || ($target eq 'tex')
                   1304: 	   ) {
1.227     albertel 1305: 	    if ($target ne 'tex' &&
1.284     albertel 1306: 		$env{'form.answer_output_mode'} ne 'tex') {
1.254     www      1307: 		$result.="</form>";
1.159     albertel 1308: 	    }
                   1309: 	    if ($target eq 'web') {
1.346     albertel 1310: 		$result.= &Apache::loncommon::end_page({'discussion' => 1});
1.159     albertel 1311: 	    } elsif ($target eq 'tex') {
1.178     sakharuk 1312: 		my $endminipage = '';
1.284     albertel 1313: 		if (not $env{'form.problem_split'}=~/yes/) {
1.178     sakharuk 1314: 		    $endminipage = '\end{minipage}';
                   1315: 		}
1.284     albertel 1316:                 if ($env{'form.print_discussions'} eq 'yes') {
1.263     sakharuk 1317: 		    $result.=&Apache::lonxml::xmlend($target,$parser);
1.159     albertel 1318: 		} else {
1.262     sakharuk 1319: 		    $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
1.284     albertel 1320: 		    if (not $env{'request.symb'} =~ m/\.page_/) {
1.262     sakharuk 1321: 			$result .= $endminipage.'\end{document} ';
                   1322: 		    } else {
1.382     albertel 1323: 			$result .= $endminipage;
1.262     sakharuk 1324: 		    }
1.159     albertel 1325: 		}
                   1326: 	    }
                   1327: 	}
1.476     www      1328:         if ($target eq 'web') {
                   1329:            $result.=&Apache::functionplotresponse::init_script();
                   1330:         }
1.159     albertel 1331: 	if ($target eq 'grade') {
                   1332: 	    &Apache::lonhomework::showhash(%Apache::lonhomework::results);
                   1333: 	    &finalize_storage();
                   1334: 	}
1.284     albertel 1335: 	if ($target eq 'answer' && ($env{'request.state'} eq 'construct')
                   1336: 	    && $env{'form.answer_output_mode'} ne 'tex') {
1.346     albertel 1337: 	    $result.=&Apache::loncommon::end_page({'discussion' => 1});
1.294     albertel 1338: 	                        # normally we get it from above, but in CSTR
1.172     albertel 1339: 	                        # we always show answer mode too.
1.159     albertel 1340: 	}
                   1341:     } elsif ($target eq 'meta') {
                   1342: 	if ($Apache::inputtags::part eq '0') {
1.179     albertel 1343: 	    @Apache::inputtags::response=();
1.159     albertel 1344: 	    $result=&Apache::response::mandatory_part_meta;
                   1345: 	}
1.215     albertel 1346: 	$result.=&Apache::response::meta_part_order();
1.258     albertel 1347: 	$result.=&Apache::response::meta_response_order();
1.159     albertel 1348:     } elsif ($target eq 'edit') {
                   1349: 	&Apache::lonxml::debug("in end_problem with $target, edit");
1.314     albertel 1350: 	$result .= &problem_edit_footer();
1.320     albertel 1351:     } elsif ($target eq 'modified') {
                   1352: 	 $result .= $token->[2];
1.159     albertel 1353:     }
1.155     albertel 1354: 
1.284     albertel 1355:     if ($env{'request.state'} eq 'construct' && $target eq 'web') {
1.177     albertel 1356: 	&Apache::inputtags::check_for_duplicate_ids();
                   1357:     }
1.204     albertel 1358: 
                   1359:     &reset_problem_globals('problem');
1.159     albertel 1360: 
                   1361:     return $result;
1.48      albertel 1362: }
                   1363: 
1.108     albertel 1364: 
1.48      albertel 1365: sub start_library {
1.159     albertel 1366:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.343     albertel 1367:     my ($result,$form_tag_start);
1.371     albertel 1368:     if ($#$tagstack eq 0 && $$tagstack[0] eq 'library') {
1.244     albertel 1369: 	&init_problem_globals('library');
                   1370: 	$Apache::lonhomework::type='problem';
                   1371:     }
1.159     albertel 1372:     if ($target eq 'edit') {
1.343     albertel 1373: 	($result,$form_tag_start)=
                   1374: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
                   1375: 			'Edit');
                   1376: 	$result.=$form_tag_start.&problem_edit_header();
1.159     albertel 1377: 	my $temp=&Apache::edit::insertlist($target,$token);
                   1378: 	$result.=$temp;
                   1379:     } elsif ($target eq 'modified') {
                   1380: 	$result=$token->[4];
1.340     albertel 1381:     } elsif (($target eq 'web' || $target eq 'webgrade')
1.371     albertel 1382: 	     && ($#$tagstack eq 0 && $$tagstack[0] eq 'library')
1.340     albertel 1383: 	     && $env{'request.state'} eq "construct" ) {
1.159     albertel 1384: 	my $name=&get_resource_name($parstack,$safeeval);
1.343     albertel 1385: 	($result,$form_tag_start)=
                   1386: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
                   1387: 			$name);
1.479     raeburn  1388: 	my $rndseed=&setup_rndseed($safeeval,$target);
1.343     albertel 1389: 	$result.=" \n $form_tag_start".	
1.159     albertel 1390: 		  '<input type="hidden" name="submitted" value="yes" />';
                   1391: 	$result.=&problem_web_to_edit_header($rndseed);
1.428     raeburn  1392:         if ($Apache::lonhomework::type eq 'practice') {
                   1393:             $result.= '<input type="submit" name="resetdata" '.
                   1394:                       'value="'.&mt('New Problem Variation').'" />'.
                   1395:                       &practice_problem_header().'<hr />';
                   1396:         }
1.159     albertel 1397:     }
                   1398:     return $result;
1.48      albertel 1399: }
                   1400: 
                   1401: sub end_library {
1.159     albertel 1402:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1403:     my $result='';
                   1404:     if ($target eq 'edit') {
                   1405: 	$result=&problem_edit_footer();
1.371     albertel 1406:     } elsif ($target eq 'web' 
                   1407: 	     && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') 
                   1408: 	     && $env{'request.state'} eq "construct") {
1.349     albertel 1409: 	$result.='</form>'.&Apache::loncommon::end_page({'discussion' => 1});
1.159     albertel 1410:     }
1.371     albertel 1411:     if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') {
                   1412: 	&reset_problem_globals('library');
                   1413:     }
1.159     albertel 1414:     return $result;
1.197     www      1415: }
                   1416: 
                   1417: sub start_definetag {
1.326     albertel 1418:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.197     www      1419: 
                   1420:     my $result;
                   1421: 
                   1422:     my $name = $token->[2]->{'name'};
1.326     albertel 1423:     my $skip=&Apache::lonxml::get_all_text("/definetag",$parser,$style);
1.396     albertel 1424:     if ($target eq 'web') {
                   1425: 	if ($name=~/^\//) {
                   1426: 	    $result=
                   1427: 		'<br /><table class="LC_sty_end"><tr><th>'.
                   1428: 		&mt('END [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
                   1429: 	} else {
                   1430: 	    $result=
                   1431: 		'<br /><table class="LC_sty_begin"><tr><th>'.
                   1432: 		&mt('BEGIN [_1]'.'<tt>'.$name.'</tt>').'</th></tr>';
                   1433: 	}
                   1434: 	$skip = &HTML::Entities::encode($skip, '<>&"');
                   1435: 	$result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';
1.197     www      1436:     }
                   1437:     return $result;
                   1438: }
                   1439: 
                   1440: sub end_definetag {
                   1441:     return '';
1.1       albertel 1442: }
                   1443: 
                   1444: sub start_block {
1.201     albertel 1445:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.131     albertel 1446: 
                   1447:     my $result;
1.1       albertel 1448: 
1.339     albertel 1449:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer'  ||
                   1450: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.159     albertel 1451: 	my $code = $token->[2]->{'condition'};
1.385     albertel 1452: 	if (defined($code) && $code ne '') {
1.137     albertel 1453: 	    if (!$Apache::lonxml::default_homework_loaded) {
                   1454: 		&Apache::lonxml::default_homework_load($safeeval);
                   1455: 	    }
1.131     albertel 1456: 	    $result = &Apache::run::run($code,$safeeval);
                   1457: 	    &Apache::lonxml::debug("block :$code: returned :$result:");
                   1458: 	} else {
                   1459: 	    $result='1';
                   1460: 	}
                   1461: 	if ( ! $result ) {
1.201     albertel 1462: 	    my $skip=&Apache::lonxml::get_all_text("/block",$parser,$style);
1.131     albertel 1463: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                   1464: 	}
                   1465: 	$result='';
                   1466:     } elsif ($target eq 'edit') {
                   1467: 	$result .=&Apache::edit::tag_start($target,$token);
                   1468: 	$result .=&Apache::edit::text_arg('Test Condition:','condition',
                   1469: 					  $token,40);
                   1470: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1471:     } elsif ($target eq 'modified') {
                   1472: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1473: 						     $safeeval,'condition');
                   1474: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.38      albertel 1475:     }
1.131     albertel 1476:     return $result;
1.1       albertel 1477: }
                   1478: 
                   1479: sub end_block {
1.167     www      1480:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1481:     my $result;
                   1482:     if ($target eq "edit") {
                   1483: 	$result.= &Apache::edit::tag_end($target,$token,'');
                   1484:     }
                   1485:     return $result;
                   1486: }
                   1487: 
                   1488: sub start_languageblock {
1.201     albertel 1489:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.167     www      1490: 
                   1491:     my $result;
                   1492: 
1.339     albertel 1493:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1494: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.201     albertel 1495: 	my $include = $token->[2]->{'include'};
                   1496: 	my $exclude = $token->[2]->{'exclude'};
1.436     raeburn  1497:         my @preferred_languages=&Apache::lonlocal::preferred_languages();
1.394     www      1498: # This should not even happen, since we should at least have the server language
1.398     www      1499:         if (!$preferred_languages[0]) { $preferred_languages[0]='en'; }
                   1500: # Now loop over all languages in order of preference
                   1501:         foreach my $preferred_language (@preferred_languages) {
1.394     www      1502: # If the languageblock has no arguments, show the contents
1.399     www      1503:            $result=1;
                   1504:            my $found=0;
1.394     www      1505: # Do we have an include argument?
1.398     www      1506: 	   if ($include) {
1.394     www      1507: # If include is specified, by default, don't render the block
1.399     www      1508:               $result=0;
1.398     www      1509:               foreach my $included_language (split(/\,/,$include)) {
1.394     www      1510: # ... but if my preferred language is included, render it
1.398     www      1511:                  if ($included_language eq $preferred_language) {
1.399     www      1512:                     $result=1; 
                   1513:                     $found=1; 
1.398     www      1514:                  }
                   1515:               }
                   1516: 	   }
1.394     www      1517: # Do we have an exclude argument?
1.398     www      1518:            if ($exclude) {
1.399     www      1519:               $result=1;
1.398     www      1520:               foreach my $excluded_language (split(/\,/,$exclude)) {
                   1521:                  if ($excluded_language eq $preferred_language) {
1.399     www      1522:                     $result=0;
                   1523:                     $found=1;
1.398     www      1524:                  }
                   1525:               }
                   1526: 	   }
1.399     www      1527:            if ($found) { last; }
1.398     www      1528:         }
1.201     albertel 1529: 	if ( ! $result ) {
                   1530: 	    my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,
                   1531: 						   $style);
                   1532: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                   1533: 	}
                   1534: 	$result='';
1.167     www      1535:     } elsif ($target eq 'edit') {
                   1536: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel 1537: 	$result .=&Apache::edit::text_arg(&mt('Include Language:'),'include',
1.167     www      1538: 					  $token,40);
1.211     albertel 1539: 	$result .=&Apache::edit::text_arg(&mt('Exclude Language:'),'exclude',
1.167     www      1540: 					  $token,40);
                   1541: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1542:     } elsif ($target eq 'modified') {
                   1543: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.168     albertel 1544: 						     $safeeval,'include',
                   1545: 						     'exclude');
1.167     www      1546: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   1547:     }
                   1548:     return $result;
                   1549: }
                   1550: 
                   1551: sub end_languageblock {
1.170     www      1552:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1553:     my $result;
1.201     albertel 1554:     if ($target eq "edit") {
1.170     www      1555: 	$result.= &Apache::edit::tag_end($target,$token,'');
                   1556:     }
                   1557:     return $result;
                   1558: }
                   1559: 
1.397     albertel 1560: {
                   1561:     my %available_texts;
                   1562:     sub start_translated {
                   1563: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1564: 	&Apache::lonxml::register('Apache::structuretags',('lang'));
                   1565: 	undef(%available_texts);
                   1566:     }
                   1567:     
                   1568:     sub end_translated {
                   1569: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1570: 	my $result;
                   1571: 	#show the translation on viewable targets
                   1572: 	if ($target eq 'web'     || $target eq 'tex' || $target eq 'webgrade'||
                   1573: 	    # or non-viewable targets, if it's embedded in something that
                   1574: 	    # wants the output
                   1575: 	    (($target eq 'answer' || $target eq 'analyze'|| $target eq 'grade')
                   1576: 	     && &Apache::lonxml::in_redirection() ) ) {
                   1577: 	    my @possibilities = keys(%available_texts);
                   1578: 	    my $which = 
                   1579: 		&Apache::loncommon::languages(\@possibilities) || 'default';
                   1580: 	    $result = $available_texts{$which};
                   1581: 	}
                   1582: 	undef(%available_texts);
                   1583: 	&Apache::lonxml::deregister('Apache::structuretags',('lang'));
                   1584: 	return $result;
                   1585:     }
                   1586: 
                   1587: 
                   1588:     sub start_lang {
                   1589: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1590: 	if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1591: 	    $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
                   1592: 	    &Apache::lonxml::startredirection();
                   1593: 	}
                   1594: 	return '';
                   1595:     }
                   1596: 
                   1597:     sub end_lang {
                   1598: 	my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   1599: 	if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1600: 	    $target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
                   1601: 	    my $result = &Apache::lonxml::endredirection();
                   1602: 	    my $which = &Apache::lonxml::get_param('which',$parstack,
                   1603: 						   $safeeval);
1.431     raeburn  1604:             if ($which=~/\w/) {
                   1605:                 $available_texts{$which} = $result;
                   1606:             }
                   1607:             my $otherlangs = &Apache::lonxml::get_param('other',$parstack,
                   1608:                                                         $safeeval);
                   1609:             foreach my $language (split(/\s*\,\s*/,$otherlangs)) {
                   1610:                 if ($language=~/\w/) {
                   1611:                     $available_texts{$language} = $result;
                   1612:                 }
1.427     bisitz   1613:             }
                   1614: 
1.397     albertel 1615: 	}
                   1616: 	return '';
                   1617:     }
                   1618: }
                   1619: 
1.170     www      1620: sub start_instructorcomment {
1.201     albertel 1621:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.170     www      1622: 
                   1623:     my $result;
                   1624: 
1.339     albertel 1625:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1626: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.468     raeburn  1627:         $result=($env{'request.role'}=~/^(in|cc|co|au|ca|li)/);
1.284     albertel 1628: 	if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {
1.201     albertel 1629: 	    my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
                   1630: 						   $parser,$style);
1.170     www      1631: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                   1632: 	}
                   1633: 	$result='';
                   1634:     } elsif ($target eq 'edit') {
                   1635: 	$result .=&Apache::edit::tag_start($target,$token);
                   1636: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1637:     }
                   1638:     return $result;
                   1639: }
                   1640: 
                   1641: sub end_instructorcomment {
1.159     albertel 1642:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel 1643:     my $result;
                   1644:     if ($target eq "edit") {
                   1645: 	$result.= &Apache::edit::tag_end($target,$token,'');
                   1646:     }
                   1647:     return $result;
1.4       tsai     1648: }
                   1649: 
                   1650: sub start_while {
1.326     albertel 1651:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 1652: 
1.160     albertel 1653:     my $result;
1.339     albertel 1654:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1655: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160     albertel 1656: 	my $code = $token->[2]->{'condition'};
1.4       tsai     1657: 
1.160     albertel 1658: 	push( @Apache::structuretags::whileconds, $code);
                   1659: 	if (!$Apache::lonxml::default_homework_loaded) {
                   1660: 	    &Apache::lonxml::default_homework_load($safeeval);
                   1661: 	}
                   1662: 	my $result = &Apache::run::run($code,$safeeval);
1.326     albertel 1663: 	my $bodytext=&Apache::lonxml::get_all_text("/while",$parser,$style);
1.160     albertel 1664: 	push( @Apache::structuretags::whilebody, $bodytext);
1.161     albertel 1665: 	push( @Apache::structuretags::whileline, $token->[5]);
                   1666: 	&Apache::lonxml::debug("s code $code got -$result-");
1.160     albertel 1667: 	if ( $result ) {
                   1668: 	    &Apache::lonxml::newparser($parser,\$bodytext);
                   1669: 	}
                   1670:     } elsif ($target eq 'edit') {
                   1671: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel 1672: 	$result .=&Apache::edit::text_arg(&mt('Test Condition:'),'condition',
1.160     albertel 1673: 					  $token,40);
                   1674: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1675:     } elsif ($target eq 'modified') {
                   1676: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1677: 						     $safeeval,'condition');
                   1678: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.159     albertel 1679:     }
1.160     albertel 1680:     return $result;
1.4       tsai     1681: }
                   1682: 
                   1683: sub end_while {
1.159     albertel 1684:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel 1685:     my $result;
                   1686: 
1.339     albertel 1687:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   1688: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.160     albertel 1689: 	my $code = pop(@Apache::structuretags::whileconds);
                   1690: 	my $bodytext = pop(@Apache::structuretags::whilebody);
1.161     albertel 1691: 	my $line = pop(@Apache::structuretags::whileline);
                   1692: 	my $return = &Apache::run::run($code,$safeeval);
                   1693: 	my $starttime=time;
                   1694: 	my $error=0;
                   1695: 	while ($return) {
                   1696: 	    if (time-$starttime >
                   1697: 		$Apache::lonnet::perlvar{'lonScriptTimeout'}) {
1.378     albertel 1698: 		$return = 0; $error=1; next;
1.161     albertel 1699: 	    }
                   1700: 	    $result.=&Apache::scripttag::xmlparse($bodytext);
1.380     albertel 1701: 	    if ($target eq 'grade' || $target eq 'answer' ||
                   1702: 		$target eq 'analyze') {
                   1703: 		# grade/answer/analyze should produce no output but if we
                   1704: 		# are redirecting, the redirecter should know what to do
                   1705: 		# with the output
                   1706: 		if (!$Apache::lonxml::redirection) { undef($result); }
                   1707: 	    }
1.161     albertel 1708: 	    $return = &Apache::run::run($code,$safeeval);
                   1709: 	}
                   1710: 	if ($error) {
1.430     bisitz   1711: 	    &Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occurred while running &lt;while&gt; on line').' '.$line.'</pre>');
1.160     albertel 1712: 	}
                   1713:     } elsif ($target eq "edit") {
                   1714: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.159     albertel 1715:     }
1.160     albertel 1716:     return $result;
1.1       albertel 1717: }
1.6       tsai     1718: 
1.160     albertel 1719: # <randomlist show="1">
1.6       tsai     1720: #  <tag1>..</tag1>
                   1721: #  <tag2>..</tag2>
                   1722: #  <tag3>..</tag3>
1.160     albertel 1723: #  ...
1.6       tsai     1724: # </randomlist>
                   1725: sub start_randomlist {
1.326     albertel 1726:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 1727:     my $result;
1.339     albertel 1728:     if ($target eq 'answer' || $target eq 'grade'   || $target eq 'web' ||
                   1729: 	$target eq 'tex'    || $target eq 'analyze' || $target eq 'webgrade') {
1.331     albertel 1730: 	my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
1.305     albertel 1731: 	my $b_parser= HTML::LCParser->new(\$body);
                   1732: 	$b_parser->xml_mode(1);
                   1733: 	$b_parser->marked_sections(1);
1.159     albertel 1734: 	my $b_tok;
                   1735: 	my @randomlist;
                   1736: 	my $list_item;
                   1737: 	while($b_tok = $b_parser->get_token() ) {
                   1738: 	    if($b_tok->[0] eq 'S') { # start tag
                   1739: 		# get content of the tag until matching end tag
                   1740: 		# get all text upto the matching tag
                   1741: 		# and push the content into @randomlist
                   1742: 		$list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],
                   1743: 							   $b_parser);
                   1744: 		$list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
                   1745: 		push(@randomlist,$list_item);
                   1746: 		#  print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4],
                   1747:                 #         $list_item</b>";
                   1748: 	    }
                   1749: 	    if($b_tok->[0] eq 'T') { # text
                   1750: 		# what to do with text in between tags?
                   1751: 		#  print "<b>TEXT $b_tok->[1]</b><br />";
                   1752: 	    }
                   1753: 	    # if($b_tok->[0] eq 'E') { # end tag, should not happen
                   1754: 	    #  print "<b>END-TAG $b_tok->[1]</b><br />";
                   1755: 	    # }
                   1756: 	}
1.303     albertel 1757: 	if (@randomlist) {
                   1758: 	    my @idx_arr = (0 .. $#randomlist);
                   1759: 	    &Apache::structuretags::shuffle(\@idx_arr);
                   1760: 	    my $bodytext = '';
                   1761: 	    my $show=$#randomlist;
                   1762: 	    my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
                   1763: 	    $showarg--;
                   1764: 	    if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
1.439     raeburn  1765:             if (($target eq 'analyze') && ($env{'form.check_parts_withrandomlist'})) {
                   1766:                 my @currlist;
                   1767:                 my $part = $Apache::inputtags::part;
                   1768:                 if ($part ne '') {
                   1769:                     if (ref($Apache::lonhomework::analyze{'parts_withrandomlist'}) eq 'ARRAY') {
                   1770:                         my @currlist = @{$Apache::lonhomework::analyze{'parts_withrandomlist'}};
                   1771:                         if (!(grep(/^\Q$part\E$/,@currlist))) {
                   1772:                             push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part);
                   1773:                         }
                   1774:                     } else {
                   1775:                         push(@{$Apache::lonhomework::analyze{'parts_withrandomlist'}},$part);
                   1776:                     }
                   1777:                 }
                   1778:             }
1.303     albertel 1779: 	    for(0 .. $show) {
                   1780: 		$bodytext .= "$randomlist[ $idx_arr[$_] ]";
                   1781: 	    }
                   1782: 	    &Apache::lonxml::newparser($parser,\$bodytext);
1.159     albertel 1783: 	}
                   1784:     } elsif ($target eq 'edit' ) {
                   1785: 	$result .=&Apache::edit::tag_start($target,$token);
                   1786: 	$result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
                   1787: 					   $token,5);
                   1788: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1789:     } elsif ($target eq 'modified' ) {
                   1790: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1791: 						     $safeeval,'show');
                   1792: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   1793:     }
                   1794:     return $result;
1.7       tsai     1795: }
                   1796: 
                   1797: sub shuffle {
                   1798:     my $a=shift;
                   1799:     my $i;
1.303     albertel 1800:     if (ref($a) eq 'ARRAY' && @$a) {
1.251     albertel 1801: 	&Apache::response::pushrandomnumber();
1.159     albertel 1802: 	for($i=@$a;--$i;) {
                   1803: 	    my $j=int(&Math::Random::random_uniform() * ($i+1));
                   1804: 	    next if $i == $j;
                   1805: 	    @$a[$i,$j] = @$a[$j,$i];
                   1806: 	}
1.251     albertel 1807: 	&Apache::response::poprandomnumber();
1.7       tsai     1808:     }
1.6       tsai     1809: }
                   1810: 
                   1811: sub end_randomlist {
1.159     albertel 1812:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1813:     my $result;
                   1814:     if ($target eq 'edit' ) {
                   1815: 	$result=&Apache::edit::tag_end($target,$token,
                   1816: 				       'End Randomly Parsed Block');
                   1817:     }
                   1818:     return $result;
1.6       tsai     1819: }
                   1820: 
1.283     albertel 1821: sub ordered_show_check {
                   1822:     my $last_part=$Apache::inputtags::partlist[-2];
                   1823:     my $in_order=
                   1824: 	&Apache::lonnet::EXT('resource.'.$Apache::inputtags::part.'.ordered');
                   1825:     my $in_order_show=1;
                   1826:     if ($last_part ne '0' && lc($in_order) eq 'yes') {
                   1827: 	$in_order_show=&Apache::response::check_status($last_part);
                   1828:     }
                   1829:     return $in_order_show;
                   1830: }
                   1831: 
1.469     www      1832: 
                   1833: sub start_startpartmarker {
                   1834:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1835:     my $result='';
                   1836:     if ($target eq 'edit') {
                   1837:         $result=&Apache::edit::tag_start($target,$token);
                   1838:         $result.=&mt('Marker for the start of a part. Place end marker below to wrap in-between tags into a new part.').'</td></tr>';
                   1839:         $result.=&Apache::edit::end_table();
                   1840: 
                   1841:     } 
                   1842:     return $result;
                   1843: }
                   1844: 
                   1845: sub end_startpartmarker {
                   1846:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1847:     my @result;
                   1848:     if ($target eq 'edit') { $result[1]='no'; }
                   1849:     return @result;
                   1850: }
                   1851: 
                   1852: sub start_endpartmarker {
                   1853:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1854:     my $result='';
                   1855:     if ($target eq 'edit') {
                   1856:         $result=&Apache::edit::tag_start($target,$token);
                   1857:         $result.=&mt('Marker for the end of a part. Place start marker above to wrap in-between tags into a new part.').'</td></tr>';
                   1858:         $result.=&Apache::edit::end_table();
                   1859: 
                   1860:     }
                   1861:     return $result;
                   1862: }
                   1863: 
                   1864: sub end_endpartmarker {
                   1865:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1866:     my @result;
                   1867:     if ($target eq 'edit') { $result[1]='no'; }
                   1868:     return @result;
                   1869: }
                   1870: 
                   1871: 
                   1872: 
                   1873: 
                   1874: 
1.11      albertel 1875: sub start_part {
1.326     albertel 1876:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.321     albertel 1877:     if (!$Apache::lonxml::metamode) {
                   1878: 	&Apache::lonxml::startredirection(); # we'll use redirection to fix up 
                   1879: 	                                     # duedates.
                   1880:     }
1.159     albertel 1881:     my $result='';
1.386     albertel 1882:     my $id= &Apache::lonxml::get_id($parstack,$safeeval);
1.159     albertel 1883:     $Apache::inputtags::part=$id;
1.177     albertel 1884:     push(@Apache::inputtags::partlist,$id);
                   1885:     @Apache::inputtags::response=();
1.159     albertel 1886:     @Apache::inputtags::previous=();
                   1887:     @Apache::inputtags::previous_version=();
1.405     albertel 1888:     &Apache::lonhomework::set_show_problem_status(&get_problem_status($id));
1.403     albertel 1889:     &Apache::response::reset_params();
                   1890: 
1.159     albertel 1891:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.259     albertel 1892:     my $newtype=&Apache::lonnet::EXT("resource.$id.type");
                   1893:     if ($newtype) { $Apache::lonhomework::type=$newtype; }
1.283     albertel 1894:     my $in_order_show=&ordered_show_check();
1.214     albertel 1895:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.259     albertel 1896:     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.209     albertel 1897:     &Apache::run::run($expression,$safeeval);
1.159     albertel 1898: 
                   1899:     if ($target eq 'meta') {
1.224     www      1900: 	my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
                   1901: 	return &Apache::response::mandatory_part_meta.
                   1902: 	       &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
1.159     albertel 1903:     } elsif ($target eq 'web' || $target eq 'grade' ||
                   1904: 	     $target eq 'answer' || $target eq 'tex') {
1.283     albertel 1905: 	if ($hidden || !$in_order_show) {
1.326     albertel 1906: 	    my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,$style);
1.159     albertel 1907: 	} else {
                   1908: 	    my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
                   1909: 	    push (@Apache::inputtags::status,$status);
                   1910: 	    my $expression='$external::datestatus="'.$status.'";';
                   1911: 	    $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
                   1912: 	    &Apache::run::run($expression,$safeeval);
1.284     albertel 1913: 	    if ($env{'request.state'} eq 'construct') {
1.241     albertel 1914: 		&set_problem_state($Apache::inputtags::part); 
1.240     albertel 1915: 	    }
1.216     albertel 1916: 	    if (( $status eq 'CLOSED' ) ||
                   1917: 		( $status eq 'UNCHECKEDOUT') ||
1.252     albertel 1918: 		( $status eq 'NOT_YET_VIEWED') ||
1.216     albertel 1919: 		( $status eq 'BANNED') ||
                   1920: 		( $status eq 'UNAVAILABLE') ||
                   1921: 		( $status eq 'INVALID_ACCESS')) {
1.326     albertel 1922: 		my $bodytext=&Apache::lonxml::get_all_text("/part",$parser,
                   1923: 							   $style);
1.159     albertel 1924: 		if ( $target eq "web" ) {
1.211     albertel 1925: 		    $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";
1.159     albertel 1926: 		} elsif ( $target eq 'tex' ) {
1.284     albertel 1927: 		    if (not $env{'form.problem_split'}=~/yes/) {
1.211     albertel 1928: 			$result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";
1.195     sakharuk 1929: 		    } else {
1.211     albertel 1930: 			$result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";
1.195     sakharuk 1931: 		    }
1.159     albertel 1932: 		}
                   1933: 	    } else {
                   1934: 		if ($target eq 'tex') {
1.284     albertel 1935: 		    if (not $env{'form.problem_split'}=~/yes/) {
1.264     sakharuk 1936: 			if ($$tagstack[-2] eq 'td') {
1.388     foxr     1937: 			    $result.='\noindent \begin{minipage}{\textwidth}\noindent';
1.264     sakharuk 1938: 			} else {
                   1939: 			    $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
                   1940: 			}
1.195     sakharuk 1941: 		    }
1.159     albertel 1942: 		    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.284     albertel 1943: 		    my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1.222     sakharuk 1944: 		    my @allkeys = split /,/,$allkeys;
                   1945: 		    my $allow_print_points = 0;
                   1946: 		    foreach my $partial_key (@allkeys) {
1.230     albertel 1947: 			if ($partial_key=~m/^part_(.*)$/) {
1.222     sakharuk 1948: 			    if ($1 ne '0') {$allow_print_points=1;}
                   1949: 			}
                   1950: 		    }
1.275     albertel 1951: 		    my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
                   1952: 		    if (defined($maxtries) && $maxtries < 0) {
                   1953: 			$allow_print_points=0;
                   1954: 		    }
1.302     albertel 1955: 		    if (lc($env{'course.'.$env{'request.course.id'}.
                   1956: 				    '.disableexampointprint'}) eq 'yes') {
                   1957: 			$allow_print_points=0;
                   1958: 		    }
1.463     foxr     1959: 		    if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { 
                   1960: 			$result .= '\vskip 10mm\fbox{\textit{'.$weight.' pt}}';
                   1961: 
                   1962: 		    }
1.233     www      1963: 		} elsif ($target eq 'web') {
1.479     raeburn  1964:                     if ($status eq 'CAN_ANSWER') {
                   1965:                         my $problemstatus = &get_problem_status($Apache::inputtags::part); 
                   1966:                         my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type");
                   1967:                         my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries");
                   1968:                         my $num = scalar(@Apache::inputtags::partlist)-1;
                   1969:                         if ($probrandomize eq 'randomizetry') {
                   1970:                             if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') {
                   1971:                                 $result .= &randomizetry_part_header($problemstatus,'none',$num);
                   1972:                             } else {
                   1973:                                 my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                   1974:                                 if ($probrandtries ne $reqtries) {
                   1975:                                     $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
                   1976:                                 }
                   1977:                             }
                   1978:                         } elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') {
                   1979:                             my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
                   1980:                             $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
                   1981:                         }
                   1982:                     }
1.475     raeburn  1983: 		    $result.='<a name="'.&escape($Apache::inputtags::part).'" ></a>';
1.159     albertel 1984: 		}
                   1985: 	    }
                   1986: 	}
                   1987:     } elsif ($target eq 'edit') {
                   1988: 	$result.=&Apache::edit::tag_start($target,$token);
                   1989: 	$result.=&Apache::edit::text_arg('Part ID:','id',$token).
                   1990: 	    &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
1.224     www      1991: 	    '&nbsp;&nbsp;'.
                   1992: &Apache::edit::text_arg('Displayed Part Description:','display',$token).
1.159     albertel 1993: 		&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1994:     } elsif ($target eq 'modified') {
                   1995: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.225     albertel 1996: 						     $safeeval,'id','display');
1.159     albertel 1997: 	if ($constructtag) {
1.225     albertel 1998: 	    #limiting ids to only letters numbers, and space
1.224     www      1999: 	    $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
1.159     albertel 2000: 	    $result = &Apache::edit::rebuild_tag($token);
                   2001: 	}
                   2002:     }
                   2003:     return $result;
1.11      albertel 2004: }
                   2005: 
                   2006: sub end_part {
1.159     albertel 2007:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   2008:     &Apache::lonxml::debug("in end_part $target ");
                   2009:     my $status=$Apache::inputtags::status['-1'];
                   2010:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.283     albertel 2011:     my $in_order_show=&ordered_show_check();
1.321     albertel 2012:     my $result;
                   2013:     if (!$Apache::lonxml::metamode) {
                   2014: 	$result = &Apache::lonxml::endredirection(); # started in &start_part
1.329     albertel 2015: 	$Apache::lonxml::post_evaluate=0;
1.321     albertel 2016:     }
1.312     albertel 2017:     if ($target eq 'grade') {
1.249     albertel 2018: 	if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&
1.283     albertel 2019: 	    !$hidden && $in_order_show) {
1.311     foxr     2020: 	    $result.=&Apache::inputtags::grade;
1.249     albertel 2021: 	} else {
                   2022: 	    # move any submission data to .hidden
                   2023: 	    &Apache::inputtags::hidealldata($Apache::inputtags::part);
                   2024: 	}
1.283     albertel 2025:     } elsif (($target eq 'web' || $target eq 'tex') &&
                   2026: 	     !$hidden && $in_order_show) {
1.159     albertel 2027: 	my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
                   2028: 							$target);
1.212     albertel 2029: 	if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
                   2030: 	    $gradestatus='';
                   2031: 	}
1.311     foxr     2032: 	$result.=$gradestatus;
1.265     sakharuk 2033: 	if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} 
1.181     albertel 2034:     } elsif ($target eq 'edit') {
1.311     foxr     2035: 	$result.=&Apache::edit::end_table();
1.322     albertel 2036:     } elsif ($target eq 'modified') {
                   2037: 	 $result .= $token->[2];
1.159     albertel 2038:     }
                   2039:     pop @Apache::inputtags::status;
                   2040:     $Apache::inputtags::part='';
1.295     albertel 2041:     $Apache::lonhomework::type = $Apache::lonhomework::default_type;
1.159     albertel 2042:     return $result;
1.11      albertel 2043: }
1.1       albertel 2044: 
1.25      albertel 2045: sub start_preduedate {
1.326     albertel 2046:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.339     albertel 2047:     if ($target eq 'web' || $target eq 'grade'    || $target eq 'answer' ||
                   2048: 	$target eq 'tex' || $target eq 'webgrade') {
1.236     albertel 2049: 	&Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);
1.300     albertel 2050: 	if (!$Apache::lonhomework::scantronmode &&
                   2051: 	    $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
1.236     albertel 2052: 	    $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
                   2053: 	    &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));
1.326     albertel 2054: 	    &Apache::lonxml::get_all_text("/preduedate",$parser,$style);
1.159     albertel 2055: 	}
1.24      albertel 2056:     }
1.159     albertel 2057:     return '';
1.24      albertel 2058: }
                   2059: 
1.25      albertel 2060: sub end_preduedate {
1.159     albertel 2061:     return '';
1.24      albertel 2062: }
                   2063: 
1.369     foxr     2064: # In all the modes where <postanswerdate> text is 
                   2065: # displayable,  all we do is eat up the text between the start/stop
                   2066: # tags if the conditions are not right to display it.
1.25      albertel 2067: sub start_postanswerdate {
1.326     albertel 2068:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.370     foxr     2069:     my $pav = &Apache::lonnet::allowed('pav', $env{'request.course.id'}) ||
                   2070: 	&Apache::lonnet::allowed('pav',
                   2071: 			   $env{'request.course.id'}.'/'.$env{'request.course.sec'});
1.369     foxr     2072:     if ($target eq 'web' || $target eq 'grade' || $target eq 'webgrade' ||
1.370     foxr     2073: 	$target eq 'tex' ) {
1.300     albertel 2074: 	if ($Apache::lonhomework::scantronmode ||
1.370     foxr     2075: 	    $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER' ||
                   2076: 	    (($target eq 'tex') && !$pav)) {
1.326     albertel 2077: 	    &Apache::lonxml::get_all_text("/postanswerdate",$parser,$style);
1.159     albertel 2078: 	}
                   2079:     }
                   2080:     return '';
1.24      albertel 2081: }
                   2082: 
1.25      albertel 2083: sub end_postanswerdate {
1.159     albertel 2084:     return '';
1.24      albertel 2085: }
                   2086: 
1.25      albertel 2087: sub start_notsolved {
1.326     albertel 2088:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 2089:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.339     albertel 2090: 	$target eq 'tex' || $target eq 'webgrade') {
1.159     albertel 2091: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
                   2092: 	&Apache::lonxml::debug("not solved has :$gradestatus:");
1.239     albertel 2093: 	if ($gradestatus =~ /^correct/ &&
                   2094: 	    &Apache::response::show_answer()) {
1.159     albertel 2095: 	    &Apache::lonxml::debug("skipping");
1.326     albertel 2096: 	    &Apache::lonxml::get_all_text("/notsolved",$parser,$style);
1.159     albertel 2097: 	}
1.24      albertel 2098:     }
1.159     albertel 2099:     return '';
1.24      albertel 2100: }
                   2101: 
1.25      albertel 2102: sub end_notsolved {
1.159     albertel 2103:     return '';
1.24      albertel 2104: }
                   2105: 
                   2106: sub start_solved {
1.326     albertel 2107:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 2108:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   2109: 	$target eq 'tex') {
                   2110: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
1.239     albertel 2111: 	if ($gradestatus !~ /^correct/ ||
                   2112: 	    !&Apache::response::show_answer()) {
1.326     albertel 2113: 	    &Apache::lonxml::get_all_text("/solved",$parser,$style);
1.159     albertel 2114: 	}
1.24      albertel 2115:     }
1.159     albertel 2116:     return '';
1.24      albertel 2117: }
                   2118: 
                   2119: sub end_solved {
1.248     albertel 2120:     return '';
                   2121: }
                   2122: 
                   2123: sub start_problemtype {
1.326     albertel 2124:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.248     albertel 2125:     my $result;
1.339     albertel 2126:     if ($target eq 'web' || $target eq 'grade'   || $target eq 'answer' ||
                   2127: 	$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') {
1.248     albertel 2128: 	my $mode=lc(&Apache::lonxml::get_param('mode',$parstack,$safeeval));
                   2129: 	if (!defined($mode)) { $mode='show'; }
                   2130: 	my $for=&Apache::lonxml::get_param('for',$parstack,$safeeval);
                   2131: 	my $found=0;
                   2132: 	foreach my $type (split(',',$for)) {
                   2133: 	    if ($Apache::lonhomework::type eq lc($type)) { $found=1; }
                   2134: 	}
                   2135: 	if ($mode eq 'show' && !$found) {
1.326     albertel 2136: 	    &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248     albertel 2137: 	}
                   2138: 	if ($mode eq 'hide' && $found) {
1.326     albertel 2139: 	    &Apache::lonxml::get_all_text("/problemtype",$parser,$style);
1.248     albertel 2140: 	}
                   2141:     } elsif ($target eq 'edit') {
                   2142: 	$result .=&Apache::edit::tag_start($target,$token);
                   2143: 	$result.=&Apache::edit::select_arg('Mode:','mode',
                   2144: 					   [['show','Show'],
                   2145: 					    ['hide','Hide']]
                   2146: 					   ,$token);
                   2147: 	$result .=&Apache::edit::checked_arg('When used as type(s):','for',
                   2148: 					     [ ['exam','Exam/Quiz Problem'],
                   2149: 					       ['survey','Survey'],
1.465     raeburn  2150:                                                ['surveycred','Survey (with credit)'],
                   2151:                                                ['anonsurvey','Anonymous Survey'],
                   2152:                                                ['anonsurveycred','Anonymous Survey (with credit)'],
1.428     raeburn  2153: 					       ['problem','Homework Problem'],
1.479     raeburn  2154:                                                ['practice','Practice Problem'],
                   2155:                                                ['randomizetry','New Randomization Each Try'] ]
1.248     albertel 2156: 					     ,$token);
                   2157: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   2158:     } elsif ($target eq 'modified') {
                   2159: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   2160: 						     $safeeval,'mode','for');
                   2161: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   2162:     }
                   2163:     return $result;
                   2164: }
                   2165: 
                   2166: sub end_problemtype {
1.159     albertel 2167:     return '';
1.24      albertel 2168: }
1.34      albertel 2169: 
                   2170: sub start_startouttext {
1.159     albertel 2171:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   2172:     my @result=(''.'');
                   2173:     if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
1.404     albertel 2174:     
                   2175:     my $nesting = 
                   2176: 	&Apache::lonxml::set_state('outtext',
                   2177: 				   &Apache::lonxml::get_state('outtext')+1);
                   2178:     if ($nesting > 1 && $env{'request.state'} eq 'construct') {
                   2179: 	&Apache::lonxml::error("Nesting of &lt;startouttext /&gt; not allowed, on line ".$token->[5]);
                   2180:     }
1.159     albertel 2181:     return (@result);
1.34      albertel 2182: }
1.159     albertel 2183: 
1.34      albertel 2184: sub end_startouttext {
1.326     albertel 2185:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.159     albertel 2186:     my $result='';
                   2187:     my $text='';
                   2188:     if ($target eq 'edit') {
1.424     foxr     2189: 	my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth;
1.326     albertel 2190: 	$text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.437     raeburn  2191: 	$result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>"
1.438     bisitz   2192:                  .'<td><span class="LC_nobreak">'.&mt('Delete?').' '
1.437     raeburn  2193:                  .&Apache::edit::deletelist($target,$token)
1.474     raeburn  2194:                  .'</span></td>'
                   2195: 	         .'<td align="left"><span id="math_'.$areaid.'" />'
                   2196: 		 .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
                   2197: 		 .'<span></td>'
                   2198: 		 .'<td>'
                   2199: 		 .&Apache::edit::insertlist($target,$token)
                   2200: 		 .'</td>'
                   2201: 	         .'<td align="right" valign="top">' .
                   2202: 	         &Apache::loncommon::helpLatexCheatsheet().
1.159     albertel 2203: 		 &Apache::edit::end_row().
1.362     albertel 2204:                  &Apache::edit::start_spanning_row()."\n".
1.255     www      2205: 		 &Apache::edit::editfield($token->[1],$text,"",80,8,1);
1.159     albertel 2206:     }
                   2207:     if ($target eq 'modified') {
1.219     albertel 2208: 	$result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);
1.159     albertel 2209:     }
                   2210:     if ($target eq 'tex') {
                   2211: 	$result .= '\noindent ';
                   2212:     }
                   2213:     return $result;
1.34      albertel 2214: }
1.159     albertel 2215: 
1.34      albertel 2216: sub start_endouttext {
1.159     albertel 2217:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   2218:     my $result='';
                   2219:     if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
                   2220:     if ($target eq "modified") {
                   2221: 	$result='<endouttext />'.
1.377     albertel 2222: 	    &Apache::edit::handle_insertafter('startouttext');
                   2223:     }
1.404     albertel 2224: 
                   2225:     my $nesting = 
                   2226: 	&Apache::lonxml::set_state('outtext',
                   2227: 				   &Apache::lonxml::get_state('outtext')-1);
                   2228:     if ($nesting < 0 && $env{'request.state'} eq 'construct') {
                   2229: 	&Apache::lonxml::error(" Extraneous &lt;endouttext /&gt; not allowed on line ".$token->[5]);
                   2230: 	&Apache::lonxml::set_state('outtext', 0);
                   2231:     }
1.159     albertel 2232:     return $result;
1.34      albertel 2233: }
1.159     albertel 2234: 
1.34      albertel 2235: sub end_endouttext {
1.159     albertel 2236:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   2237:     my @result=('','');
                   2238:     if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
                   2239:     return (@result);
1.34      albertel 2240: }
1.159     albertel 2241: 
1.45      albertel 2242: sub delete_startouttext {
1.326     albertel 2243:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
                   2244:     #  my $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style);
1.159     albertel 2245:     my $text=$$parser['-1']->get_text("/endouttext");
                   2246:     my $ntoken=$$parser['-1']->get_token();
                   2247:     &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
                   2248:     &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
                   2249:     # Deleting 2 parallel tag pairs, but we need the numbers later to look like
                   2250:     # they did the last time round
                   2251:     &Apache::lonxml::increasedepth($ntoken);
                   2252:     &Apache::lonxml::decreasedepth($ntoken);
                   2253:     return 1;
1.193     www      2254: }
                   2255: 
                   2256: sub start_simpleeditbutton {
                   2257:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   2258:     my $result='';
1.284     albertel 2259:     if (($env{'form.simple_edit_button'} ne 'off') &&
1.273     albertel 2260: 	($target eq 'web') &&
1.330     albertel 2261:         (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
1.284     albertel 2262:         my $url=$env{'request.noversionuri'};
1.193     www      2263:         $url=~s/\?.*$//;
1.367     albertel 2264: 	my ($symb) = &Apache::lonnet::whichuser();
1.451     bisitz   2265: #       Warning makes more sense and is more important on edit screen
1.442     bisitz   2266: #       $result='<p class="LC_warning">'
                   2267: #              .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.')
                   2268: #              .&Apache::loncommon::help_open_topic('Caching')
                   2269: #              .'</p>';
1.451     bisitz   2270:         $result.=&Apache::lonhtmlcommon::start_funclist()
                   2271:                 .&Apache::lonhtmlcommon::add_item_funclist(
                   2272:                      '<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'
                   2273:                     .&mt('Edit').'</a>')
                   2274:                 .&Apache::lonhtmlcommon::end_funclist();
1.442     bisitz   2275: 
1.193     www      2276:     }
                   2277:     return $result;
                   2278: }
                   2279: 
                   2280: sub end_simpleeditbutton {
                   2281:     return '';
1.45      albertel 2282: }
1.34      albertel 2283: 
1.428     raeburn  2284: sub practice_problem_header {
                   2285:     return '<span class="LC_info"><h3>'.&mt('Practice Problem').'</h3></span>'.
                   2286:            '<span class="LC_info">'.&mt('Submissions are not permanently recorded').
                   2287:            '</span>';
                   2288: }
                   2289: 
1.479     raeburn  2290: sub randomizetry_problem_header {
                   2291:     my ($problemstatus,$reqtries) = @_;
                   2292:     my ($header,$text);
                   2293:     if ($reqtries > 1) {
                   2294:         $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);
                   2295:         if (($problemstatus eq 'no') ||
                   2296:             ($problemstatus eq 'no_feedback_ever')) {
                   2297:             $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries);
                   2298:         } else {
                   2299:             $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries);
                   2300:         }
                   2301:     } else {
                   2302:         $header = &mt('New Problem Variation Each Try');
                   2303:         if (($problemstatus eq 'no') ||
                   2304:             ($problemstatus eq 'no_feedback_ever')) {
                   2305:             $text = &mt('A new variation will be generated after each try until the tries limit is reached.');
                   2306: 
                   2307:         } else {
                   2308:             $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');
                   2309:         }
                   2310:     }
                   2311:     return '<span class="LC_info"><h3>'.$header.'</h3></span>'.
                   2312:            '<span class="LC_info">'.$text.'</span><hr />';
                   2313: }
                   2314: 
                   2315: sub randomizetry_part_header {
                   2316:     my ($problemstatus,$reqtries,$num) = @_;
                   2317:     my ($header,$text);
                   2318:     if ($reqtries eq 'none') {
                   2319:         $header = &mt('No Question Variation');
                   2320:         $text = &mt('For this question there will no new variation after a try.');
                   2321:     } elsif ($reqtries > 1) {
                   2322:         $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);
                   2323:         if (($problemstatus eq 'no') ||
                   2324:             ($problemstatus eq 'no_feedback_ever')) {
                   2325:             $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries);
                   2326:         } else {
                   2327:             $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries);
                   2328:         }
                   2329:     } else {
                   2330:         $header = &mt('New Question Variation For Each Try');
                   2331:         if (($problemstatus eq 'no') ||
                   2332:             ($problemstatus eq 'no_feedback_ever')) {
                   2333:             $text =  &mt('For this question a new variation will be generated after each try until the tries limit is reached.');
                   2334:         } else {
                   2335:             $text = &mt('For this question a new variation will be generated after each try until correct or tries limit is reached.');
                   2336:         }
                   2337:     }
                   2338:     my $output;
                   2339:     if ($num > 1) {
                   2340:         $output .= '<hr />';
                   2341:     }
                   2342:     $output .=  '<span class="LC_info"><h4>'.$header.'</h4></span>'.
                   2343:                   '<span class="LC_info">'.$text.'</span><br /><br />';
                   2344:     return $output;
                   2345: }
                   2346: 
1.1       albertel 2347: 1;
                   2348: __END__
1.435     jms      2349: 
                   2350: =pod
                   2351: 
                   2352: =back
                   2353: 
                   2354: =cut

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