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

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.313   ! albertel    4: # $Id: structuretags.pm,v 1.312 2005/11/03 17:55:12 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.267     albertel   39: use Time::HiRes qw( gettimeofday tv_interval );
1.78      harris41   40: BEGIN {
1.248     albertel   41:     &Apache::lonxml::register('Apache::structuretags',('block','languageblock','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag'));
1.10      albertel   42: }
                     43: 
                     44: sub start_web {
1.159     albertel   45:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.200     albertel   46:     my $bodytext=&Apache::lonxml::get_all_text("/web",$parser);
                     47:     if ($target eq 'web') {
                     48: 	return $bodytext;
1.159     albertel   49:     }
                     50:     return '';
1.10      albertel   51: }
                     52: 
                     53: sub end_web {
1.44      ng         54:     return '';
1.10      albertel   55: }
                     56: 
                     57: sub start_tex {
1.159     albertel   58:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.198     sakharuk   59:     my $result='';
1.200     albertel   60:     my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser);
                     61:     if ($target eq 'tex') {
                     62: 	return $bodytext.' ';
1.159     albertel   63:     }
1.198     sakharuk   64:     return $result;;
1.10      albertel   65: }
                     66: 
                     67: sub end_tex {
1.44      ng         68:     return '';
1.9       albertel   69: }
                     70: 
1.290     albertel   71: sub body_tag_start {
                     72:     my ($target,$background,$bgcolor)=@_;
                     73:     my $body_tag_start='<body onload="'.&Apache::lonmenu::loadevents().'" '.
                     74: 	'onunload="'.&Apache::lonmenu::unloadevents().'" ';
                     75:     if ($env{'browser.imagesuppress'} eq 'on') { $background=''; }
                     76:     if ($background) {
1.306     albertel   77: 	&Apache::lonxml::extlink($background);
1.290     albertel   78: 	$body_tag_start.='background="'.$background.'" ';
                     79:     } else {
                     80: 	if (($bgcolor) && ($env{'browser.blackwhite'} ne 'on')) {
                     81: 	    $body_tag_start.='bgcolor="'.$bgcolor.'" ';
                     82: 	} else {
                     83: 	    $body_tag_start.='bgcolor="#ffffff"';
                     84: 	}
                     85:     }
                     86:     if ($env{'browser.fontenhance'} eq 'on') {
                     87: 	$body_tag_start.=' style="font-size: x-large;" ';
                     88:     }
                     89:     $body_tag_start.='>'.&Apache::lonmenu::menubuttons(undef,$target,1);
1.297     albertel   90:     
                     91:     &Apache::lontexconvert::jsMath_reset();
1.290     albertel   92:     if ($env{'environment.texengine'} eq 'jsMath') {
1.297     albertel   93: 	$body_tag_start.=&Apache::lontexconvert::jsMath_header();
1.290     albertel   94:     }
                     95:     return $body_tag_start;
                     96: }
1.291     albertel   97: 
1.48      albertel   98: sub page_start {
1.159     albertel   99:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    100:     my %found;
1.207     albertel  101:     foreach my $taginside (@$tagstack) {
1.159     albertel  102: 	foreach my $taglookedfor ('html','body','form') {
                    103: 	    if ($taginside =~ /^$taglookedfor$/i) {$found{$taglookedfor} = 1;}
                    104: 	}
                    105:     }
                    106: 
                    107:     my $result;
                    108:     my $head_tag_start;
                    109:     if (!defined($found{'html'})) {
                    110: 	$result=&Apache::londefdef::start_html($target,$token,$tagstack,
                    111: 					       $parstack,$parser,$safeeval);
1.254     www       112: 	$head_tag_start='<head>'.&Apache::lonmenu::registerurl(undef,$target).
1.261     www       113: 	    &Apache::lonhtmlcommon::htmlareaheaders().
1.270     albertel  114: 	    &Apache::lonhtmlcommon::spellheader().
                    115: 	    &Apache::lonxml::fontsettings();     
1.159     albertel  116:     }
                    117:     my $body_tag_start;
1.284     albertel  118:     if (!defined($found{'body'}) && $env{'request.state'} eq 'construct'
                    119: 	&& $env{'environment.remote'} eq 'off') {
1.298     albertel  120: 	if ($target eq 'web' || $target eq 'edit') {
1.297     albertel  121: 	    $body_tag_start=&Apache::loncommon::bodytag();
                    122: 	    $body_tag_start.=&Apache::lonxml::message_location();
                    123: 	}
1.272     albertel  124:     } elsif (!defined($found{'body'})) {
1.159     albertel  125: 	my $background=&Apache::lonxml::get_param('background',$parstack,
                    126: 						  $safeeval);
1.290     albertel  127: 	my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
                    128: 					       $safeeval);
1.299     albertel  129: 	$body_tag_start=&body_tag_start($target,$background,$bgcolor);
1.291     albertel  130: 	if ( ($target eq 'web' || $target eq 'webgrade')
                    131: 	     && $env{'request.state'} ne 'construct') {
1.165     albertel  132: 	    my ($symb,undef,undef,undef,$publicuser)=
                    133: 		&Apache::lonxml::whichuser();
                    134: 	    if ($symb eq '' && !$publicuser) {
1.159     albertel  135: 		my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");
1.211     albertel  136: 		$help=&mt("Browsing resource, all submissions are temporary.")."<br />";
1.159     albertel  137: 		$body_tag_start.=$help;
                    138: 	    }
                    139: 	}
1.245     albertel  140: 	$body_tag_start.=&Apache::lonxml::message_location();
1.159     albertel  141:     }
                    142:     my $form_tag_start;
                    143:     if (!defined($found{'form'})) {
1.281     albertel  144: 	$form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="POST" action="';
1.284     albertel  145: 	my $uri=$env{'request.uri'};
                    146: 	if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
1.271     albertel  147: 	$form_tag_start.=$uri.'">';
1.159     albertel  148:     }
                    149:     return ($result,$head_tag_start,$body_tag_start,$form_tag_start);
1.105     albertel  150: }
                    151: 
1.141     matthew   152: #use Time::HiRes();
1.105     albertel  153: sub get_resource_name {
1.159     albertel  154:     my ($parstack,$safeeval)=@_;
1.204     albertel  155:     if (defined($Apache::lonhomework::name)) {
                    156: 	return $Apache::lonhomework::name;
                    157:     }
1.279     albertel  158:     my ($symb)=&Apache::lonxml::whichuser();
                    159:     my $name=&Apache::lonnet::gettitle($symb);
1.159     albertel  160:     if ($name eq '') {
                    161: 	$name=&Apache::lonnet::EXT('resource.title');
                    162: 	if ($name eq 'con_lost') { $name = ''; }
                    163:     }
1.204     albertel  164:     if ($name!~/\S+/) {
1.284     albertel  165: 	$name=$env{'request.uri'};
1.205     albertel  166: 	$name=~s-.*/([^/]+)$-$1-;
1.204     albertel  167:     }
1.159     albertel  168:     $Apache::lonhomework::name=$name;
                    169:     return $name;
1.105     albertel  170: }
                    171: 
                    172: sub setup_rndseed {
1.159     albertel  173:     my ($safeeval)=@_;
                    174:     my $rndseed;
1.162     albertel  175:     my ($symb)=&Apache::lonxml::whichuser();
1.284     albertel  176:     if ($env{'request.state'} eq "construct" || $symb eq '' ||
1.247     albertel  177:           $Apache::lonhomework::history{'resource.CODE'}) {
1.284     albertel  178: 	$rndseed=$env{'form.rndseed'};
1.159     albertel  179: 	if (!$rndseed) {
1.162     albertel  180: 	    $rndseed=$Apache::lonhomework::history{'rndseed'};
                    181: 	    if (!$rndseed) {
                    182: 		$rndseed=time;
                    183: 	    }
1.284     albertel  184: 	    $env{'form.rndseed'}=$rndseed;
1.162     albertel  185: 	}
1.284     albertel  186: 	if ($env{'form.resetdata'} eq &mt('New Problem Variation') ||
                    187: 	    $env{'form.newrandomization'} eq &mt('New Randomization')) {
1.190     albertel  188: 	    srand(time);
                    189: 	    $rndseed=int(rand(2100000000));
1.284     albertel  190: 	    $env{'form.rndseed'}=$rndseed;
                    191: 	    delete($env{'form.resetdata'});
                    192: 	    delete($env{'form.newrandomization'});
1.159     albertel  193: 	}
1.187     albertel  194: 	if (defined($rndseed) && $rndseed ne int($rndseed)) {
1.307     albertel  195: 	    $rndseed=join(':',&Apache::lonnet::digest($rndseed));
1.187     albertel  196:         }
1.247     albertel  197:         if ($Apache::lonhomework::history{'resource.CODE'}) {
                    198: 	   $rndseed=&Apache::lonnet::rndseed();
                    199: 	}
1.221     albertel  200: 	if ($safeeval) {
                    201: 	    &Apache::lonxml::debug("Setting rndseed to $rndseed");
1.250     albertel  202: 	    &Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval);
1.221     albertel  203: 	}
1.159     albertel  204:     }
                    205:     return $rndseed;
1.105     albertel  206: }
                    207: 
1.268     albertel  208: sub remember_problem_state {
                    209:     return '
1.284     albertel  210:        <input type="hidden" name="problemstate" value="'.$env{'form.problemstate'}.'" />
                    211:        <input type="hidden" name="problemtype" value="'.$env{'form.problemtype'}.'" />
                    212:        <input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />';
1.268     albertel  213: }
                    214: 
