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

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

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