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

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

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