1.105     albertel  215: sub problem_edit_header {
1.268     albertel  216:     return '<input type="hidden" name="submitted" value="edit" />'.
                    217: 	&Apache::structuretags::remember_problem_state().'
1.210     albertel  218:        <input type="hidden" name="problemmode" value="'.&mt('Edit').'" />
1.243     matthew   219:        <input type="submit" name="problemmode" accesskey="d" value="'.&mt('Discard Edits and View').'" />
                    220:        <input type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />
                    221:        <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" /> <hr />
                    222:        <input type="submit" name="submit" accesskey="s" value="'.&mt('Submit Changes and Edit').'" />
                    223:        <input type="submit" name="submit" accesskey="v" value="'.&mt('Submit Changes and View').'" /><table><tr><td>'.
1.260     albertel  224:        &Apache::loncommon::help_open_menu('','Problem Editing Help','Problem_Editor_XML_Index','',5,'Authoring',undef,undef,undef,'Problem Editing Help')
                    225:        .'</td></tr></table>'.
1.282     albertel  226:        '<table border="0" width="100%"><tr><td bgcolor="#DDDDDD">';
1.105     albertel  227: }
                    228: 
                    229: sub problem_edit_footer {
1.210     albertel  230:     return '</td></tr></table><br /><input type="submit" name="submit" value="'.&mt('Submit Changes and Edit').'" />
1.255     www       231:     <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" />'.
                    232:     &Apache::lonhtmlcommon::htmlareaselectactive(@Apache::lonxml::htmlareafields).
1.280     albertel  233:     "\n</form>\n".&Apache::loncommon::endbodytag()."\n</html>";
1.105     albertel  234: }
                    235: 
1.235     albertel  236: sub option {
                    237:     my ($value,$name) = @_;
                    238:     my $result ="<option value='".$value."' ";
1.284     albertel  239:     if ($env{'form.'.$name} eq $value) {
1.235     albertel  240: 	$result.=" selected='on' ";
                    241:     }
                    242:     $result.='>';
                    243:     return $result;
                    244: }
                    245: 
1.105     albertel  246: sub problem_web_to_edit_header {
1.159     albertel  247:     my ($rndseed)=@_;
1.313   ! albertel  248:     my $result.='<input type="hidden" name="problemmode" value="'.&mt('View').'" />';
        !           249:     if (!$Apache::lonhomework::parsing_a_task) {
        !           250: 	$result .= '<input type="submit" name="problemmode" accesskey="e" value="'.&mt('Edit').'" />';
        !           251:     }
        !           252:     $result .= '<input type="submit" name="problemmode" accesskey="x" value="'.&mt('EditXML').'" />
1.243     matthew   253:              <input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" />
                    254:              <input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" />
1.210     albertel  255:              <nobr><input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" />
1.270     albertel  256:               <input type="text" name="rndseed" size="10" value="'.
1.175     albertel  257: 	       $rndseed.'"
1.270     albertel  258:            onchange="javascript:document.lonhomework.changerandseed.click()" /></nobr>
1.281     albertel  259:              <label><input type="checkbox" name="showallfoils" ';
1.284     albertel  260:     if (defined($env{'form.showallfoils'})) { $result.='checked="on"'; }
1.228     www       261:     $result.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').
                    262: 	&Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area','Testing Problems').
1.281     albertel  263: 	'</label><hr />';
1.313   ! albertel  264:     if (!$Apache::lonhomework::parsing_a_task) {
        !           265: 	$result.="
1.235     albertel  266: <nobr>
                    267: Problem Status:
                    268: <select name='problemstate'>
1.270     albertel  269:   <option value=''></option>
1.235     albertel  270:   ".&option('CLOSED'               ,'problemstate').&mt("Closed")."</option>
                    271:   ".&option('CAN_ANSWER'           ,'problemstate').&mt("Answerable")."</option>
                    272:   ".&option('CANNOT_ANSWER_tries'  ,'problemstate').&mt("Open with full tries")."</option>
                    273:   ".&option('CANNOT_ANSWER_correct','problemstate').&mt("Open and correct")."</option>
                    274:   ".&option('SHOW_ANSWER'          ,'problemstate').&mt("Show Answer")."</option>
                    275: </select>
                    276: </nobr>
                    277: <nobr>
                    278: Problem Type:
                    279: <select name='problemtype'>
1.270     albertel  280:   <option value=''></option>
1.242     albertel  281:   ".&option('exam'   ,'problemtype').&mt("Exam Problem")."</option>
                    282:   ".&option('problem','problemtype').&mt("Homework problem")."</option>
                    283:   ".&option('survey' ,'problemtype').&mt("Survey Question")."</option>
1.235     albertel  284: </select>
                    285: </nobr>
                    286: <nobr>
                    287: Feedback Mode:
                    288: <select name='problemstatus'>
                    289:   <option value=''></option>
1.242     albertel  290:   ".&option('yes','problemstatus').&mt("Show Feedback")."</option>
                    291:   ".&option('no', 'problemstatus').&mt("Don't Show Feedback")."</option>
1.235     albertel  292: </select>
                    293: </nobr>
1.242     albertel  294: <input type='submit' name='changeproblemmode' value='".&mt("Change")."' />
1.235     albertel  295: <hr />";
1.313   ! albertel  296: 	my $numtoanalyze=$env{'form.numtoanalyze'};
        !           297: 	if (!$numtoanalyze) { $numtoanalyze=20; }
        !           298: 	$result.= '<input type="submit" name="problemmode" value='.
        !           299: 	    &mt('"Calculate answers').'" /> for
1.136     albertel  300:              <input type="text" name="numtoanalyze" value="'.
1.210     albertel  301: 	     $numtoanalyze.'" size="5" /> '.&mt('versions of this problem').
                    302: 	     '.'.&Apache::loncommon::help_open_topic("Analyze_Problem",
1.176     albertel  303: 						     '',undef,undef,300).
1.210     albertel  304: 						     '<hr />';
1.313   ! albertel  305:     }
1.159     albertel  306:     return $result;
1.48      albertel  307: }
                    308: 
1.65      albertel  309: sub initialize_storage {
1.159     albertel  310:     %Apache::lonhomework::results=();
1.162     albertel  311:     %Apache::lonhomework::history=();
1.159     albertel  312:     my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
1.284     albertel  313:     if ($env{'request.state'} eq 'construct' || $symb eq '') {
1.159     albertel  314: 	%Apache::lonhomework::history=
1.284     albertel  315: 	    &Apache::lonnet::tmprestore($env{'request.uri'},'',$domain,$name);
1.159     albertel  316: 	my ($temp)=keys %Apache::lonhomework::history ;
                    317: 	&Apache::lonxml::debug("Return message of $temp");
                    318:     } else {
                    319: 	%Apache::lonhomework::history=
                    320: 	    &Apache::lonnet::restore($symb,$courseid,$domain,$name);
                    321:     }
                    322:     #ignore error conditions
1.67      albertel  323:     my ($temp)=keys %Apache::lonhomework::history ;
1.159     albertel  324:     if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
1.65      albertel  325: }
                    326: 
                    327: # -------------------------------------------------------------finalize_storage
                    328: # Stores away the result has to a student's environment
                    329: # checks form.grade_ for specific values, other wises stores
                    330: # to the running users environment
1.285     raeburn   331: # Will increment totals for attempts, students, and corrects
                    332: # if running user has student role.  
1.65      albertel  333: sub finalize_storage {
1.159     albertel  334:     my $result;
1.289     albertel  335:     if (%Apache::lonhomework::results) {
1.159     albertel  336: 	my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
1.284     albertel  337: 	if ($env{'request.state'} eq 'construct' || $symb eq '') {
                    338: 	    $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'};
1.159     albertel  339: 	    $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
1.284     albertel  340: 					$env{'request.uri'},'',$domain,$name);
1.159     albertel  341: 	    &Apache::lonxml::debug('Construct Store return message:'.$result);
                    342: 	} else {
                    343: 	    $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
                    344: 					    $symb,$courseid,$domain,$name);
                    345: 	    &Apache::lonxml::debug('Store return message:'.$result);
1.285     raeburn   346:             if ($env{'request.role'} =~/^st/) {
                    347:                 &store_aggregates($symb,$courseid);
                    348:             }
1.159     albertel  349: 	}
1.67      albertel  350:     }
1.159     albertel  351:     return $result;
1.65      albertel  352: }
1.289     albertel  353: use Data::Dumper;
1.65      albertel  354: 
1.285     raeburn   355: # -------------------------------------------------------------store_aggregates
                    356: # Sends hash of values to be incremented in nohist_resourcetracker.db
                    357: # for the course. Increments total number of attempts, unique students 
                    358: # and corrects for each part for an instance of a problem, as appropriate.
                    359: sub store_aggregates {
                    360:     my ($symb,$courseid) = @_;
1.286     albertel  361:     my %aggregate;
                    362:     my @parts;
1.288     albertel  363:     my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};
                    364:     my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
1.286     albertel  365:     foreach my $key (keys(%Apache::lonhomework::results)) {
1.287     albertel  366:         if ($key =~ /resource\.([^\.]+)\.tries/) {
1.286     albertel  367:             push(@parts, $1);
1.285     raeburn   368:         }
                    369:     }
