--- loncom/homework/structuretags.pm 2005/11/08 21:09:08 1.318 +++ loncom/homework/structuretags.pm 2009/07/06 17:48:30 1.455 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.318 2005/11/08 21:09:08 albertel Exp $ +# $Id: structuretags.pm,v 1.455 2009/07/06 17:48:30 droeschl Exp $ # # Copyright Michigan State University Board of Trustees # @@ -27,6 +27,29 @@ # ### +=pod + +=head1 NAME + +Apache::structuretags + +=head1 SYNOPSIS + + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + + +=head1 NOTABLE SUBROUTINES + +=over + +=item + +=back + +=cut + package Apache::structuretags; @@ -36,16 +59,31 @@ use Apache::File(); use Apache::lonmenu; use Apache::lonlocal; use Apache::lonxml; +use Apache::londefdef; +use Apache::lonenc(); use Time::HiRes qw( gettimeofday tv_interval ); +use lib '/home/httpd/lib/perl/'; +use LONCAPA; + BEGIN { - &Apache::lonxml::register('Apache::structuretags',('block','languageblock','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag')); + &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag')); } sub start_web { - my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; - my $bodytext=&Apache::lonxml::get_all_text("/web",$parser); - if ($target eq 'web') { - return $bodytext; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + if ($target ne 'edit' && $target ne 'modified') { + my $bodytext=&Apache::lonxml::get_all_text("/web",$parser,$style); + if ($target eq 'web' || $target eq 'webgrade') { + return $bodytext; + } + } elsif ($target eq "edit" ) { + my $bodytext = + &Apache::lonxml::get_all_text_unbalanced("/web",$parser); + my $result = &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1); + return $result; + } elsif ( $target eq "modified" ) { + return $token->[4].&Apache::edit::modifiedfield("/web",$parser); } return ''; } @@ -55,11 +93,28 @@ sub end_web { } sub start_tex { - my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser); - if ($target eq 'tex') { - return $bodytext.' '; + if ($target ne 'edit' && $target ne 'modified') { + my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser,$style); + if ($target eq 'tex') { + + # If inside a table, occurrences of \\ must be removed; + # else the table blows up. + + if (&Apache::londefdef::is_inside_of($tagstack, "table")) { + $bodytext =~ s/\\\\//g; + } + return $bodytext.'{}'; + } + } elsif ($target eq "edit" ) { + my $bodytext = + &Apache::lonxml::get_all_text_unbalanced("/tex",$parser); + my $result = &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1); + return $result; + } elsif ( $target eq "modified" ) { + return $token->[4].&Apache::edit::modifiedfield("/tex",$parser); } return $result;; } @@ -68,35 +123,47 @@ sub end_tex { return ''; } -sub body_tag_start { - my ($target,$background,$bgcolor)=@_; - my $body_tag_start=' +function setSubmittedPart (part) { + this.document.lonhomework.submitted.value="part_"+part; +} + +function image_response_click (which, e) { + init_geometry(); + if (!e) { e = window.event; } //IE + var input_element = document.lonhomework.elements[which]; + var token_element = document.lonhomework.elements[which+'_token']; + var token = token_element.value; + var img_element = document.getElementById(which+'_imageresponse'); + var x= e.clientX-getX(img_element)+Geometry.getHorizontalScroll(); + var y= e.clientY-getY(img_element)+Geometry.getVerticalScroll(); + var click = x+':'+y; + input_element.value = click; + img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click; +} + + +JS +} + +sub setmode_javascript { + return <<"ENDSCRIPT"; + +ENDSCRIPT } sub page_start { - my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name, + $extra_head)=@_; my %found; foreach my $taginside (@$tagstack) { foreach my $taglookedfor ('html','body','form') { @@ -104,83 +171,161 @@ sub page_start { } } - my $result; - my $head_tag_start; - if (!defined($found{'html'})) { - $result=&Apache::londefdef::start_html($target,$token,$tagstack, - $parstack,$parser,$safeeval); - $head_tag_start=''.&Apache::lonmenu::registerurl(undef,$target). - &Apache::lonhtmlcommon::htmlareaheaders(). - &Apache::lonhtmlcommon::spellheader(). - &Apache::lonxml::fontsettings(); - } - my $body_tag_start; - if (!defined($found{'body'}) && $env{'request.state'} eq 'construct') { - if ($env{'environment.remote'} eq 'off') { - if ($target eq 'web' || $target eq 'edit') { - $body_tag_start=&Apache::loncommon::bodytag(); - $body_tag_start.=&Apache::lonxml::message_location(); - } - } else { - if ($target eq 'web' || $target eq 'edit') { - $body_tag_start=&Apache::loncommon::bodytag(undef,undef,undef,1); - $body_tag_start.=&Apache::lonxml::message_location(); - } + if ($target eq 'tex') { + return + &Apache::londefdef::start_html($target,$token,$tagstack, + $parstack,$parser,$safeeval); + } + + $extra_head .= &homework_js(); + + if ($env{'environment.wysiwygeditor'} eq 'on') { + $extra_head .= &Apache::lonhtmlcommon::dragmath_js("FCKEditMathPopup"); + } else { + $extra_head .= &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); + } + + my %body_args; + if (defined($found{'html'})) { + $body_args{'skip_phases'}{'head'}=1; + } else { + + $extra_head .= &Apache::lonhtmlcommon::spellheader(); + + $extra_head .= &Apache::londefdef::generate_css_links(); + + if ($env{'request.state'} eq 'construct') { + $extra_head.=&Apache::edit::js_change_detection(). + "\n"; + } + } + + my $pageheader = ''; + if (defined($found{'body'})) { + $body_args{'skip_phases'}{'body'}=1; + } elsif (!defined($found{'body'}) + && $env{'request.state'} eq 'construct') { + if ($target eq 'web' || $target eq 'edit') { + if ($env{'environment.remote'} ne 'off') { + $body_args{'only_body'} = 1; + } + # Breadcrumbs for Construction Space + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Construction Space', + 'href' => &Apache::loncommon::authorspace(), + }); +# FIXME Where are we? +# &Apache::lonhtmlcommon::add_breadcrumb({ +# 'text' => 'Problem Editing', # 'Problem Testing' +# 'href' => '', +# }); + $pageheader = &Apache::lonhtmlcommon::breadcrumbs() + .&Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader()); } } elsif (!defined($found{'body'})) { + my %add_entries; my $background=&Apache::lonxml::get_param('background',$parstack, $safeeval); + if ($background ne '' ) { + $add_entries{'background'} = $background; + } + my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack, $safeeval); - $body_tag_start=&body_tag_start($target,$background,$bgcolor); - if ( ($target eq 'web' || $target eq 'webgrade') - && $env{'request.state'} ne 'construct') { - my ($symb,undef,undef,undef,$publicuser)= - &Apache::lonxml::whichuser(); - if ($symb eq '' && !$publicuser) { - my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference"); - $help=&mt("Browsing resource, all submissions are temporary.")."
"; - $body_tag_start.=$help; - } + if ($bgcolor eq '' ) { $bgcolor = '#FFFFFF'; } + + $body_args{'bgcolor'} = $bgcolor; + # $body_args{'no_title'} = 1; + $body_args{'force_register'} = 1; + $body_args{'add_entries'} = \%add_entries; + if ($env{'environment.remote'} eq 'off' + && $env{'request.state'} eq 'construct') { + $body_args{'only_body'} = 1; + } + } + $body_args{'no_auto_mt_title'} = 1; + my $page_start = &Apache::loncommon::start_page($name,$extra_head, + \%body_args); + $page_start .= $pageheader; + if (!defined($found{'body'}) + && $env{'request.state'} ne 'construct' + && ($target eq 'web' || $target eq 'webgrade')) { + + my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser(); + if ($symb eq '' && !$publicuser) { + my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference"); + $help="

