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

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

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