1.286     albertel  370:     foreach my $part (@parts) {
                    371:         if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
                    372: 	    eq 'APPROX_ANS' ||
                    373: 	    $Apache::lonhomework::results{'resource.'.$part.'.award'}
                    374: 	    eq 'EXACT_ANS') {
1.287     albertel  375:             $aggregate{$symb."\0".$part."\0correct"} = 1;
1.285     raeburn   376:         }
1.286     albertel  377:         if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {
1.287     albertel  378:             $aggregate{$symb."\0".$part."\0users"} = 1;
1.292     raeburn   379:         } else {
1.293     albertel  380:             my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]); 
1.292     raeburn   381:             if ($last_reset) {
1.293     albertel  382:                 if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) {
1.292     raeburn   383:                     $aggregate{$symb."\0".$part."\0users"} = 1;
                    384:                 }
                    385:             }
1.285     raeburn   386:         }
1.287     albertel  387:         $aggregate{$symb."\0".$part."\0attempts"} = 1;
1.285     raeburn   388:     }
1.292     raeburn   389:     if (keys (%aggregate) > 0) {
1.289     albertel  390: 	&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
1.292     raeburn   391:                             $cdomain,$cname);
                    392:     }
                    393: }
1.289     albertel  394: 
1.65      albertel  395: sub checkout_msg {
1.211     albertel  396:     my %lt=&Apache::lonlocal::texthash( 
                    397: 		'resource'=>'The resource needs to be checked out',
                    398: 		'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.',
                    399:                 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.',
                    400:                 'checkout'=>'Check out Exam for Viewing',
                    401: 		'checkout?'=>'Check out Exam?');
1.159     albertel  402:     return (<<ENDCHECKOUT);
1.211     albertel  403: <h2>$lt{'resource'}</h2>
                    404:     <p>$lt{'id_expln'}</p>
                    405: <font color="red">
                    406: <p>$lt{'warning'}</p>
1.91      albertel  407: </font>
1.284     albertel  408: <form name="checkout" method="POST" action="$env{'request.uri'}">
1.91      albertel  409: <input type="hidden" name="doescheckout" value="yes" />
1.211     albertel  410: <input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" />
1.65      albertel  411: </form>
                    412: ENDCHECKOUT
                    413: }
                    414: 
1.252     albertel  415: sub firstaccess_msg {
1.253     albertel  416:     my ($time,$symb)=@_;
                    417:     my ($map)=&Apache::lonnet::decode_symb($symb);
                    418:     my $foldertitle=&Apache::lonnet::gettitle($map);
                    419:     &Apache::lonxml::debug("map is $map title is $foldertitle");
1.252     albertel  420:     return (<<ENDCHECKOUT);
1.253     albertel  421: <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.284     albertel  422: <form name="markaccess" method="POST" action="$env{'request.uri'}">
1.252     albertel  423: <input type="hidden" name="markaccess" value="yes" />
                    424: <input type="button" name="accessbutton" value="Show Resource" onClick="javascript:if (confirm('Start Timer?')) { document.markaccess.submit(); }" />
                    425: </form>
                    426: ENDCHECKOUT
                    427: }
                    428: 
1.204     albertel  429: sub init_problem_globals {
                    430:     my ($type)=@_;
                    431:     #initialize globals
1.308     foxr      432:     #   For problems, we start out in part 0 (outside a <part> tag).
                    433:     #   and part 0 is used to describe the main body of the <problem>
                    434:     #
1.204     albertel  435:     if ($type eq 'problem') {
                    436: 	$Apache::inputtags::part='0';
                    437: 	@Apache::inputtags::partlist=('0');
1.266     albertel  438: 	$Apache::lonhomework::problemstatus=&get_problem_status('0');
                    439: 	$Apache::lonhomework::ignore_response_errors=0;
1.308     foxr      440: 
1.266     albertel  441:     } elsif ($type eq 'library') {
1.204     albertel  442: 	$Apache::inputtags::part='';
                    443: 	@Apache::inputtags::partlist=();
                    444: 	$Apache::lonhomework::problemstatus='';	
1.266     albertel  445: 	$Apache::lonhomework::ignore_response_errors=1;
1.308     foxr      446: 
1.304     albertel  447:     } elsif ($type eq 'Task') {
                    448: 	$Apache::inputtags::part='0';
                    449: 	@Apache::inputtags::partlist=('0');
                    450: 	$Apache::lonhomework::problemstatus='';	
                    451: 	$Apache::lonhomework::ignore_response_errors=1;
1.204     albertel  452:     }
                    453:     @Apache::inputtags::responselist = ();
                    454:     @Apache::inputtags::importlist = ();
                    455:     @Apache::inputtags::previous=();
                    456:     @Apache::inputtags::previous_version=();
                    457:     $Apache::structuretags::printanswer='No';
                    458:     @Apache::structuretags::whileconds=();
                    459:     @Apache::structuretags::whilebody=();
                    460:     @Apache::structuretags::whileline=();
                    461:     $Apache::lonhomework::scantronmode=0;
                    462:     undef($Apache::lonhomework::name);
                    463: 
                    464: }
                    465: 
                    466: sub reset_problem_globals {
                    467:     my ($type)=@_;
                    468:     undef(%Apache::lonhomework::history);
                    469:     undef(%Apache::lonhomework::results);
                    470:     undef($Apache::inputtags::part);
1.208     albertel  471: #don't undef this, lonhomework.pm takes care of this, we use this to 
                    472: #detect if we try to do 2 problems in one file
                    473: #   undef($Apache::lonhomework::parsing_a_problem);
1.204     albertel  474:     undef($Apache::lonhomework::name);
                    475: }
                    476: 
1.241     albertel  477: sub set_problem_state {
1.240     albertel  478:     my ($part)=@_;
1.284     albertel  479:     if ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {
1.240     albertel  480: 	$Apache::lonhomework::history{"resource.$part.solved"}=
                    481: 	    'correct_by_student';
                    482:     }
                    483: }
                    484: 
1.241     albertel  485: sub get_problem_status {
                    486:     my ($part)=@_;
1.267     albertel  487:     my $problem_status;
1.284     albertel  488:     if ($env{'request.state'} eq 'construct' &&
                    489: 	defined($env{'form.problemstatus'})) {
                    490: 	$problem_status=$env{'form.problemstatus'};
1.267     albertel  491:     } else {
                    492: 	$problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");
                    493: 	&Apache::lonxml::debug("problem status for $part is $problem_status");
1.284     albertel  494: 	&Apache::lonxml::debug("env probstat is ".$env{'form.problemstatus'});
1.241     albertel  495:     }
                    496:     return $problem_status;
                    497: }
                    498: 
