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

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

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