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

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

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