1.9       albertel  499: sub start_problem {
1.159     albertel  500:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.19      albertel  501: 
1.311     foxr      502:     # We'll use the redirection to fix up printing of duedates.
1.312     albertel  503:     &Apache::lonxml::startredirection();
1.311     foxr      504: 
1.308     foxr      505:     # Problems don't nest and we don't allow more than one <problem> in
                    506:     # a .problem file.
                    507:     #
1.184     albertel  508:     if ( $Apache::inputtags::part ne '' ||
                    509: 	 $Apache::lonhomework::parsing_a_problem) {
                    510: 	&Apache::lonxml::error('Only one &lt;problem&gt; allowed in a .problem file');
                    511: 	#my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
1.159     albertel  512: 	return '';
                    513:     }
1.184     albertel  514: 
                    515:     $Apache::lonhomework::parsing_a_problem=1;
1.204     albertel  516:     &init_problem_globals('problem');
1.166     albertel  517: 
1.284     albertel  518:     if (defined($env{'scantron.maxquest'})) {
1.166     albertel  519: 	$Apache::lonhomework::scantronmode=1;
                    520:     }
1.161     albertel  521: 
1.246     albertel  522:     &initialize_storage();
1.159     albertel  523:     if ($target ne 'analyze') {
                    524: 	if ($target eq 'web') {
                    525: 	    &Apache::lonhomework::showhash(%Apache::lonhomework::history);
1.238     albertel  526: 	}
1.284     albertel  527:        	if ($env{'request.state'} eq 'construct') { &set_problem_state('0'); }
1.159     albertel  528: 	$Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
1.284     albertel  529: 	if (($env{'request.state'} eq 'construct') &&
                    530: 	    defined($env{'form.problemtype'})) {
                    531: 	    $Apache::lonhomework::type=$env{'form.problemtype'};
1.237     albertel  532: 	}
1.240     albertel  533: 	&Apache::lonxml::debug("Found this to be of type :$Apache::ltonhomework::type:");
1.159     albertel  534:     }
1.164     albertel  535:     if ($Apache::lonhomework::type eq '' ) {
1.284     albertel  536: 	my $uri=$env{'request.uri'};
1.159     albertel  537: 	if ($uri=~/\.(\w+)$/) {
                    538: 	    $Apache::lonhomework::type=$1;
                    539: 	    &Apache::lonxml::debug("Using type of $1");
                    540: 	} else {
                    541: 	    $Apache::lonhomework::type='problem';
                    542: 	    &Apache::lonxml::debug("Using default type, problem, :$uri:");
                    543: 	}
1.87      albertel  544:     }
1.301     albertel  545:     $Apache::lonhomework::default_type = $Apache::lonhomework::type;
1.58      www       546: 
1.159     albertel  547:     #added vars to the scripting enviroment
1.213     albertel  548:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.248     albertel  549:     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.24      albertel  550:     &Apache::run::run($expression,$safeeval);
1.159     albertel  551:     my $status;
                    552:     my $accessmsg;
                    553: 
                    554:     #should get back a <html> or the neccesary stuff to start XML/MathML
                    555:     my ($result,$head_tag_start,$body_tag_start,$form_tag_start)=
                    556: 	&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
1.284     albertel  557:     if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
1.159     albertel  558: 
                    559:     if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
                    560:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    561: 	$target eq 'tex') {
                    562: 	#handle exam checkout
                    563: 	if ($Apache::lonhomework::type eq 'exam') {
                    564: 	    my $token=
                    565: 		$Apache::lonhomework::history{"resource.0.outtoken"};
1.284     albertel  566: 	    if (($env{'form.doescheckout'}) && (!$token)) {
1.159     albertel  567: 		$token=&Apache::lonxml::maketoken();
                    568: 		$Apache::lonhomework::history{"resource.0.outtoken"}=
                    569: 		    $token;
                    570: 	    }
                    571: 	    $body_tag_start.=&Apache::lonxml::printtokenheader($target,$token);
1.142     albertel  572: 	}
1.284     albertel  573: 	if ($env{'form.markaccess'}) {
1.252     albertel  574: 	    &Apache::lonnet::set_first_access('map');
                    575: 	}
1.159     albertel  576: 	#handle rand seed in construction space
                    577: 	my $rndseed=&setup_rndseed($safeeval);
1.162     albertel  578: 	my ($symb)=&Apache::lonxml::whichuser();
1.284     albertel  579: 	if ($env{'request.state'} ne "construct" && $symb eq '') {
1.162     albertel  580: 	    $form_tag_start.='<input type="hidden" name="rndseed" value="'.
                    581: 		$rndseed.'" />'.
                    582: 		    '<input type="submit" name="resetdata"
1.211     albertel  583:                              value="'.&mt('New Problem Variation').'" />'.
1.164     albertel  584: 		    '<input type="hidden" name="username"
1.284     albertel  585:                              value="'.$env{'form.username'}.'" />';
                    586: 	    if ($env{'user.adv'}) {
1.267     albertel  587: 		$form_tag_start.=
1.300     albertel  588: 		    ' <label><input type="checkbox" name="showallfoils" ';
1.284     albertel  589: 		if (defined($env{'form.showallfoils'})) {
1.267     albertel  590: 		    $form_tag_start.='checked="on"';
                    591: 		}
1.300     albertel  592: 		$form_tag_start.= ' />'.&mt('&nbsp;Show&nbsp;All&nbsp;Foils').
                    593: 		    '</label>';
1.267     albertel  594: 	    }
                    595: 	    $form_tag_start.='<hr />';
1.162     albertel  596: 	}
1.159     albertel  597: 	($status,$accessmsg) = &Apache::lonhomework::check_access('0');
                    598: 	push (@Apache::inputtags::status,$status);
                    599: 	my $expression='$external::datestatus="'.$status.'";';
                    600: 	$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
                    601: 	&Apache::run::run($expression,$safeeval);
                    602: 	&Apache::lonxml::debug("Got $status");
                    603: 	if (( $status eq 'CLOSED' ) ||
                    604: 	    ( $status eq 'UNCHECKEDOUT') ||
1.252     albertel  605: 	    ( $status eq 'NOT_YET_VIEWED') ||
1.159     albertel  606: 	    ( $status eq 'BANNED') ||
1.216     albertel  607: 	    ( $status eq 'UNAVAILABLE') ||
                    608: 	    ( $status eq 'INVALID_ACCESS')) {
1.159     albertel  609: 	    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
                    610: 	    if ( $target eq "web" ) {
                    611: 		$result.= $head_tag_start.'</head>';
                    612: 		my $msg=$body_tag_start;
                    613: 		if ($status eq 'UNAVAILABLE') {
1.245     albertel  614: 		    $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';
1.253     albertel  615: 		} elsif ($status ne 'NOT_YET_VIEWED') {
1.245     albertel  616: 		    $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';
1.159     albertel  617: 		}
1.216     albertel  618: 		if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
1.159     albertel  619: 		    $msg.='The problem '.$accessmsg;
                    620: 		} elsif ($status eq 'UNCHECKEDOUT') {
                    621: 		    $msg.=&checkout_msg;
1.252     albertel  622: 		} elsif ($status eq 'NOT_YET_VIEWED') {
1.253     albertel  623: 		    $msg.=&firstaccess_msg($accessmsg,$symb);
1.159     albertel  624: 		}
                    625: 		$result.=$msg.'<br />';
                    626: 	    } elsif ($target eq 'tex') {
                    627: 		$result.='\begin{document}\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';
                    628: 		if ($status eq 'UNAVAILABLE') {
1.211     albertel  629: 		    $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
1.159     albertel  630: 		} else {
1.211     albertel  631: 		    $result.=&mt('Problem is not open to be viewed. It')." $accessmsg \\vskip 0 mm ";
1.159     albertel  632: 		}
                    633: 	    }
                    634: 	} elsif ($target eq 'web') {
                    635: 	    my $name= &get_resource_name($parstack,$safeeval);
1.227     albertel  636: 	    $result.="$head_tag_start<title>$name</title></head>
1.158     sakharuk  637:               $body_tag_start \n $form_tag_start".	
1.227     albertel  638: 	      '<input type="hidden" name="submitted" value="yes" />';
                    639: 	    # create a page header and exit
1.284     albertel  640: 	    if ($env{'request.state'} eq "construct") {
                    641: 		$result.= &problem_web_to_edit_header($env{'form.rndseed'});
1.227     albertel  642: 	    }
                    643: 	    # if we are viewing someone else preserve that info
1.284     albertel  644: 	    if (defined $env{'form.grade_symb'}) {
1.227     albertel  645: 		foreach my $field ('symb','courseid','domain','username') {
                    646: 		    $result .= '<input type="hidden" name="grade_'.$field.
1.284     albertel  647: 			'" value="'.$env{"form.grade_$field"}.'" />'."\n";
1.159     albertel  648: 		}
                    649: 	    }
                    650: 	} elsif ($target eq 'tex') {
1.192     sakharuk  651: 	    my $startminipage = '';
1.284     albertel  652: 	    if (not $env{'form.problem_split'}=~/yes/) {
1.192     sakharuk  653: 		$startminipage = '\begin{minipage}{\textwidth}';
1.178     sakharuk  654: 	    }
1.159     albertel  655: 	    my $id = $Apache::inputtags::part;
                    656: 	    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.284     albertel  657: 	    my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1.223     sakharuk  658: 	    my @packages = split /,/,$packages;
                    659: 	    my $allow_print_points = 0;
                    660: 	    foreach my $partial_key (@packages) {
1.230     albertel  661: 		if ($partial_key=~m/^part_0$/) {
1.223     sakharuk  662: 		    $allow_print_points=1;
1.159     albertel  663: 		}
                    664: 	    }
1.276     albertel  665: 	    my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
                    666: 	    if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; }
1.302     albertel  667: 	    if (lc($env{'course.'.$env{'request.course.id'}.
                    668: 			    '.disableexampointprint'}) eq 'yes') {
                    669: 		$allow_print_points=0;
                    670: 	    }
1.308     foxr      671: 	    my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
                    672: 	    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 ';
                    673: 	    my $toc_line='\vskip 1 mm\noindent '.$startminipage.
                    674: 		'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
                    675: 
1.312     albertel  676: 	    #  Figure out what the due date is and if we need to print
                    677: 	    #  it in the problem header.  We have been logging the
                    678: 	    #  last due date written to file. 
1.308     foxr      679: 
                    680: 	    my $duetime = &Apache::lonnet::EXT("resource.$id.duedate"); 
                    681: 	    my $duedate = POSIX::strftime("%c",localtime($duetime));
1.159     albertel  682: 	    my $temp_file;
1.284     albertel  683: 	    my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
1.308     foxr      684: 
1.312     albertel  685: 	    # Figure out what the last printed due date is or set it
                    686: 	    # to the epoch if no duedates have been printed.
1.308     foxr      687: 
                    688: 	    my $due_file_content = 0;      #   If the file does not yet exist, time is the epoch.
1.159     albertel  689: 	    if (-e $filename) {
                    690: 		$temp_file = Apache::File->new($filename);
1.308     foxr      691: 		my @due_file      = <$temp_file>;
                    692: 		$due_file_content = $due_file[$#due_file];
                    693: 		chomp $due_file_content;
                    694: 	    } 
1.312     albertel  695: 
                    696: 	    # comparisons of the absolute times
1.309     foxr      697: 	    if ($due_file_content != $duetime) {
1.159     albertel  698: 		$temp_file = Apache::File->new('>'.$filename);
1.308     foxr      699: 		print $temp_file "$duetime\n";
1.284     albertel  700: 		if (not $env{'request.symb'} =~ m/\.page_/) {
1.159     albertel  701: 		    if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
1.304     albertel  702: 			$result .= $begin_doc.
                    703: 			    '\textit{Due date: '.$duedate.'} '.$toc_line;
1.159     albertel  704: 		    } else {
1.304     albertel  705: 			$result .= $begin_doc.$toc_line;
1.159     albertel  706: 			if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
                    707: 		    }
1.104     sakharuk  708: 		} else {
1.159     albertel  709: 		    $result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';
1.104     sakharuk  710: 		}
1.101     sakharuk  711: 	    } else {
1.284     albertel  712: 		if (not $env{'request.symb'} =~ m/\.page_/) {
1.304     albertel  713: 		    $result .= $begin_doc.$toc_line;
1.159     albertel  714: 		    if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
                    715: 		} else {
                    716: 		    $result .= '\vskip 1mm \\\\\\\\';
                    717: 		}
                    718: 	    }
