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

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

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