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

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

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