1.99      sakharuk  719: 	}
1.159     albertel  720:     } elsif ($target eq 'edit') {
                    721: 	$result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
                    722: 	    &problem_edit_header();
1.226     albertel  723: 	$Apache::lonxml::warnings_error_header=
                    724: 	    &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  725: 	my $temp=&Apache::edit::insertlist($target,$token);
                    726: 	$result.=$temp;
                    727:     } elsif ($target eq 'modified') {
                    728: 	$result=$token->[4];
                    729: 	$result.=&Apache::edit::handle_insert();
                    730:     } else {
                    731: 	# page_start returned a starting result, delete it if we don't need it
                    732: 	$result = '';
1.99      sakharuk  733:     }
1.159     albertel  734:     return $result;
1.9       albertel  735: }
                    736: 
                    737: sub end_problem {
1.159     albertel  738:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.312     albertel  739:     my $result= &Apache::lonxml::endredirection(); # started in &start_problem
1.310     foxr      740: 
1.159     albertel  741:     my $status=$Apache::inputtags::status['-1'];
                    742:     if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
                    743: 	$target eq 'tex') {
1.249     albertel  744: 	if ( $target eq 'grade' && $Apache::inputtags::part eq '0') {
1.159     albertel  745: 	    # if part is zero, no <part>s existed, so we need to the grading
1.249     albertel  746: 	    if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) {
                    747: 		&Apache::inputtags::grade;
                    748: 	    } else {
                    749: 		# move any submission data to .hidden
                    750: 		&Apache::inputtags::hidealldata($Apache::inputtags::part);
                    751: 	    }
1.159     albertel  752: 	} elsif ( ($target eq 'web' || $target eq 'tex') &&
                    753: 		  $Apache::inputtags::part eq '0' &&
1.252     albertel  754: 		  $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
1.159     albertel  755: 	    # if part is zero, no <part>s existed, so we need show the current
                    756: 	    # grading status
                    757: 	    my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
                    758: 	    $result.= $gradestatus;
                    759: 	}
                    760: 	if (
1.284     albertel  761: 	    (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
1.159     albertel  762: 	    ($target eq 'answer') || ($target eq 'tex')
                    763: 	   ) {
1.227     albertel  764: 	    if ($target ne 'tex' &&
1.284     albertel  765: 		$env{'form.answer_output_mode'} ne 'tex') {
1.254     www       766: 		$result.="</form>";
                    767: 		$result.=&Apache::lonhtmlcommon::htmlareaselectactive(@Apache::lonxml::htmlareafields);
1.159     albertel  768: 	    }
                    769: 	    if ($target eq 'web') {
1.281     albertel  770: 		$result.=&Apache::lonxml::xmlend().'</html>';
1.159     albertel  771: 	    } elsif ($target eq 'tex') {
1.178     sakharuk  772: 		my $endminipage = '';
1.284     albertel  773: 		if (not $env{'form.problem_split'}=~/yes/) {
1.178     sakharuk  774: 		    $endminipage = '\end{minipage}';
                    775: 		}
1.284     albertel  776:                 if ($env{'form.print_discussions'} eq 'yes') {
1.263     sakharuk  777: 		    $result.=&Apache::lonxml::xmlend($target,$parser);
1.257     sakharuk  778: 		    $result=~s/<\/html>//;
1.159     albertel  779: 		} else {
1.262     sakharuk  780: 		    $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
1.284     albertel  781: 		    if (not $env{'request.symb'} =~ m/\.page_/) {
1.262     sakharuk  782: 			$result .= $endminipage.'\end{document} ';
                    783: 		    } else {
                    784: 			$result .= '';
                    785: 		    }
1.159     albertel  786: 		}
                    787: 	    }
                    788: 	}
                    789: 	if ($target eq 'grade') {
                    790: 	    &Apache::lonhomework::showhash(%Apache::lonhomework::results);
                    791: 	    &finalize_storage();
                    792: 	}
1.284     albertel  793: 	if ($target eq 'answer' && ($env{'request.state'} eq 'construct')
                    794: 	    && $env{'form.answer_output_mode'} ne 'tex') {
1.294     albertel  795: 	    $result.=&Apache::lonxml::xmlend().'</html>';
                    796: 	                        # normally we get it from above, but in CSTR
1.172     albertel  797: 	                        # we always show answer mode too.
1.159     albertel  798: 	}
                    799:     } elsif ($target eq 'meta') {
                    800: 	if ($Apache::inputtags::part eq '0') {
1.179     albertel  801: 	    @Apache::inputtags::response=();
1.159     albertel  802: 	    $result=&Apache::response::mandatory_part_meta;
                    803: 	}
1.215     albertel  804: 	$result.=&Apache::response::meta_part_order();
1.258     albertel  805: 	$result.=&Apache::response::meta_response_order();
1.159     albertel  806:     } elsif ($target eq 'edit') {
                    807: 	&Apache::lonxml::debug("in end_problem with $target, edit");
                    808: 	$result = &problem_edit_footer();
                    809:     }
1.155     albertel  810: 
1.284     albertel  811:     if ($env{'request.state'} eq 'construct' && $target eq 'web') {
1.177     albertel  812: 	&Apache::inputtags::check_for_duplicate_ids();
                    813:     }
1.204     albertel  814: 
                    815:     &reset_problem_globals('problem');
1.159     albertel  816: 
                    817:     return $result;
1.48      albertel  818: }
                    819: 
1.108     albertel  820: 
1.48      albertel  821: sub start_library {
1.159     albertel  822:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    823:     my ($result,$head_tag_start,$body_tag_start,$form_tag_start);
1.244     albertel  824:     if ($$tagstack[0] eq 'library') {
                    825: 	&init_problem_globals('library');
                    826: 	$Apache::lonhomework::type='problem';
                    827:     }
1.159     albertel  828:     if ($target eq 'edit') {
                    829: 	($result,$head_tag_start,$body_tag_start,$form_tag_start)=
                    830: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
                    831: 	$result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
                    832: 	    &problem_edit_header();
                    833: 	my $temp=&Apache::edit::insertlist($target,$token);
                    834: 	$result.=$temp;
                    835:     } elsif ($target eq 'modified') {
                    836: 	$result=$token->[4];
                    837: 	$result.=&Apache::edit::handle_insert();
                    838:     } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
1.284     albertel  839: 	     $env{'request.state'} eq "construct" ) {
1.159     albertel  840: 	($result,$head_tag_start,$body_tag_start,$form_tag_start)=
                    841: 	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
                    842: 	my $name=&get_resource_name($parstack,$safeeval);
                    843: 	my $rndseed=&setup_rndseed($safeeval);
                    844: 	$result.="$head_tag_start<title>$name</title></head>
1.105     albertel  845:               $body_tag_start \n $form_tag_start".	
1.159     albertel  846: 		  '<input type="hidden" name="submitted" value="yes" />';
                    847: 	$result.=&problem_web_to_edit_header($rndseed);
                    848:     }
                    849:     return $result;
1.48      albertel  850: }
                    851: 
                    852: sub end_library {
1.159     albertel  853:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    854:     my $result='';
                    855:     if ($target eq 'edit') {
                    856: 	$result=&problem_edit_footer();
                    857:     } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
1.284     albertel  858: 	     $env{'request.state'} eq "construct") {
1.280     albertel  859: 	$result.='</form>'.&Apache::loncommon::endbodytag().
                    860: 	    &Apache::lonxml::xmlend();
1.159     albertel  861:     }
1.204     albertel  862:     if ($$tagstack[0] eq 'library') { &reset_problem_globals('library') };
1.159     albertel  863:     return $result;
1.197     www       864: }
                    865: 
                    866: sub start_definetag {
                    867:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    868: 
                    869:     my $result;
                    870: 
                    871:     my $name = $token->[2]->{'name'};
                    872:     my $skip=&Apache::lonxml::get_all_text("/definetag",$parser);
                    873:     if ($name=~/^\//) {
                    874: 	$result=
                    875:  '<br /><table bgcolor="#FFBBBB"><tr><th>END <tt>'.$name.'</tt></th></tr>';
                    876:     } else {
                    877: 	$result=
                    878:  '<br /><table bgcolor="#BBFFBB"><tr><th>BEGIN <tt>'.$name.'</tt></th></tr>';
                    879:     }
                    880:     $skip=~s/\</\&lt\;/gs;
                    881:     $skip=~s/\>/\&gt\;/gs;
                    882:     $result.='<tr><td><pre>'.$skip.'</pre></td></tr></table>';
                    883:     return $result;
                    884: }
                    885: 
                    886: sub end_definetag {
                    887:     return '';
1.1       albertel  888: }
                    889: 
                    890: sub start_block {
1.201     albertel  891:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.131     albertel  892: 
                    893:     my $result;
1.1       albertel  894: 
1.160     albertel  895:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.131     albertel  896: 	$target eq 'tex' || $target eq 'analyze') {
1.159     albertel  897: 	my $code = $token->[2]->{'condition'};
1.201     albertel  898: 	if (defined($code)) {
1.137     albertel  899: 	    if (!$Apache::lonxml::default_homework_loaded) {
                    900: 		&Apache::lonxml::default_homework_load($safeeval);
                    901: 	    }
1.131     albertel  902: 	    $result = &Apache::run::run($code,$safeeval);
                    903: 	    &Apache::lonxml::debug("block :$code: returned :$result:");
                    904: 	} else {
                    905: 	    $result='1';
                    906: 	}
                    907: 	if ( ! $result ) {
1.201     albertel  908: 	    my $skip=&Apache::lonxml::get_all_text("/block",$parser,$style);
1.131     albertel  909: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                    910: 	}
                    911: 	$result='';
                    912:     } elsif ($target eq 'edit') {
                    913: 	$result .=&Apache::edit::tag_start($target,$token);
                    914: 	$result .=&Apache::edit::text_arg('Test Condition:','condition',
                    915: 					  $token,40);
                    916: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    917:     } elsif ($target eq 'modified') {
                    918: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                    919: 						     $safeeval,'condition');
                    920: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.38      albertel  921:     }
