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

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

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