".&mt("Browsing resource, all submissions + are temporary.")."

"; + $page_start .= $help; } - $body_tag_start.=&Apache::lonxml::message_location(); } + + if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') { + $page_start .= &Apache::lonxml::message_location(); + } + my $form_tag_start; if (!defined($found{'form'})) { - $form_tag_start='
'; + $form_tag_start=''."\n"; + } } - return ($result,$head_tag_start,$body_tag_start,$form_tag_start); + return ($page_start,$form_tag_start); } #use Time::HiRes(); sub get_resource_name { my ($parstack,$safeeval)=@_; + my $name; if (defined($Apache::lonhomework::name)) { - return $Apache::lonhomework::name; - } - my ($symb)=&Apache::lonxml::whichuser(); - my $name=&Apache::lonnet::gettitle($symb); - if ($name eq '') { - $name=&Apache::lonnet::EXT('resource.title'); - if ($name eq 'con_lost') { $name = ''; } - } - if ($name!~/\S+/) { - $name=$env{'request.uri'}; - $name=~s-.*/([^/]+)$-$1-; + $name = $Apache::lonhomework::name; + } else { + my ($symb)=&Apache::lonnet::whichuser(); + $name=&Apache::lonnet::gettitle($symb); + if ($name eq '') { + $name=&Apache::lonnet::EXT('resource.title'); + if ($name eq 'con_lost') { $name = ''; } + } + if ($name!~/\S+/) { + $name=$env{'request.uri'}; + $name=~s-.*/([^/]+)$-$1-; + } + # The name has had html tags escaped: + + $name=~s/<//gs; + + $Apache::lonhomework::name=$name; } - $Apache::lonhomework::name=$name; return $name; } sub setup_rndseed { my ($safeeval)=@_; my $rndseed; - my ($symb)=&Apache::lonxml::whichuser(); - if ($env{'request.state'} eq "construct" || $symb eq '' || - $Apache::lonhomework::history{'resource.CODE'}) { + my ($symb)=&Apache::lonnet::whichuser(); + if ($env{'request.state'} eq "construct" + || $symb eq '' + || $Apache::lonhomework::type eq 'practice' + || $Apache::lonhomework::history{'resource.CODE'}) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['rndseed']); $rndseed=$env{'form.rndseed'}; @@ -191,7 +336,8 @@ sub setup_rndseed { } $env{'form.rndseed'}=$rndseed; } - if ($env{'form.resetdata'} eq &mt('New Problem Variation') || + if ( ($env{'form.resetdata'} eq &mt('New Problem Variation') + && $env{'form.submitted'} eq 'yes') || $env{'form.newrandomization'} eq &mt('New Randomization')) { srand(time); $rndseed=int(rand(2100000000)); @@ -220,25 +366,46 @@ sub remember_problem_state { '; } +sub problem_edit_buttons { + return ' +
+ + + +
+
+ + +
'; +} + sub problem_edit_header { - return ''. + return ''. &Apache::structuretags::remember_problem_state().' - - - -
- -
'. - &Apache::loncommon::help_open_menu('','Problem Editing Help','Problem_Editor_XML_Index','',5,'Authoring',undef,undef,undef,'Problem Editing Help') - .'
'. +
+
+'.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' +
'. +&problem_edit_buttons().' +
+'.&Apache::lonxml::message_location().' +
+'. '
'; } sub problem_edit_footer { - return '

- '. - &Apache::lonhtmlcommon::htmlareaselectactive(@Apache::lonxml::htmlareafields). - "\n
\n".&Apache::loncommon::endbodytag()."\n"; + return '
+ +'. + + &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields()). + "\n\n".&Apache::loncommon::end_page(); } sub option { @@ -253,31 +420,40 @@ sub option { sub problem_web_to_edit_header { my ($rndseed)=@_; - my $result.=''; + my $result .= '
'; + if (!$Apache::lonhomework::parsing_a_task) { - $result .= ''; + $result .= + '
'. + &mt('Problem Testing'). + &Apache::loncommon::help_open_topic('Problem_Editor_Testing_Area'). + '
'; + } else { + $result .= + '
'. + &mt('Task Testing'). + '
'; } - $result .= ' - - - - -
'; + + + $result .= '
'; if (!$Apache::lonhomework::parsing_a_task) { $result.=" - -Problem Status: +
+ +".&mt("Problem Status:")." - - -Problem Type: + + +".&mt("Problem Type:")." - - -Feedback Mode: + +$show_all +
+
+ +".&mt("Feedback Mode:")." - - -
"; + +"; + + } elsif ($Apache::lonhomework::parsing_a_task) { + $result.=" +
+ +".&mt("Problem Status:")." + + +$show_all +"; + } + $result.=' + + '.&mt('Apply style file: ').' + &').'" /> + '.&mt('Select').' + +
+
'. + &Apache::lonxml::renderingoptions().' +
+ + + +
+
+
+ + + '; + + if (!$Apache::lonhomework::parsing_a_task) { my $numtoanalyze=$env{'form.numtoanalyze'}; if (!$numtoanalyze) { $numtoanalyze=20; } - $result.= ' for - '.&mt('versions of this problem'). - '.'.&Apache::loncommon::help_open_topic("Analyze_Problem", - '',undef,undef,300). - '
'; - } + $result .= ''. + &mt('[_1] for [_2] versions.', + '' + ,''). + &Apache::loncommon::help_open_topic("Analyze_Problem",'',undef,undef,300). + ''; + + } + + $result.=' +
+
+
'; + $result.=''; + $result .= ''; + $result .= ''; + $result.=' +
+
+ '.&Apache::lonxml::message_location().' +
'; return $result; } sub initialize_storage { - %Apache::lonhomework::results=(); - %Apache::lonhomework::history=(); - my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); - if ($env{'request.state'} eq 'construct' || $symb eq '') { + my ($given_symb) = @_; + undef(%Apache::lonhomework::results); + undef(%Apache::lonhomework::history); + my ($symb,$courseid,$domain,$name) = + &Apache::lonnet::whichuser($given_symb); + + # anonymous users (CODEd exams) have no data + if ($name eq 'anonymous' + && !defined($domain)) { + return; + } + + if ($env{'request.state'} eq 'construct' + || $symb eq '' + || $Apache::lonhomework::type eq 'practice') { + + my $namespace = $symb || $env{'request.uri'}; + if ($env{'form.resetdata'} eq &mt('Reset Submissions') || + ($env{'form.resetdata'} eq &mt('New Problem Variation') + && $env{'form.submitted'} eq 'yes') || + $env{'form.newrandomization'} eq &mt('New Randomization')) { + &Apache::lonnet::tmpreset($namespace,'',$domain,$name); + &Apache::lonxml::debug("Attempt reset"); + } %Apache::lonhomework::history= - &Apache::lonnet::tmprestore($env{'request.uri'},'',$domain,$name); + &Apache::lonnet::tmprestore($namespace,'',$domain,$name); my ($temp)=keys %Apache::lonhomework::history ; &Apache::lonxml::debug("Return message of $temp"); } else { %Apache::lonhomework::history= &Apache::lonnet::restore($symb,$courseid,$domain,$name); } + #ignore error conditions my ($temp)=keys %Apache::lonhomework::history ; if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); } } -# -------------------------------------------------------------finalize_storage -# Stores away the result has to a student's environment -# checks form.grade_ for specific values, other wises stores -# to the running users environment -# Will increment totals for attempts, students, and corrects -# if running user has student role. +=pod + +=item finalize_storage() + + Stores away the result has to a student's environment + checks form.grade_ for specific values, other wises stores + to the running users environment + Will increment totals for attempts, students, and corrects + if running user has student role. + +=cut + + sub finalize_storage { + my ($given_symb) = @_; my $result; if (%Apache::lonhomework::results) { - my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); - if ($env{'request.state'} eq 'construct' || $symb eq '') { + my @remove = grep(/^INTERNAL_/,keys(%Apache::lonhomework::results)); + delete(@Apache::lonhomework::results{@remove}); + my ($symb,$courseid,$domain,$name) = + &Apache::lonnet::whichuser($given_symb); + if ($env{'request.state'} eq 'construct' + || $symb eq '' + || $Apache::lonhomework::type eq 'practice') { + my $namespace = $symb || $env{'request.uri'}; $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'}; $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results, - $env{'request.uri'},'',$domain,$name); + $namespace,'',$domain,$name); &Apache::lonxml::debug('Construct Store return message:'.$result); } else { $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results, @@ -360,15 +632,22 @@ sub finalize_storage { &store_aggregates($symb,$courseid); } } + } else { + &Apache::lonxml::debug('Nothing to store'); } return $result; } -use Data::Dumper; -# -------------------------------------------------------------store_aggregates -# Sends hash of values to be incremented in nohist_resourcetracker.db -# for the course. Increments total number of attempts, unique students -# and corrects for each part for an instance of a problem, as appropriate. +=pod + +item store_aggregates() + + Sends hash of values to be incremented in nohist_resourcetracker.db + for the course. Increments total number of attempts, unique students + and corrects for each part for an instance of a problem, as appropriate. + +=cut + sub store_aggregates { my ($symb,$courseid) = @_; my %aggregate; @@ -412,13 +691,12 @@ sub checkout_msg { 'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.', 'checkout'=>'Check out Exam for Viewing', 'checkout?'=>'Check out Exam?'); + my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); return (<$lt{'resource'}

$lt{'id_expln'}

- -

$lt{'warning'}

-
-
+

$lt{'warning'}

+
@@ -427,16 +705,37 @@ ENDCHECKOUT sub firstaccess_msg { my ($time,$symb)=@_; - my ($map)=&Apache::lonnet::decode_symb($symb); - my $foldertitle=&Apache::lonnet::gettitle($map); - &Apache::lonxml::debug("map is $map title is $foldertitle"); - return (<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". -
+ my $result; + my @interval=&Apache::lonnet::EXT("resource.0.interval"); + if ($interval[1] eq 'map') { + my ($map)=&Apache::lonnet::decode_symb($symb); + my $foldertitle=&Apache::lonnet::gettitle($map); + + &Apache::lonxml::debug("map is $map title is $foldertitle"); + $result .= "

".&mt('The resources in "[_1]" are open for a limited time.' + .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' + ,$foldertitle,$time)."

"; + } elsif ($interval[1] eq 'course') { + my $course = $env{'course.'.$env{'request.course.id'}.'.description'}; + $result .= "

".&mt('The resources in "[_1]" are open for a limited time.' + .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' + ,$course,$time)."

"; + } else { + my $title=&Apache::lonnet::gettitle($symb); + $result .= "

".&mt('This resource "[_1]" is open for a limited time.' + .' Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".' + ,$title,$time)."

"; + } + my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); + my $buttontext = &mt('Show Resource'); + my $timertext = &mt('Start Timer?'); + $result .= (< - + ENDCHECKOUT + return $result; } sub init_problem_globals { @@ -448,19 +747,19 @@ sub init_problem_globals { if ($type eq 'problem') { $Apache::inputtags::part='0'; @Apache::inputtags::partlist=('0'); - $Apache::lonhomework::problemstatus=&get_problem_status('0'); + &Apache::lonhomework::set_show_problem_status(&get_problem_status('0')); $Apache::lonhomework::ignore_response_errors=0; } elsif ($type eq 'library') { $Apache::inputtags::part=''; @Apache::inputtags::partlist=(); - $Apache::lonhomework::problemstatus=''; + &Apache::lonhomework::reset_show_problem_status(); $Apache::lonhomework::ignore_response_errors=1; } elsif ($type eq 'Task') { $Apache::inputtags::part='0'; @Apache::inputtags::partlist=('0'); - $Apache::lonhomework::problemstatus=''; + &Apache::lonhomework::reset_show_problem_status(); $Apache::lonhomework::ignore_response_errors=1; } @Apache::inputtags::responselist = (); @@ -473,7 +772,8 @@ sub init_problem_globals { @Apache::structuretags::whileline=(); $Apache::lonhomework::scantronmode=0; undef($Apache::lonhomework::name); - + undef($Apache::lonhomework::default_type); + undef($Apache::lonhomework::type); } sub reset_problem_globals { @@ -485,6 +785,11 @@ sub reset_problem_globals { #detect if we try to do 2 problems in one file # undef($Apache::lonhomework::parsing_a_problem); undef($Apache::lonhomework::name); + undef($Apache::lonhomework::default_type); + undef($Apache::lonhomework::type); + undef($Apache::lonhomework::scantronmode); + undef($Apache::lonhomework::ignore_response_errors); + &Apache::lonhomework::reset_show_problem_status(); } sub set_problem_state { @@ -510,10 +815,12 @@ sub get_problem_status { } sub start_problem { - my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; # We'll use the redirection to fix up printing of duedates. - &Apache::lonxml::startredirection(); + if (!$Apache::lonxml::metamode) { + &Apache::lonxml::startredirection(); + } # Problems don't nest and we don't allow more than one in # a .problem file. @@ -521,7 +828,7 @@ sub start_problem { if ( $Apache::inputtags::part ne '' || $Apache::lonhomework::parsing_a_problem) { &Apache::lonxml::error('Only one <problem> allowed in a .problem file'); - #my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser); + #my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,$style); return ''; } @@ -532,18 +839,14 @@ sub start_problem { $Apache::lonhomework::scantronmode=1; } - &initialize_storage(); if ($target ne 'analyze') { - if ($target eq 'web') { - &Apache::lonhomework::showhash(%Apache::lonhomework::history); - } - if ($env{'request.state'} eq 'construct') { &set_problem_state('0'); } - $Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type'); + my $type = &Apache::lonnet::EXT('resource.0.type'); + $Apache::lonhomework::type=$type; if (($env{'request.state'} eq 'construct') && - defined($env{'form.problemtype'})) { + $env{'form.problemtype'} =~ /\S/) { $Apache::lonhomework::type=$env{'form.problemtype'}; } - &Apache::lonxml::debug("Found this to be of type :$Apache::ltonhomework::type:"); + &Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:"); } if ($Apache::lonhomework::type eq '' ) { my $uri=$env{'request.uri'}; @@ -557,6 +860,17 @@ sub start_problem { } $Apache::lonhomework::default_type = $Apache::lonhomework::type; + &initialize_storage(); + if ($target ne 'analyze' + && $env{'request.state'} eq 'construct') { + &set_problem_state('0'); + } + + if ($target eq 'web') { + &Apache::lonxml::debug(" grading history "); + &Apache::lonhomework::showhash(%Apache::lonhomework::history); + } + #added vars to the scripting enviroment my $expression='$external::part=\''.$Apache::inputtags::part.'\';'; $expression.='$external::type=\''.$Apache::lonhomework::type.'\';'; @@ -564,9 +878,15 @@ sub start_problem { my $status; my $accessmsg; - #should get back a or the neccesary stuff to start XML/MathML - my ($result,$head_tag_start,$body_tag_start,$form_tag_start)= - &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval); + my $name= &get_resource_name($parstack,$safeeval); + my ($result,$form_tag_start); + if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex' + || $target eq 'edit') { + ($result,$form_tag_start) = + &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, + $name); + } + if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';} if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); } @@ -581,77 +901,117 @@ sub start_problem { $Apache::lonhomework::history{"resource.0.outtoken"}= $token; } - $body_tag_start.=&Apache::lonxml::printtokenheader($target,$token); + $result.=&Apache::lonxml::printtokenheader($target,$token); } if ($env{'form.markaccess'}) { - &Apache::lonnet::set_first_access('map'); + my @interval=&Apache::lonnet::EXT("resource.0.interval"); + &Apache::lonnet::set_first_access($interval[1]); } #handle rand seed in construction space my $rndseed=&setup_rndseed($safeeval); - my ($symb)=&Apache::lonxml::whichuser(); - if ($env{'request.state'} ne "construct" && $symb eq '') { + my ($symb)=&Apache::lonnet::whichuser(); + if ($env{'request.state'} ne "construct" && + ($symb eq '' || $Apache::lonhomework::type eq 'practice')) { $form_tag_start.=''. ''. + value="'.&mt('New Problem Variation').'" />'; + if (exists($env{'form.username'})) { + $form_tag_start.= ''; - if ($env{'user.adv'}) { + } + if ($env{'request.role.adv'}) { $form_tag_start.= - '