1.131     albertel  922:     return $result;
1.1       albertel  923: }
                    924: 
                    925: sub end_block {
1.167     www       926:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    927:     my $result;
                    928:     if ($target eq "edit") {
                    929: 	$result.= &Apache::edit::tag_end($target,$token,'');
                    930:     }
                    931:     return $result;
                    932: }
                    933: 
                    934: sub start_languageblock {
1.201     albertel  935:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.167     www       936: 
                    937:     my $result;
                    938: 
                    939:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    940: 	$target eq 'tex' || $target eq 'analyze') {
1.201     albertel  941: 	my $include = $token->[2]->{'include'};
                    942: 	my $exclude = $token->[2]->{'exclude'};
                    943:         my %languages=&Apache::loncommon::display_languages();
                    944:         $result='1';
                    945: 	if ($include) {
                    946:             $result='';
                    947:             foreach (split(/\,/,$include)) {
                    948:                 if ($languages{$_}) { $result='1'; }
                    949:             }
                    950: 	}
                    951:         if ($exclude) {
                    952:             foreach (split(/\,/,$exclude)) {
                    953:                 if ($languages{$_}) { $result='0'; }
                    954:             }
                    955: 	}
                    956: 	if ( ! $result ) {
                    957: 	    my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser,
                    958: 						   $style);
                    959: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                    960: 	}
                    961: 	$result='';
1.167     www       962:     } elsif ($target eq 'edit') {
                    963: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel  964: 	$result .=&Apache::edit::text_arg(&mt('Include Language:'),'include',
1.167     www       965: 					  $token,40);
1.211     albertel  966: 	$result .=&Apache::edit::text_arg(&mt('Exclude Language:'),'exclude',
1.167     www       967: 					  $token,40);
                    968: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                    969:     } elsif ($target eq 'modified') {
                    970: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.168     albertel  971: 						     $safeeval,'include',
                    972: 						     'exclude');
1.167     www       973: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                    974:     }
                    975:     return $result;
                    976: }
                    977: 
                    978: sub end_languageblock {
1.170     www       979:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                    980:     my $result;
1.201     albertel  981:     if ($target eq "edit") {
1.170     www       982: 	$result.= &Apache::edit::tag_end($target,$token,'');
                    983:     }
                    984:     return $result;
                    985: }
                    986: 
                    987: sub start_instructorcomment {
1.201     albertel  988:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
1.170     www       989: 
                    990:     my $result;
                    991: 
                    992:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                    993: 	$target eq 'tex' || $target eq 'analyze') {
1.284     albertel  994:         $result=($env{'request.role'}=~/^(in|cc|au|ca|li)/);
                    995: 	if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) {
1.201     albertel  996: 	    my $skip=&Apache::lonxml::get_all_text("/instructorcomment",
                    997: 						   $parser,$style);
1.170     www       998: 	    &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]");
                    999: 	}
                   1000: 	$result='';
                   1001:     } elsif ($target eq 'edit') {
                   1002: 	$result .=&Apache::edit::tag_start($target,$token);
                   1003: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1004:     }
                   1005:     return $result;
                   1006: }
                   1007: 
                   1008: sub end_instructorcomment {
1.159     albertel 1009:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel 1010:     my $result;
                   1011:     if ($target eq "edit") {
                   1012: 	$result.= &Apache::edit::tag_end($target,$token,'');
                   1013:     }
                   1014:     return $result;
1.4       tsai     1015: }
                   1016: 
                   1017: sub start_while {
1.159     albertel 1018:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1019: 
1.160     albertel 1020:     my $result;
1.161     albertel 1021:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
1.160     albertel 1022: 	$target eq 'tex' || $target eq 'analyze') {
                   1023: 	my $code = $token->[2]->{'condition'};
1.4       tsai     1024: 
1.160     albertel 1025: 	push( @Apache::structuretags::whileconds, $code);
                   1026: 	if (!$Apache::lonxml::default_homework_loaded) {
                   1027: 	    &Apache::lonxml::default_homework_load($safeeval);
                   1028: 	}
                   1029: 	my $result = &Apache::run::run($code,$safeeval);
1.161     albertel 1030: 	my $bodytext=&Apache::lonxml::get_all_text("/while",$parser);
1.160     albertel 1031: 	push( @Apache::structuretags::whilebody, $bodytext);
1.161     albertel 1032: 	push( @Apache::structuretags::whileline, $token->[5]);
                   1033: 	&Apache::lonxml::debug("s code $code got -$result-");
1.160     albertel 1034: 	if ( $result ) {
                   1035: 	    &Apache::lonxml::newparser($parser,\$bodytext);
                   1036: 	}
                   1037:     } elsif ($target eq 'edit') {
                   1038: 	$result .=&Apache::edit::tag_start($target,$token);
1.211     albertel 1039: 	$result .=&Apache::edit::text_arg(&mt('Test Condition:'),'condition',
1.160     albertel 1040: 					  $token,40);
                   1041: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1042:     } elsif ($target eq 'modified') {
                   1043: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1044: 						     $safeeval,'condition');
                   1045: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.159     albertel 1046:     }
1.160     albertel 1047:     return $result;
1.4       tsai     1048: }
                   1049: 
                   1050: sub end_while {
1.159     albertel 1051:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.160     albertel 1052:     my $result;
                   1053: 
                   1054:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1055: 	$target eq 'tex' || $target eq 'analyze') {
                   1056: 	my $code = pop(@Apache::structuretags::whileconds);
                   1057: 	my $bodytext = pop(@Apache::structuretags::whilebody);
1.161     albertel 1058: 	my $line = pop(@Apache::structuretags::whileline);
                   1059: 	my $return = &Apache::run::run($code,$safeeval);
                   1060: 	my $starttime=time;
                   1061: 	my $error=0;
                   1062: 	while ($return) {
                   1063: 	    if (time-$starttime >
                   1064: 		$Apache::lonnet::perlvar{'lonScriptTimeout'}) {
1.270     albertel 1065: 		#$return = 0; $error=1; next;
1.161     albertel 1066: 	    }
                   1067: 	    $result.=&Apache::scripttag::xmlparse($bodytext);
                   1068: 	    $return = &Apache::run::run($code,$safeeval);
                   1069: 	}
                   1070: 	if ($error) {
1.270     albertel 1071: 	    &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 1072: 	}
                   1073:     } elsif ($target eq "edit") {
                   1074: 	$result.= &Apache::edit::tag_end($target,$token,'');
1.159     albertel 1075:     }
1.160     albertel 1076:     return $result;
1.1       albertel 1077: }
1.6       tsai     1078: 
1.160     albertel 1079: # <randomlist show="1">
1.6       tsai     1080: #  <tag1>..</tag1>
                   1081: #  <tag2>..</tag2>
                   1082: #  <tag3>..</tag3>
1.160     albertel 1083: #  ...
1.6       tsai     1084: # </randomlist>
                   1085: sub start_randomlist {
1.159     albertel 1086:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1087:     my $result;
                   1088:     if ($target eq 'answer' || $target eq 'grade' || $target eq 'web' ||
                   1089: 	$target eq 'tex' || $target eq 'analyze') {
                   1090: 	my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
1.305     albertel 1091: 	my $b_parser= HTML::LCParser->new(\$body);
                   1092: 	$b_parser->xml_mode(1);
                   1093: 	$b_parser->marked_sections(1);
1.159     albertel 1094: 	my $b_tok;
                   1095: 	my @randomlist;
                   1096: 	my $list_item;
                   1097: 	while($b_tok = $b_parser->get_token() ) {
                   1098: 	    if($b_tok->[0] eq 'S') { # start tag
                   1099: 		# get content of the tag until matching end tag
                   1100: 		# get all text upto the matching tag
                   1101: 		# and push the content into @randomlist
                   1102: 		$list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],
                   1103: 							   $b_parser);
                   1104: 		$list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
                   1105: 		push(@randomlist,$list_item);
                   1106: 		#  print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4],
                   1107:                 #         $list_item</b>";
                   1108: 	    }
                   1109: 	    if($b_tok->[0] eq 'T') { # text
                   1110: 		# what to do with text in between tags?
                   1111: 		#  print "<b>TEXT $b_tok->[1]</b><br />";
                   1112: 	    }
                   1113: 	    # if($b_tok->[0] eq 'E') { # end tag, should not happen
                   1114: 	    #  print "<b>END-TAG $b_tok->[1]</b><br />";
                   1115: 	    # }
                   1116: 	}
1.303     albertel 1117: 	if (@randomlist) {
                   1118: 	    my @idx_arr = (0 .. $#randomlist);
                   1119: 	    &Apache::structuretags::shuffle(\@idx_arr);
                   1120: 	    my $bodytext = '';
                   1121: 	    my $show=$#randomlist;
                   1122: 	    my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
                   1123: 	    $showarg--;
                   1124: 	    if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
                   1125: 	    for(0 .. $show) {
                   1126: 		$bodytext .= "$randomlist[ $idx_arr[$_] ]";
                   1127: 	    }
                   1128: 	    &Apache::lonxml::newparser($parser,\$bodytext);
1.159     albertel 1129: 	}
                   1130:     } elsif ($target eq 'edit' ) {
                   1131: 	$result .=&Apache::edit::tag_start($target,$token);
                   1132: 	$result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
                   1133: 					   $token,5);
                   1134: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1135:     } elsif ($target eq 'modified' ) {
                   1136: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1137: 						     $safeeval,'show');
                   1138: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   1139:     }
                   1140:     return $result;
