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

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

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