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

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

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