1.7       tsai     1141: }
                   1142: 
                   1143: sub shuffle {
                   1144:     my $a=shift;
                   1145:     my $i;
1.303     albertel 1146:     if (ref($a) eq 'ARRAY' && @$a) {
1.251     albertel 1147: 	&Apache::response::pushrandomnumber();
1.159     albertel 1148: 	for($i=@$a;--$i;) {
                   1149: 	    my $j=int(&Math::Random::random_uniform() * ($i+1));
                   1150: 	    next if $i == $j;
                   1151: 	    @$a[$i,$j] = @$a[$j,$i];
                   1152: 	}
1.251     albertel 1153: 	&Apache::response::poprandomnumber();
1.7       tsai     1154:     }
1.6       tsai     1155: }
                   1156: 
                   1157: sub end_randomlist {
1.159     albertel 1158:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1159:     my $result;
                   1160:     if ($target eq 'edit' ) {
                   1161: 	$result=&Apache::edit::tag_end($target,$token,
                   1162: 				       'End Randomly Parsed Block');
                   1163:     }
                   1164:     return $result;
1.6       tsai     1165: }
                   1166: 
1.283     albertel 1167: sub ordered_show_check {
                   1168:     my $last_part=$Apache::inputtags::partlist[-2];
                   1169:     my $in_order=
                   1170: 	&Apache::lonnet::EXT('resource.'.$Apache::inputtags::part.'.ordered');
                   1171:     my $in_order_show=1;
                   1172:     if ($last_part ne '0' && lc($in_order) eq 'yes') {
                   1173: 	$in_order_show=&Apache::response::check_status($last_part);
                   1174:     }
                   1175:     return $in_order_show;
                   1176: }
                   1177: 
1.11      albertel 1178: sub start_part {
1.159     albertel 1179:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.312     albertel 1180:     &Apache::lonxml::startredirection(); # we'll use redirection to fix up 
                   1181:                                          # duedates.
1.159     albertel 1182:     my $result='';
                   1183:     my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
1.296     albertel 1184:     if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; }
1.159     albertel 1185:     $Apache::inputtags::part=$id;
1.177     albertel 1186:     push(@Apache::inputtags::partlist,$id);
                   1187:     @Apache::inputtags::response=();
1.159     albertel 1188:     @Apache::inputtags::previous=();
                   1189:     @Apache::inputtags::previous_version=();
1.241     albertel 1190:     $Apache::lonhomework::problemstatus=&get_problem_status($id);
1.159     albertel 1191:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.259     albertel 1192:     my $newtype=&Apache::lonnet::EXT("resource.$id.type");
                   1193:     if ($newtype) { $Apache::lonhomework::type=$newtype; }
1.283     albertel 1194:     my $in_order_show=&ordered_show_check();
1.214     albertel 1195:     my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
1.259     albertel 1196:     $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
1.209     albertel 1197:     &Apache::run::run($expression,$safeeval);
1.159     albertel 1198: 
                   1199:     if ($target eq 'meta') {
1.224     www      1200: 	my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
                   1201: 	return &Apache::response::mandatory_part_meta.
                   1202: 	       &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
1.159     albertel 1203:     } elsif ($target eq 'web' || $target eq 'grade' ||
                   1204: 	     $target eq 'answer' || $target eq 'tex') {
1.283     albertel 1205: 	if ($hidden || !$in_order_show) {
1.159     albertel 1206: 	    my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
                   1207: 	} else {
                   1208: 	    my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
                   1209: 	    push (@Apache::inputtags::status,$status);
                   1210: 	    my $expression='$external::datestatus="'.$status.'";';
                   1211: 	    $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
                   1212: 	    &Apache::run::run($expression,$safeeval);
1.284     albertel 1213: 	    if ($env{'request.state'} eq 'construct') {
1.241     albertel 1214: 		&set_problem_state($Apache::inputtags::part); 
1.240     albertel 1215: 	    }
1.216     albertel 1216: 	    if (( $status eq 'CLOSED' ) ||
                   1217: 		( $status eq 'UNCHECKEDOUT') ||
1.252     albertel 1218: 		( $status eq 'NOT_YET_VIEWED') ||
1.216     albertel 1219: 		( $status eq 'BANNED') ||
                   1220: 		( $status eq 'UNAVAILABLE') ||
                   1221: 		( $status eq 'INVALID_ACCESS')) {
1.159     albertel 1222: 		my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
                   1223: 		if ( $target eq "web" ) {
1.211     albertel 1224: 		    $result="<br />".&mt('Part is not open to be viewed. It')." $accessmsg<br />";
1.159     albertel 1225: 		} elsif ( $target eq 'tex' ) {
1.284     albertel 1226: 		    if (not $env{'form.problem_split'}=~/yes/) {
1.211     albertel 1227: 			$result="\\end{minipage}\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\\\begin{minipage}{\\textwidth}";
1.195     sakharuk 1228: 		    } else {
1.211     albertel 1229: 			$result="\\vskip 0 mm ".&mt('Part is not open to be viewed. It')." $accessmsg \\\\";
1.195     sakharuk 1230: 		    }
1.159     albertel 1231: 		}
                   1232: 	    } else {
                   1233: 		if ($target eq 'tex') {
1.284     albertel 1234: 		    if (not $env{'form.problem_split'}=~/yes/) {
1.264     sakharuk 1235: 			if ($$tagstack[-2] eq 'td') {
                   1236: 			    $result.='\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
                   1237: 			} else {
                   1238: 			    $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
                   1239: 			}
1.195     sakharuk 1240: 		    }
1.159     albertel 1241: 		    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
1.284     albertel 1242: 		    my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages');
1.222     sakharuk 1243: 		    my @allkeys = split /,/,$allkeys;
                   1244: 		    my $allow_print_points = 0;
                   1245: 		    foreach my $partial_key (@allkeys) {
1.230     albertel 1246: 			if ($partial_key=~m/^part_(.*)$/) {
1.222     sakharuk 1247: 			    if ($1 ne '0') {$allow_print_points=1;}
                   1248: 			}
                   1249: 		    }
1.275     albertel 1250: 		    my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
                   1251: 		    if (defined($maxtries) && $maxtries < 0) {
                   1252: 			$allow_print_points=0;
                   1253: 		    }
1.302     albertel 1254: 		    if (lc($env{'course.'.$env{'request.course.id'}.
                   1255: 				    '.disableexampointprint'}) eq 'yes') {
                   1256: 			$allow_print_points=0;
                   1257: 		    }
1.222     sakharuk 1258: 		    if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
1.233     www      1259: 		} elsif ($target eq 'web') {
                   1260: 		    $result.='<a name="'.&Apache::lonnet::escape($Apache::inputtags::part).'" />';
1.159     albertel 1261: 		}
                   1262: 	    }
                   1263: 	}
                   1264:     } elsif ($target eq 'edit') {
                   1265: 	$result.=&Apache::edit::tag_start($target,$token);
                   1266: 	$result.=&Apache::edit::text_arg('Part ID:','id',$token).
                   1267: 	    &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
1.224     www      1268: 	    '&nbsp;&nbsp;'.
                   1269: &Apache::edit::text_arg('Displayed Part Description:','display',$token).
1.159     albertel 1270: 		&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1271:     } elsif ($target eq 'modified') {
                   1272: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
1.225     albertel 1273: 						     $safeeval,'id','display');
1.159     albertel 1274: 	if ($constructtag) {
1.225     albertel 1275: 	    #limiting ids to only letters numbers, and space
1.224     www      1276: 	    $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
1.159     albertel 1277: 	    $result = &Apache::edit::rebuild_tag($token);
                   1278: 	    $result.=&Apache::edit::handle_insert();
                   1279: 	}
                   1280:     }
                   1281:     return $result;
1.11      albertel 1282: }
                   1283: 
                   1284: sub end_part {
1.159     albertel 1285:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1286:     &Apache::lonxml::debug("in end_part $target ");
                   1287:     my $status=$Apache::inputtags::status['-1'];
                   1288:     my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
1.283     albertel 1289:     my $in_order_show=&ordered_show_check();
1.312     albertel 1290:     my $result= &Apache::lonxml::endredirection(); # started in &start_part
                   1291:     if ($target eq 'grade') {
1.249     albertel 1292: 	if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&
1.283     albertel 1293: 	    !$hidden && $in_order_show) {
1.311     foxr     1294: 	    $result.=&Apache::inputtags::grade;
1.249     albertel 1295: 	} else {
                   1296: 	    # move any submission data to .hidden
                   1297: 	    &Apache::inputtags::hidealldata($Apache::inputtags::part);
                   1298: 	}
1.283     albertel 1299:     } elsif (($target eq 'web' || $target eq 'tex') &&
                   1300: 	     !$hidden && $in_order_show) {
1.159     albertel 1301: 	my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
                   1302: 							$target);
1.212     albertel 1303: 	if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
                   1304: 	    $gradestatus='';
                   1305: 	}
