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

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

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