1.311     foxr     1306: 	$result.=$gradestatus;
1.265     sakharuk 1307: 	if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';} 
1.181     albertel 1308:     } elsif ($target eq 'edit') {
1.311     foxr     1309: 	$result.=&Apache::edit::end_table();
1.159     albertel 1310:     }
                   1311:     pop @Apache::inputtags::status;
                   1312:     $Apache::inputtags::part='';
1.295     albertel 1313:     $Apache::lonhomework::type = $Apache::lonhomework::default_type;
1.159     albertel 1314:     return $result;
1.11      albertel 1315: }
1.1       albertel 1316: 
1.25      albertel 1317: sub start_preduedate {
1.159     albertel 1318:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1319:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
1.236     albertel 1320: 	&Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);
1.300     albertel 1321: 	if (!$Apache::lonhomework::scantronmode &&
                   1322: 	    $Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
1.236     albertel 1323: 	    $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
                   1324: 	    &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));
1.159     albertel 1325: 	    &Apache::lonxml::get_all_text("/preduedate",$parser);
                   1326: 	}
1.24      albertel 1327:     }
1.159     albertel 1328:     return '';
1.24      albertel 1329: }
                   1330: 
1.25      albertel 1331: sub end_preduedate {
1.159     albertel 1332:     return '';
1.24      albertel 1333: }
                   1334: 
1.25      albertel 1335: sub start_postanswerdate {
1.159     albertel 1336:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
1.234     albertel 1337:     if ($target eq 'web' || $target eq 'grade') {
1.300     albertel 1338: 	if ($Apache::lonhomework::scantronmode ||
                   1339: 	    $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
1.159     albertel 1340: 	    &Apache::lonxml::get_all_text("/postanswerdate",$parser);
                   1341: 	}
                   1342:     } elsif ($target eq 'tex') {
1.234     albertel 1343: 	&Apache::lonxml::get_all_text("/postanswerdate",$parser);
1.159     albertel 1344:     }
                   1345:     return '';
1.24      albertel 1346: }
                   1347: 
1.25      albertel 1348: sub end_postanswerdate {
1.159     albertel 1349:     return '';
1.24      albertel 1350: }
                   1351: 
1.25      albertel 1352: sub start_notsolved {
1.159     albertel 1353:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1354:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1355: 	$target eq 'tex') {
                   1356: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
                   1357: 	&Apache::lonxml::debug("not solved has :$gradestatus:");
1.239     albertel 1358: 	if ($gradestatus =~ /^correct/ &&
                   1359: 	    &Apache::response::show_answer()) {
1.159     albertel 1360: 	    &Apache::lonxml::debug("skipping");
                   1361: 	    &Apache::lonxml::get_all_text("/notsolved",$parser);
                   1362: 	}
1.24      albertel 1363:     }
1.159     albertel 1364:     return '';
1.24      albertel 1365: }
                   1366: 
1.25      albertel 1367: sub end_notsolved {
1.159     albertel 1368:     return '';
1.24      albertel 1369: }
                   1370: 
                   1371: sub start_solved {
1.159     albertel 1372:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1373:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1374: 	$target eq 'tex') {
                   1375: 	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
1.239     albertel 1376: 	if ($gradestatus !~ /^correct/ ||
                   1377: 	    !&Apache::response::show_answer()) {
1.159     albertel 1378: 	    &Apache::lonxml::get_all_text("/solved",$parser);
                   1379: 	}
1.24      albertel 1380:     }
1.159     albertel 1381:     return '';
1.24      albertel 1382: }
                   1383: 
                   1384: sub end_solved {
1.248     albertel 1385:     return '';
                   1386: }
                   1387: 
                   1388: sub start_problemtype {
                   1389:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1390:     my $result;
                   1391:     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
                   1392: 	$target eq 'tex' || $target eq 'analyze') {
                   1393: 	my $mode=lc(&Apache::lonxml::get_param('mode',$parstack,$safeeval));
                   1394: 	if (!defined($mode)) { $mode='show'; }
                   1395: 	my $for=&Apache::lonxml::get_param('for',$parstack,$safeeval);
                   1396: 	my $found=0;
                   1397: 	foreach my $type (split(',',$for)) {
                   1398: 	    if ($Apache::lonhomework::type eq lc($type)) { $found=1; }
                   1399: 	}
                   1400: 	if ($mode eq 'show' && !$found) {
                   1401: 	    &Apache::lonxml::get_all_text("/problemtype",$parser);
                   1402: 	}
                   1403: 	if ($mode eq 'hide' && $found) {
                   1404: 	    &Apache::lonxml::get_all_text("/problemtype",$parser);
                   1405: 	}
                   1406:     } elsif ($target eq 'edit') {
                   1407: 	$result .=&Apache::edit::tag_start($target,$token);
                   1408: 	$result.=&Apache::edit::select_arg('Mode:','mode',
                   1409: 					   [['show','Show'],
                   1410: 					    ['hide','Hide']]
                   1411: 					   ,$token);
                   1412: 	$result .=&Apache::edit::checked_arg('When used as type(s):','for',
                   1413: 					     [ ['exam','Exam/Quiz Problem'],
                   1414: 					       ['survey','Survey'],
                   1415: 					       ['problem','Homework Problem'] ]
                   1416: 					     ,$token);
                   1417: 	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
                   1418:     } elsif ($target eq 'modified') {
                   1419: 	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
                   1420: 						     $safeeval,'mode','for');
                   1421: 	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
                   1422:     }
                   1423:     return $result;
                   1424: }
                   1425: 
                   1426: sub end_problemtype {
1.159     albertel 1427:     return '';
1.24      albertel 1428: }
1.34      albertel 1429: 
                   1430: sub start_startouttext {
1.159     albertel 1431:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1432:     my @result=(''.'');
                   1433:     if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
                   1434:     return (@result);
1.34      albertel 1435: }
1.159     albertel 1436: 
1.34      albertel 1437: sub end_startouttext {
1.159     albertel 1438:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1439:     my $result='';
                   1440:     my $text='';
                   1441: 
                   1442:     if ($target eq 'edit') {
                   1443: 	$text=&Apache::lonxml::get_all_text("endouttext",$parser);
1.211     albertel 1444: 	$result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>
                   1445: <td>".&mt('Delete:').
1.159     albertel 1446:                  &Apache::edit::deletelist($target,$token)
                   1447: 		 ."</td>
1.42      albertel 1448: <td>".
1.159     albertel 1449:                  &Apache::edit::insertlist($target,$token).
                   1450: 		 &Apache::edit::end_row().
                   1451:                  &Apache::edit::start_spanning_row()."\n"
1.188     bowersj2 1452: 		 . &Apache::loncommon::helpLatexCheatsheet () .
1.255     www      1453: 		 &Apache::edit::editfield($token->[1],$text,"",80,8,1);
1.159     albertel 1454:     }
                   1455:     if ($target eq 'modified') {
1.219     albertel 1456: 	$result='<startouttext />'.&Apache::edit::modifiedfield("endouttext",$parser);
1.159     albertel 1457:     }
                   1458:     if ($target eq 'tex') {
                   1459: 	$result .= '\noindent ';
                   1460:     }
                   1461:     return $result;
1.34      albertel 1462: }
1.159     albertel 1463: 
1.34      albertel 1464: sub start_endouttext {
1.159     albertel 1465:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1466:     my $result='';
                   1467:     if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
                   1468:     if ($target eq "modified") {
                   1469: 	$result='<endouttext />'.
                   1470: 	    &Apache::edit::handle_insertafter('startouttext'); }
                   1471:     return $result;
1.34      albertel 1472: }
1.159     albertel 1473: 
1.34      albertel 1474: sub end_endouttext {
1.159     albertel 1475:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1476:     my @result=('','');
                   1477:     if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
                   1478:     return (@result);
1.34      albertel 1479: }
1.159     albertel 1480: 
1.45      albertel 1481: sub delete_startouttext {
1.159     albertel 1482:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1483:     #  my $text=&Apache::lonxml::get_all_text("endouttext",$parser);
                   1484:     my $text=$$parser['-1']->get_text("/endouttext");
                   1485:     my $ntoken=$$parser['-1']->get_token();
                   1486:     &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
                   1487:     &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
                   1488:     # Deleting 2 parallel tag pairs, but we need the numbers later to look like
                   1489:     # they did the last time round
                   1490:     &Apache::lonxml::increasedepth($ntoken);
                   1491:     &Apache::lonxml::decreasedepth($ntoken);
                   1492:     return 1;
1.193     www      1493: }
                   1494: 
                   1495: sub start_simpleeditbutton {
                   1496:     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
                   1497:     my $result='';
1.284     albertel 1498:     if (($env{'form.simple_edit_button'} ne 'off') &&
1.273     albertel 1499: 	($target eq 'web') &&
1.284     albertel 1500:         (&Apache::lonnet::allowed('srm',$env{'request.course.id'}))) {
                   1501:         my $url=$env{'request.noversionuri'};
1.193     www      1502:         $url=~s/\?.*$//;
1.278     albertel 1503: 	my ($symb) = &Apache::lonxml::whichuser();
1.194     www      1504: 	$result='<table width="100%" bgcolor="#FFFFAA" border="2"><tr><td>'.
1.278     albertel 1505:                 '<a href="'.$url.'/smpedit?symb='.&Apache::lonnet::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      1506: &Apache::loncommon::help_open_topic('Caching').'</td></tr></table><br />';
1.193     www      1507:     }
                   1508:     return $result;
                   1509: }
                   1510: 
                   1511: sub end_simpleeditbutton {
                   1512:     return '';
1.45      albertel 1513: }
1.34      albertel 1514: 
1.1       albertel 1515: 1;
                   1516: __END__

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