[LON-CAPA-cvs] cvs: loncom /homework structuretags.pm

albertel lon-capa-cvs@mail.lon-capa.org
Thu, 03 Apr 2003 14:31:59 -0000


This is a MIME encoded message

--albertel1049380319
Content-Type: text/plain

albertel		Thu Apr  3 09:31:59 2003 EDT

  Modified files:              
    /loncom/homework	structuretags.pm 
  Log:
  - retabinate
  
  
  
--albertel1049380319
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20030403093159.txt"

Index: loncom/homework/structuretags.pm
diff -u loncom/homework/structuretags.pm:1.158 loncom/homework/structuretags.pm:1.159
--- loncom/homework/structuretags.pm:1.158	Wed Apr  2 15:52:25 2003
+++ loncom/homework/structuretags.pm	Thu Apr  3 09:31:58 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA 
 # definition of tags that give a structure to a document
 #
-# $Id: structuretags.pm,v 1.158 2003/04/02 20:52:25 sakharuk Exp $
+# $Id: structuretags.pm,v 1.159 2003/04/03 14:31:58 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -38,17 +38,16 @@
 use Apache::lonmenu;
 
 BEGIN {
-  &Apache::lonxml::register('Apache::structuretags',('block','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','startouttext','endouttext'));
-#  &Apache::lonxml::register_insert('problem','',('part','postanswerdate','preduedate'))
+    &Apache::lonxml::register('Apache::structuretags',('block','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','startouttext','endouttext'));
 }
 
 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;
-  } 
-  return '';
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $bodytext=&Apache::lonxml::get_all_text("/web",$parser);
+    if ($target eq 'web') {
+	return $bodytext;
+    }
+    return '';
 }
 
 sub end_web {
@@ -56,12 +55,12 @@
 }
 
 sub start_tex {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser);
-  if ($target eq 'tex') {
-      return $bodytext.' ';
-  }
-  return '';
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $bodytext=&Apache::lonxml::get_all_text("/tex",$parser);
+    if ($target eq 'tex') {
+	return $bodytext.' ';
+    }
+    return '';
 }
 
 sub end_tex {
@@ -69,85 +68,87 @@
 }
 
 sub page_start {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my %found;
-  foreach my $taginside ($tagstack) {
-    foreach my $taglookedfor ('html','body','form') {
-      if ($taginside =~ /^$taglookedfor$/i) { $found{$taglookedfor} = 1; }
-    }
-  }
-
-  my $result;
-  my $head_tag_start;
-  if (!defined($found{'html'})) {
-    $result=&Apache::londefdef::start_html($target,$token,$tagstack,$parstack,
-					   $parser,$safeeval);
-    $head_tag_start='<head>'.&Apache::lonmenu::registerurl(undef,$target);
-  }
-  my $body_tag_start;
-  if (!defined($found{'body'})) {
-    $body_tag_start='<body onLoad="'.&Apache::lonmenu::loadevents().'" '.
-      'onUnload="'.&Apache::lonmenu::unloadevents().'" ';
-    my $background=&Apache::lonxml::get_param('background',$parstack,$safeeval);
-    if ($background) {
-      $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
-	$background;
-      $body_tag_start.='background="'.$background.'" ';
-    } else {
-      my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,$safeeval);
-      if ($bgcolor) {
-	$body_tag_start.='bgcolor="'.$bgcolor.'" ';
-      } else {
-	$body_tag_start.='bgcolor="#ffffff"';
-      }
-    }
-    $body_tag_start.='>'.&Apache::lonmenu::menubuttons(undef,$target,1);
-    if ($target eq 'web' && $ENV{'request.state'} ne 'construct') {
-	my ($symb)=&Apache::lonxml::whichuser();
-	if ($symb eq '') {
-	    my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");
-	    $help="Browsing or <a href=\"/adm/ambiguous\">ambiguous</a> reference, submissions ignored $help<br />";
-	    $body_tag_start.=$help;
-	}
-    }
-  }
-  my $form_tag_start;
-  if (!defined($found{'form'})) {
-    $form_tag_start='<form name="lonhomework" method="POST" action="'.
-      $ENV{'request.uri'}.'">';
-  }
-  return ($result,$head_tag_start,$body_tag_start,$form_tag_start);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my %found;
+    foreach my $taginside ($tagstack) {
+	foreach my $taglookedfor ('html','body','form') {
+	    if ($taginside =~ /^$taglookedfor$/i) {$found{$taglookedfor} = 1;}
+	}
+    }
+
+    my $result;
+    my $head_tag_start;
+    if (!defined($found{'html'})) {
+	$result=&Apache::londefdef::start_html($target,$token,$tagstack,
+					       $parstack,$parser,$safeeval);
+	$head_tag_start='<head>'.&Apache::lonmenu::registerurl(undef,$target);
+    }
+    my $body_tag_start;
+    if (!defined($found{'body'})) {
+	$body_tag_start='<body onLoad="'.&Apache::lonmenu::loadevents().'" '.
+	    'onUnload="'.&Apache::lonmenu::unloadevents().'" ';
+	my $background=&Apache::lonxml::get_param('background',$parstack,
+						  $safeeval);
+	if ($background) {
+	    $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
+		$background;
+	    $body_tag_start.='background="'.$background.'" ';
+	} else {
+	    my $bgcolor=&Apache::lonxml::get_param('bgcolor',$parstack,
+						   $safeeval);
+	    if ($bgcolor) {
+		$body_tag_start.='bgcolor="'.$bgcolor.'" ';
+	    } else {
+		$body_tag_start.='bgcolor="#ffffff"';
+	    }
+	}
+	$body_tag_start.='>'.&Apache::lonmenu::menubuttons(undef,$target,1);
+	if ($target eq 'web' && $ENV{'request.state'} ne 'construct') {
+	    my ($symb)=&Apache::lonxml::whichuser();
+	    if ($symb eq '') {
+		my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference");
+		$help="Browsing or <a href=\"/adm/ambiguous\">ambiguous</a> reference, submissions ignored $help<br />";
+		$body_tag_start.=$help;
+	    }
+	}
+    }
+    my $form_tag_start;
+    if (!defined($found{'form'})) {
+	$form_tag_start='<form name="lonhomework" method="POST" action="'.
+	    $ENV{'request.uri'}.'">';
+    }
+    return ($result,$head_tag_start,$body_tag_start,$form_tag_start);
 }
 
 #use Time::HiRes();
 sub get_resource_name {
-  my ($parstack,$safeeval)=@_;
-  my $name=&Apache::lonnet::gettitle();
-  if ($name eq '') {
-    $name=&Apache::lonnet::EXT('resource.title');
-    if ($name eq 'con_lost') { $name = ''; }
-  }
-  $Apache::lonhomework::name=$name;
-  return $name;
+    my ($parstack,$safeeval)=@_;
+    my $name=&Apache::lonnet::gettitle();
+    if ($name eq '') {
+	$name=&Apache::lonnet::EXT('resource.title');
+	if ($name eq 'con_lost') { $name = ''; }
+    }
+    $Apache::lonhomework::name=$name;
+    return $name;
 }
 
 sub setup_rndseed {
-  my ($safeeval)=@_;
-  my $rndseed;
-  if ($ENV{'request.state'} eq "construct") {
-    $rndseed=$ENV{'form.rndseed'};
-    if (!$rndseed) {
-      $rndseed=time;
-      $ENV{'form.rndseed'}=$rndseed;
-    }
-    &Apache::lonxml::debug("Setting rndseed to $rndseed");
-    &Apache::run::run('$external::randomseed='.$rndseed.';',$safeeval);
-  }
-  return $rndseed;
+    my ($safeeval)=@_;
+    my $rndseed;
+    if ($ENV{'request.state'} eq "construct") {
+	$rndseed=$ENV{'form.rndseed'};
+	if (!$rndseed) {
+	    $rndseed=time;
+	    $ENV{'form.rndseed'}=$rndseed;
+	}
+	&Apache::lonxml::debug("Setting rndseed to $rndseed");
+	&Apache::run::run('$external::randomseed='.$rndseed.';',$safeeval);
+    }
+    return $rndseed;
 }
 
 sub problem_edit_header {
-  return '<input type="hidden" name="submitted" value="edit" />
+    return '<input type="hidden" name="submitted" value="edit" />
        <input type="hidden" name="problemmode" value="Edit" />
        <input type="submit" name="problemmode" value="Discard Edits and View" />
        <input type="submit" name="problemmode" value="EditXML" />
@@ -158,13 +159,13 @@
 }
 
 sub problem_edit_footer {
-  return '</td></tr></table><br /><input type="submit" name="submit" value="Submit Changes and Edit" />
+    return '</td></tr></table><br /><input type="submit" name="submit" value="Submit Changes and Edit" />
     <input type="submit" name="submit" value="Submit Changes and View" />';
 }
 
 sub problem_web_to_edit_header {
-  my ($rndseed)=@_;
-  my $result.='<input type="hidden" name="problemmode" value="View" />
+    my ($rndseed)=@_;
+    my $result.='<input type="hidden" name="problemmode" value="View" />
              <input type="submit" name="problemmode" value="Edit" />
              <input type="submit" name="problemmode" value="EditXML" />
              Random Seed:<input type="text" name="rndseed" width="10" value="'.
@@ -172,32 +173,32 @@
              <input type="submit" name="changerandseed" value="Change" />
              <input type="submit" name="resetdata" value="Reset Submissions" />
              <input type="checkbox" name="showallfoils" ';
-  if (defined($ENV{'form.showallfoils'})) { $result.='checked="on"'; }
-  $result.= ' />&nbsp;Show&nbsp;All&nbsp;Foils
+    if (defined($ENV{'form.showallfoils'})) { $result.='checked="on"'; }
+    $result.= ' />&nbsp;Show&nbsp;All&nbsp;Foils
              <hr />';
-  my $numtoanalyze=$ENV{'form.numtoanalyze'};
-  if (!$numtoanalyze) { $numtoanalyze=100; }
-  $result.= '<input type="submit" name="problemmode" value="Answer Distribution" />
+    my $numtoanalyze=$ENV{'form.numtoanalyze'};
+    if (!$numtoanalyze) { $numtoanalyze=100; }
+    $result.= '<input type="submit" name="problemmode" value="Answer Distribution" />
              <input type="text" name="numtoanalyze" value="'.
-	       $numtoanalyze.'" size="5" /> <hr />';
-  return $result;
+		 $numtoanalyze.'" size="5" /> <hr />';
+    return $result;
 }
 
 sub initialize_storage {
-  %Apache::lonhomework::results=();
-  my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
-  if ($ENV{'request.state'} eq 'construct') {
-    %Apache::lonhomework::history=
-      &Apache::lonnet::tmprestore($ENV{'request.uri'},'',$domain,$name);
+    %Apache::lonhomework::results=();
+    my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+    if ($ENV{'request.state'} eq 'construct') {
+	%Apache::lonhomework::history=
+	    &Apache::lonnet::tmprestore($ENV{'request.uri'},'',$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 ;
-    &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=(); }
+    if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
 }
 
 # -------------------------------------------------------------finalize_storage
@@ -205,25 +206,25 @@
 # checks form.grade_ for specific values, other wises stores
 # to the running users environment
 sub finalize_storage {
-  my $result;
-  my ($temp) = keys %Apache::lonhomework::results;
-  if ( $temp ne '' ) {
-    my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
-    if ($ENV{'request.state'} eq 'construct') {
-      $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
-				      $ENV{'request.uri'},'',$domain,$name);
-      &Apache::lonxml::debug('Construct Store return message:'.$result);
-    } else {
-      $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
-				      $symb,$courseid,$domain,$name);
-      &Apache::lonxml::debug('Store return message:'.$result);
+    my $result;
+    my ($temp) = keys %Apache::lonhomework::results;
+    if ( $temp ne '' ) {
+	my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+	if ($ENV{'request.state'} eq 'construct') {
+	    $result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
+					$ENV{'request.uri'},'',$domain,$name);
+	    &Apache::lonxml::debug('Construct Store return message:'.$result);
+	} else {
+	    $result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
+					    $symb,$courseid,$domain,$name);
+	    &Apache::lonxml::debug('Store return message:'.$result);
+	}
     }
-  }
-  return $result;
+    return $result;
 }
 
 sub checkout_msg {
-return (<<ENDCHECKOUT);
+    return (<<ENDCHECKOUT);
 <h2>The resource needs to be checked out</h2>
 As a resource gets checked out, a unique timestamped ID is given to it, and a
 permanent record is left in the system.<p />
@@ -239,293 +240,299 @@
 }
 
 sub start_problem {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
 
-  $Apache::lonhomework::parsing_a_problem=1;
-  # meta is called from lonpublisher, which doesn't uses the normal
-  # lonhomework method of parsing the file which means that inputtags 
-  # won't get reset
-  if ( $Apache::inputtags::part ne '' && $target != 'meta' ) {
-    &Apache::lonxml::error('Only one problem allowed in a .problem file');
-    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
-    return '';
-  }
-#intialize globals
-  $Apache::inputtags::part='0';
-  @Apache::inputtags::responselist = ();
-  @Apache::inputtags::previous=();
-  @Apache::inputtags::previous_version=();
-  $Apache::structuretags::printanswer='No';
-  if ($target ne 'analyze') {
-    &initialize_storage();
-    if ($target eq 'web') {
-      &Apache::lonhomework::showhash(%Apache::lonhomework::history);
+    $Apache::lonhomework::parsing_a_problem=1;
+    # meta is called from lonpublisher, which doesn't uses the normal
+    # lonhomework method of parsing the file which means that inputtags 
+    # won't get reset
+    if ( $Apache::inputtags::part ne '' && $target != 'meta' ) {
+	&Apache::lonxml::error('Only one problem allowed in a .problem file');
+	my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
+	return '';
     }
-    $Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
-    &Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
-  }
-  if ($Apache::lonhomework::type eq '') {
-    my $uri=$ENV{'request.uri'};
-    if ($uri=~/\.(\w+)$/) {
-      $Apache::lonhomework::type=$1;
-      &Apache::lonxml::debug("Using type of $1");
-    } else {
-      $Apache::lonhomework::type='problem';
-      &Apache::lonxml::debug("Using default type, problem, :$uri:");
+#intialize globals
+    $Apache::inputtags::part='0';
+    @Apache::inputtags::responselist = ();
+    @Apache::inputtags::previous=();
+    @Apache::inputtags::previous_version=();
+    $Apache::structuretags::printanswer='No';
+    if ($target ne 'analyze') {
+	&initialize_storage();
+	if ($target eq 'web') {
+	    &Apache::lonhomework::showhash(%Apache::lonhomework::history);
+	}
+	$Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
+	&Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
+    }
+    if ($Apache::lonhomework::type eq '') {
+	my $uri=$ENV{'request.uri'};
+	if ($uri=~/\.(\w+)$/) {
+	    $Apache::lonhomework::type=$1;
+	    &Apache::lonxml::debug("Using type of $1");
+	} else {
+	    $Apache::lonhomework::type='problem';
+	    &Apache::lonxml::debug("Using default type, problem, :$uri:");
+	}
     }
-  }
 
-  #added vars to the scripting enviroment
-  my $expression='$external::part='.$Apache::inputtags::part.';';
-  &Apache::run::run($expression,$safeeval);
-  my $status;
-  my $accessmsg;
-
-  #should get back a <html> 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);
-  if ($target eq 'tex' and $ENV{'request.symb'} =~ m/\.page_/) { $result = '';}
-
-  if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
-  if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
-    #handle exam checkout
-    if ($Apache::lonhomework::type eq 'exam') {
-      my $token=$Apache::lonhomework::history{"resource.0.outtoken"};
-      if (($ENV{'form.doescheckout'}) && (!$token)) {
-	$token=&Apache::lonxml::maketoken();
-	$Apache::lonhomework::history{"resource.0.outtoken"}=$token;
-      }
-      $body_tag_start.=&Apache::lonxml::printtokenheader($target,$token);
-    }
-
-    #handle rand seed in construction space
-    my $rndseed=&setup_rndseed($safeeval);
-    ($status,$accessmsg) = &Apache::lonhomework::check_access('0');
-    push (@Apache::inputtags::status,$status);
-    my $expression='$external::datestatus="'.$status.'";';
-    $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
+    #added vars to the scripting enviroment
+    my $expression='$external::part='.$Apache::inputtags::part.';';
     &Apache::run::run($expression,$safeeval);
-    &Apache::lonxml::debug("Got $status");
-    if (( $status eq 'CLOSED' ) ||
-        ( $status eq 'UNCHECKEDOUT') ||
-        ( $status eq 'BANNED') ||
-        ( $status eq 'UNAVAILABLE')) {
-      my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
-      if ( $target eq "web" ) {
-	$result.= $head_tag_start.'</head>';
-        my $msg=$body_tag_start;
-	if ($status eq 'UNAVAILABLE') {
-	    $result.='<h1>Unable to determine if this resource is open due to network problems. Please try again later.</h1>';
-	} else {
-	    $result.='<h1>Not open to be viewed</h1>';
-	}
-        if ($status eq 'CLOSED') {
-	    $msg.='The problem '.$accessmsg;
-	} elsif ($status eq 'UNCHECKEDOUT') {
-            $msg.=&checkout_msg;
-        }
-	$result.=$msg.'<br />';
-      } elsif ($target eq 'tex') {
-	  $result.='\begin{document}\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';
-	if ($status eq 'UNAVAILABLE') {
-	    $result.='Unable to determine if this resource is open due to network problems. Please try again later.\vskip 0 mm ';
-	} else {
-	    $result.="Problem is not open to be viewed. It $accessmsg \\vskip 0 mm ";
-	}
-      }
-    } elsif ($target eq 'web') {
-      my $name= &get_resource_name($parstack,$safeeval);
-      if ($status eq 'CAN_ANSWER') {
-	# create a page header and exit
-	$result.="$head_tag_start<title>$name</title></head>
-              $body_tag_start \n $form_tag_start".	
-		'<input type="hidden" name="submitted" value="yes" />';
-	if ($ENV{'request.state'} eq "construct") {
-	  $result.= &problem_web_to_edit_header($rndseed);
-	}
-	# if we are viewing someone else preserve that info
-	if (defined $ENV{'form.grade_symb'}) {
-	  foreach my $field ('symb','courseid','domain','username') {
-	    $result .= '<input type="hidden" name="grade_'.$field.
-	      '" value="'.$ENV{"form.grade_$field"}.'" />'."\n";
-	  }
-	}
-      } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER'
-	       || $status eq 'CLOSED' || $status eq 'UNAVALAILABLE') {
-	$result.=$head_tag_start.
-	  "<title>$name</title></head>\n$body_tag_start\n";
-      }
-    } elsif ($target eq 'tex') {
-	my $name= &Apache::lonxml::get_param('name',$parstack,$safeeval);
-	if ($name eq '') { 
-	    $name=&Apache::lonnet::EXT('resource.title');
-	    if ($name eq 'con_lost') { $name = ''; }
-	}
-	$Apache::lonhomework::name=$name;
-	my $id = $Apache::inputtags::part;
-	my $weight = &Apache::lonnet::EXT("resource.$id.weight");
-	my $allkeys = &Apache::lonnet::metadata($ENV{'request.uri'},'keys');
-	my @allkeys = split /,/,$allkeys;
-        my $allow_print_points = 0;
-	foreach my $partial_key (@allkeys) {
-	    if ($partial_key=~m/weight/) {
-		$allow_print_points++;
-	    }
-	}
-	my $duedate = &Apache::lonnet::EXT("resource.$id.duedate"); 
-	$duedate = POSIX::strftime("%c",localtime($duedate));
-	my $temp_file;
-	my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due";
-        if (-e $filename) {
-	    $temp_file = Apache::File->new($filename); 
-	} else {
-	    $temp_file = Apache::File->new('>>'.$filename); 
+    my $status;
+    my $accessmsg;
+
+    #should get back a <html> 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);
+    if ($target eq 'tex' and $ENV{'request.symb'} =~ m/\.page_/) {$result='';}
+
+    if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
+    if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
+	$target eq 'tex') {
+	#handle exam checkout
+	if ($Apache::lonhomework::type eq 'exam') {
+	    my $token=
+		$Apache::lonhomework::history{"resource.0.outtoken"};
+	    if (($ENV{'form.doescheckout'}) && (!$token)) {
+		$token=&Apache::lonxml::maketoken();
+		$Apache::lonhomework::history{"resource.0.outtoken"}=
+		    $token;
+	    }
+	    $body_tag_start.=&Apache::lonxml::printtokenheader($target,$token);
 	}
-	my @due_file_content = <$temp_file>;
-	my $due_file_content = $due_file_content[$#due_file_content];
-        chomp $due_file_content;
-	my $name_of_resourse= &get_resource_name($parstack,$safeeval);
-        if ($due_file_content ne $duedate) {	    
-	$temp_file = Apache::File->new('>'.$filename); 
-	    print $temp_file "$duedate\n";	    
-	    if (not $ENV{'request.symb'} =~ m/\.page_/) {
-		if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
-		    $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent\textit{Due date: '.$duedate.'} \vskip 1 mm\noindent \begin{minipage}{\textwidth}';	
+
+	#handle rand seed in construction space
+	my $rndseed=&setup_rndseed($safeeval);
+	($status,$accessmsg) = &Apache::lonhomework::check_access('0');
+	push (@Apache::inputtags::status,$status);
+	my $expression='$external::datestatus="'.$status.'";';
+	$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";';
+	&Apache::run::run($expression,$safeeval);
+	&Apache::lonxml::debug("Got $status");
+	if (( $status eq 'CLOSED' ) ||
+	    ( $status eq 'UNCHECKEDOUT') ||
+	    ( $status eq 'BANNED') ||
+	    ( $status eq 'UNAVAILABLE')) {
+	    my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser);
+	    if ( $target eq "web" ) {
+		$result.= $head_tag_start.'</head>';
+		my $msg=$body_tag_start;
+		if ($status eq 'UNAVAILABLE') {
+		    $result.='<h1>Unable to determine if this resource is open due to network problems. Please try again later.</h1>';
 		} else {
-		    $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm \noindent\begin{minipage}{\textwidth}';
-		    if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
+		    $result.='<h1>Not open to be viewed</h1>';
+		}
+		if ($status eq 'CLOSED') {
+		    $msg.='The problem '.$accessmsg;
+		} elsif ($status eq 'UNCHECKEDOUT') {
+		    $msg.=&checkout_msg;
+		}
+		$result.=$msg.'<br />';
+	    } elsif ($target eq 'tex') {
+		$result.='\begin{document}\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';
+		if ($status eq 'UNAVAILABLE') {
+		    $result.='Unable to determine if this resource is open due to network problems. Please try again later.\vskip 0 mm ';
+		} else {
+		    $result.="Problem is not open to be viewed. It $accessmsg \\vskip 0 mm ";
+		}
+	    }
+	} elsif ($target eq 'web') {
+	    my $name= &get_resource_name($parstack,$safeeval);
+	    if ($status eq 'CAN_ANSWER') {
+		# create a page header and exit
+		$result.="$head_tag_start<title>$name</title></head>
+              $body_tag_start \n $form_tag_start".	
+		  '<input type="hidden" name="submitted" value="yes" />';
+		if ($ENV{'request.state'} eq "construct") {
+		    $result.= &problem_web_to_edit_header($rndseed);
+		}
+		# if we are viewing someone else preserve that info
+		if (defined $ENV{'form.grade_symb'}) {
+		    foreach my $field ('symb','courseid','domain','username') {
+			$result .= '<input type="hidden" name="grade_'.$field.
+			    '" value="'.$ENV{"form.grade_$field"}.'" />'."\n";
+		    }
+		}
+	    } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER'
+		     || $status eq 'CLOSED' || $status eq 'UNAVALAILABLE') {
+		$result.=$head_tag_start.
+		    "<title>$name</title></head>\n$body_tag_start\n";
+	    }
+	} elsif ($target eq 'tex') {
+	    my $name= &Apache::lonxml::get_param('name',$parstack,$safeeval);
+	    if ($name eq '') {
+		$name=&Apache::lonnet::EXT('resource.title');
+		if ($name eq 'con_lost') { $name = ''; }
+	    }
+	    $Apache::lonhomework::name=$name;
+	    my $id = $Apache::inputtags::part;
+	    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
+	    my $allkeys=&Apache::lonnet::metadata($ENV{'request.uri'},'keys');
+	    my @allkeys = split /,/,$allkeys;
+	    my $allow_print_points = 0;
+	    foreach my $partial_key (@allkeys) {
+		if ($partial_key=~m/weight/) {
+		    $allow_print_points++;
 		}
+	    }
+	    my $duedate = &Apache::lonnet::EXT("resource.$id.duedate"); 
+	    $duedate = POSIX::strftime("%c",localtime($duedate));
+	    my $temp_file;
+	    my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due";
+	    if (-e $filename) {
+		$temp_file = Apache::File->new($filename);
 	    } else {
-		$result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';
-	    } 
-	} else {
-	    if (not $ENV{'request.symb'} =~ m/\.page_/) {
-		$result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm\noindent\begin{minipage}{\textwidth}';	
-		if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
+		$temp_file = Apache::File->new('>>'.$filename);
+	    }
+	    my @due_file_content = <$temp_file>;
+	    my $due_file_content = $due_file_content[$#due_file_content];
+	    chomp $due_file_content;
+	    my $name_of_resourse= &get_resource_name($parstack,$safeeval);
+	    if ($due_file_content ne $duedate) {
+		$temp_file = Apache::File->new('>'.$filename);
+		print $temp_file "$duedate\n";
+		if (not $ENV{'request.symb'} =~ m/\.page_/) {
+		    if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
+			$result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent\textit{Due date: '.$duedate.'} \vskip 1 mm\noindent \begin{minipage}{\textwidth}';	
+		    } else {
+			$result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm \noindent\begin{minipage}{\textwidth}';
+			if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
+		    }
+		} else {
+		    $result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';
+		}
 	    } else {
-		$result .= '\vskip 1mm \\\\\\\\';
-	    } 
+		if (not $ENV{'request.symb'} =~ m/\.page_/) {
+		    $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$ENV{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm\noindent\begin{minipage}{\textwidth}';	
+		    if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
+		} else {
+		    $result .= '\vskip 1mm \\\\\\\\';
+		}
+	    }
 	}
+    } elsif ($target eq 'edit') {
+	$result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
+	    &problem_edit_header();
+	my $temp=&Apache::edit::insertlist($target,$token);
+	$result.=$temp;
+    } elsif ($target eq 'modified') {
+	$result=$token->[4];
+	$result.=&Apache::edit::handle_insert();
+    } else {
+	# page_start returned a starting result, delete it if we don't need it
+	$result = '';
     }
-  } elsif ($target eq 'edit') {
-    $result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
-      &problem_edit_header();
-    my $temp=&Apache::edit::insertlist($target,$token);
-    $result.=$temp;
-  } elsif ($target eq 'modified') {
-    $result=$token->[4];
-    $result.=&Apache::edit::handle_insert();
-  } else {
-    # page_start returned a starting result, delete it if we don't need it
-    $result = '';
-  }
-  return $result;
+    return $result;
 }
 
 sub end_problem {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $result='';
-  my $status=$Apache::inputtags::status['-1'];
-  if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex') {
-    if ( $target eq 'grade' && $Apache::inputtags::part eq '0' && $status eq 'CAN_ANSWER' ) {
-      # if part is zero, no <part>s existed, so we need to the grading
-      &Apache::inputtags::grade;
-    } elsif ( ($target eq 'web' || $target eq 'tex') && $Apache::inputtags::part eq '0' && 
-	      $status ne 'UNCHECKEDOUT') {
-      # if part is zero, no <part>s existed, so we need show the current 
-      # grading status
-      my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
-      $result.= $gradestatus;
-    }
-    if (
-	(($target eq 'web') && ($ENV{'request.state'} ne 'construct')) ||
-	($target eq 'answer') || ($target eq 'tex')
-       ) {
-      if ($status eq 'CAN_ANSWER') {
-	  if ($target ne 'tex') {
-	      $result.="</form></body>\n";
-	  } 
-      } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER' ||
-	       $status eq 'UNCHECKEDOUT' ) {
-	  if ($target ne 'tex') {
-	      $result.="</body>\n";
-	  }
-      }
-      if ($target eq 'web') {
-	  $result.=&Apache::lonxml::xmlend();
-      } elsif ($target eq 'tex') {
-	  $result .= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
-	  if (not $ENV{'request.symb'} =~ m/\.page_/) {
-	      $result .= '\end{minipage}\end{document} ';
-	  } else {
-	      $result .= '';
-	  }
-      }
-    }
-    if ($target eq 'grade') { 
-      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
-      &finalize_storage();
-    }
-    if ($target eq 'answer' && ($ENV{'request.state'} eq 'construct') ) {
-	$result.='</html>'; #normally we get it from xmlend, but in CSTR
-                            # we always show answer mode too.
-    }
-  } elsif ($target eq 'meta') {
-    if ($Apache::inputtags::part eq '0') {
-      $result=&Apache::response::mandatory_part_meta;
-    }
-  } elsif ($target eq 'edit') {
-    &Apache::lonxml::debug("in end_problem with $target, edit");
-    $result = &problem_edit_footer();
-  }
-
-  undef(%Apache::lonhomework::history);
-  undef(%Apache::lonhomework::results);
-  undef($Apache::inputtags::part);
-  undef($Apache::lonhomework::parsing_a_problem);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $result='';
+    my $status=$Apache::inputtags::status['-1'];
+    if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
+	$target eq 'tex') {
+	if ( $target eq 'grade' && $Apache::inputtags::part eq '0' &&
+	     $status eq 'CAN_ANSWER' ) {
+	    # if part is zero, no <part>s existed, so we need to the grading
+	    &Apache::inputtags::grade;
+	} elsif ( ($target eq 'web' || $target eq 'tex') &&
+		  $Apache::inputtags::part eq '0' &&
+		  $status ne 'UNCHECKEDOUT') {
+	    # if part is zero, no <part>s existed, so we need show the current
+	    # grading status
+	    my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
+	    $result.= $gradestatus;
+	}
+	if (
+	    (($target eq 'web') && ($ENV{'request.state'} ne 'construct')) ||
+	    ($target eq 'answer') || ($target eq 'tex')
+	   ) {
+	    if ($status eq 'CAN_ANSWER') {
+		if ($target ne 'tex') {
+		    $result.="</form></body>\n";
+		}
+	    } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER' ||
+		     $status eq 'UNCHECKEDOUT' ) {
+		if ($target ne 'tex') {
+		    $result.="</body>\n";
+		}
+	    }
+	    if ($target eq 'web') {
+		$result.=&Apache::lonxml::xmlend();
+	    } elsif ($target eq 'tex') {
+		$result .= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}';
+		if (not $ENV{'request.symb'} =~ m/\.page_/) {
+		    $result .= '\end{minipage}\end{document} ';
+		} else {
+		    $result .= '';
+		}
+	    }
+	}
+	if ($target eq 'grade') {
+	    &Apache::lonhomework::showhash(%Apache::lonhomework::results);
+	    &finalize_storage();
+	}
+	if ($target eq 'answer' && ($ENV{'request.state'} eq 'construct') ) {
+	    $result.='</html>'; #normally we get it from xmlend, but in CSTR
+	                        # we always show answer mode too.
+	}
+    } elsif ($target eq 'meta') {
+	if ($Apache::inputtags::part eq '0') {
+	    $result=&Apache::response::mandatory_part_meta;
+	}
+    } elsif ($target eq 'edit') {
+	&Apache::lonxml::debug("in end_problem with $target, edit");
+	$result = &problem_edit_footer();
+    }
 
-  return $result;
+    undef(%Apache::lonhomework::history);
+    undef(%Apache::lonhomework::results);
+    undef($Apache::inputtags::part);
+    undef($Apache::lonhomework::parsing_a_problem);
+
+    return $result;
 }
 
 
 sub start_library {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my ($result,$head_tag_start,$body_tag_start,$form_tag_start);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my ($result,$head_tag_start,$body_tag_start,$form_tag_start);
 
-  if ($target eq 'edit') {
-    ($result,$head_tag_start,$body_tag_start,$form_tag_start)=
-      &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
-    $result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
-      &problem_edit_header();
-    my $temp=&Apache::edit::insertlist($target,$token);
-    $result.=$temp;
-  } elsif ($target eq 'modified') {
-    $result=$token->[4];
-    $result.=&Apache::edit::handle_insert();
-  } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
-	   $ENV{'request.state'} eq "construct" ) {
-    ($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 $rndseed=&setup_rndseed($safeeval);
-    $result.="$head_tag_start<title>$name</title></head>
+    if ($target eq 'edit') {
+	($result,$head_tag_start,$body_tag_start,$form_tag_start)=
+	    &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
+	$result.=$head_tag_start."</head>".$body_tag_start.$form_tag_start.
+	    &problem_edit_header();
+	my $temp=&Apache::edit::insertlist($target,$token);
+	$result.=$temp;
+    } elsif ($target eq 'modified') {
+	$result=$token->[4];
+	$result.=&Apache::edit::handle_insert();
+    } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
+	     $ENV{'request.state'} eq "construct" ) {
+	($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 $rndseed=&setup_rndseed($safeeval);
+	$result.="$head_tag_start<title>$name</title></head>
               $body_tag_start \n $form_tag_start".	
-		'<input type="hidden" name="submitted" value="yes" />';
-    $result.=&problem_web_to_edit_header($rndseed);
-  }
-  return $result;
+		  '<input type="hidden" name="submitted" value="yes" />';
+	$result.=&problem_web_to_edit_header($rndseed);
+    }
+    return $result;
 }
 
 sub end_library {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $result='';
-  if ($target eq 'edit') {
-    $result=&problem_edit_footer();
-  } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
-	   $ENV{'request.state'} eq "construct") {
-    $result.='</form></body>'.&Apache::lonxml::xmlend();
-  }
-  return $result;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $result='';
+    if ($target eq 'edit') {
+	$result=&problem_edit_footer();
+    } elsif ($target eq 'web' && $$tagstack[0] ne 'problem' &&
+	     $ENV{'request.state'} eq "construct") {
+	$result.='</form></body>'.&Apache::lonxml::xmlend();
+    }
+    return $result;
 }
 
 sub start_block {
@@ -535,10 +542,8 @@
 
     if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || 
 	$target eq 'tex' || $target eq 'analyze') {
-	my $code = @$parstack[$#$parstack];
+	my $code = $token->[2]->{'condition'};
 	if ($code) {
-	    $code =~ s/\"//g;
-	    $code .=';return $condition;';
 	    if (!$Apache::lonxml::default_homework_loaded) {
 		&Apache::lonxml::default_homework_load($safeeval);
 	    }
@@ -566,38 +571,39 @@
 }
 
 sub end_block {
-  return '';
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my @result=('','');
+    if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
+    return (@result);
 }
 
 sub start_while {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+
+    my $code = $token->[2]->{'condition'};
 
-  my $code = @$parstack[$#$parstack];
-  $code =~ s/\"//g;
-  $code .=';return $condition;';
-
-  push( @Apache::structuretags::whileconds, $code); 
-  if (!$Apache::lonxml::default_homework_loaded) {
-      &Apache::lonxml::default_homework_load($safeeval);
-  }
-  my $result = &Apache::run::run($code,$safeeval);
-  my $bodytext=$$parser[$#$parser]->get_text("/while");
-  push( @Apache::structuretags::whilebody, $bodytext);
-  if ( $result ) { 
-    &Apache::lonxml::newparser($parser,\$bodytext);
-  }
-  return "";
+    push( @Apache::structuretags::whileconds, $code); 
+    if (!$Apache::lonxml::default_homework_loaded) {
+	&Apache::lonxml::default_homework_load($safeeval);
+    }
+    my $result = &Apache::run::run($code,$safeeval);
+    my $bodytext=$$parser[$#$parser]->get_text("/while");
+    push( @Apache::structuretags::whilebody, $bodytext);
+    if ( $result ) {
+	&Apache::lonxml::newparser($parser,\$bodytext);
+    }
+    return "";
 }
 
 sub end_while {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $code = pop @Apache::structuretags::whileconds;
-  my $bodytext = pop @Apache::structuretags::whilebody;
-  my $result = &Apache::run::run($code,$safeeval);
-  if ( $result ) { 
-    &Apache::lonxml::newparser($parser,\$bodytext);
-  } 
-  return "";
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $code = pop @Apache::structuretags::whileconds;
+    my $bodytext = pop @Apache::structuretags::whilebody;
+    my $result = &Apache::run::run($code,$safeeval);
+    if ( $result ) {
+	&Apache::lonxml::newparser($parser,\$bodytext);
+    }
+    return "";
 }
 
 # <randomlist show="1"> 
@@ -607,283 +613,295 @@
 #  ... 
 # </randomlist>
 sub start_randomlist {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $result;
-  if ($target eq 'answer' || $target eq 'grade' || $target eq 'web' ||
-      $target eq 'tex' || $target eq 'analyze') {
-    my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
-    my $b_parser= HTML::TokeParser->new(\$body);
-    my $b_tok;
-    my @randomlist;
-    my $list_item;
-    while($b_tok = $b_parser->get_token() ) {
-      if($b_tok->[0] eq 'S') { # start tag
-	# get content of the tag until matching end tag
-	# get all text upto the matching tag
-	# and push the content into @randomlist
-	$list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],$b_parser);
-	$list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
-	push(@randomlist,$list_item);
-	#  print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4], $list_item</b>";
-      }
-      if($b_tok->[0] eq 'T') { # text
-	# what to do with text in between tags?
-	#  print "<b>TEXT $b_tok->[1]</b><br />";
-      }
-      # if($b_tok->[0] eq 'E') { # end tag, should not happen
-      #  print "<b>END-TAG $b_tok->[1]</b><br />";
-      # }
-    }
-    my @idx_arr = (0 .. $#randomlist);
-    &Apache::structuretags::shuffle(\@idx_arr);
-    my $bodytext = '';
-    my $show=$#randomlist;
-    my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
-    $showarg--;
-    if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
-    for(0 .. $show) {
-      $bodytext .= "$randomlist[ $idx_arr[$_] ]";
-    }
-    &Apache::lonxml::newparser($parser,\$bodytext);
-  } elsif ($target eq 'edit' ) {
-    $result .= &Apache::edit::tag_start($target,$token);
-    $result .= &Apache::edit::text_arg('Maximum Tags to Show:','show',$token,5);
-    $result .= &Apache::edit::end_row().&Apache::edit::start_spanning_row();
-  } elsif ($target eq 'modified' ) {
-    my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
-						 'show');
-    if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
-  }
-  return $result;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $result;
+    if ($target eq 'answer' || $target eq 'grade' || $target eq 'web' ||
+	$target eq 'tex' || $target eq 'analyze') {
+	my $body= &Apache::lonxml::get_all_text("/randomlist",$parser);
+	my $b_parser= HTML::TokeParser->new(\$body);
+	my $b_tok;
+	my @randomlist;
+	my $list_item;
+	while($b_tok = $b_parser->get_token() ) {
+	    if($b_tok->[0] eq 'S') { # start tag
+		# get content of the tag until matching end tag
+		# get all text upto the matching tag
+		# and push the content into @randomlist
+		$list_item = &Apache::lonxml::get_all_text('/'.$b_tok->[1],
+							   $b_parser);
+		$list_item = "$b_tok->[4]"."$list_item"."</$b_tok->[1]>";
+		push(@randomlist,$list_item);
+		#  print "<br /><b>START-TAG $b_tok->[1], $b_tok->[4],
+                #         $list_item</b>";
+	    }
+	    if($b_tok->[0] eq 'T') { # text
+		# what to do with text in between tags?
+		#  print "<b>TEXT $b_tok->[1]</b><br />";
+	    }
+	    # if($b_tok->[0] eq 'E') { # end tag, should not happen
+	    #  print "<b>END-TAG $b_tok->[1]</b><br />";
+	    # }
+	}
+	my @idx_arr = (0 .. $#randomlist);
+	&Apache::structuretags::shuffle(\@idx_arr);
+	my $bodytext = '';
+	my $show=$#randomlist;
+	my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval);
+	$showarg--;
+	if ( ($showarg >= 0) && ($showarg < $show) ) { $show = $showarg; }
+	for(0 .. $show) {
+	    $bodytext .= "$randomlist[ $idx_arr[$_] ]";
+	}
+	&Apache::lonxml::newparser($parser,\$bodytext);
+    } elsif ($target eq 'edit' ) {
+	$result .=&Apache::edit::tag_start($target,$token);
+	$result .=&Apache::edit::text_arg('Maximum Tags to Show:','show',
+					   $token,5);
+	$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
+    } elsif ($target eq 'modified' ) {
+	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+						     $safeeval,'show');
+	if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
+    }
+    return $result;
 }
 
 sub shuffle {
     my $a=shift;
     my $i;
     if (defined(@$a)) {
-      &Apache::response::setrandomnumber();
-      for($i=@$a;--$i;) {
-	my $j=int(&Math::Random::random_uniform() * ($i+1));
-	next if $i == $j;
-	@$a[$i,$j] = @$a[$j,$i];
-      }
+	&Apache::response::setrandomnumber();
+	for($i=@$a;--$i;) {
+	    my $j=int(&Math::Random::random_uniform() * ($i+1));
+	    next if $i == $j;
+	    @$a[$i,$j] = @$a[$j,$i];
+	}
     }
 }
 
 sub end_randomlist {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $result;
-  if ($target eq 'edit' ) {
-    $result=&Apache::edit::tag_end($target,$token,'End Randomly Parsed Block');
-  }
-  return $result;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $result;
+    if ($target eq 'edit' ) {
+	$result=&Apache::edit::tag_end($target,$token,
+				       'End Randomly Parsed Block');
+    }
+    return $result;
 }
 
 sub start_part {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $result='';
-  my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
-  if ($id eq '') { $id = $Apache::lonxml::curdepth; }
-  $Apache::inputtags::part=$id;
-  @Apache::inputtags::responselist = ();
-  @Apache::inputtags::previous=();
-  @Apache::inputtags::previous_version=();
-  my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
-
-  if ($target eq 'meta') {
-    return &Apache::response::mandatory_part_meta;
-  } elsif ($target eq 'web' || $target eq 'grade' ||
-	   $target eq 'answer' || $target eq 'tex') {
-      if ($hidden) {
-	  my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
-      } else {
-	  my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
-	  push (@Apache::inputtags::status,$status);
-	  my $expression='$external::datestatus="'.$status.'";';
-	  $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
-	  &Apache::run::run($expression,$safeeval);
-	  if ( $status eq 'CLOSED' ) {
-	      my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
-	      if ( $target eq "web" ) {
-		  $result="<br />Part is not open to be viewed. It $accessmsg<br />";
-	      } elsif ( $target eq 'tex' ) {
-		  $result="\\end{minipage}\\vskip 0 mm Part is not open to be viewed. It $accessmsg \\\\\\begin{minipage}{\\textwidth}";
-	      }
-	  } else {
-	      if ($target eq 'tex') {
-		$result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
-		my $weight = &Apache::lonnet::EXT("resource.$id.weight");
-		if ($Apache::lonhomework::type eq 'exam') { $result .= '\fbox{\textit{'.$weight.' pt}}';}
-	      }
-	  }
-      }
-  } elsif ($target eq 'edit') {
-      $result.=&Apache::edit::tag_start($target,$token);
-      $result.=&Apache::edit::text_arg('Part ID:','id',$token).
-	  &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
-	      &Apache::edit::end_row().&Apache::edit::start_spanning_row();
-
-  } elsif ($target eq 'modified') {
-      my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,
-						   'id');
-      if ($constructtag) {
-	  $result = &Apache::edit::rebuild_tag($token);
-	  $result.=&Apache::edit::handle_insert();
-      }
-  }
-  return $result;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $result='';
+    my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
+    if ($id eq '') { $id = $Apache::lonxml::curdepth; }
+    $Apache::inputtags::part=$id;
+    @Apache::inputtags::responselist = ();
+    @Apache::inputtags::previous=();
+    @Apache::inputtags::previous_version=();
+    my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
+
+    if ($target eq 'meta') {
+	return &Apache::response::mandatory_part_meta;
+    } elsif ($target eq 'web' || $target eq 'grade' ||
+	     $target eq 'answer' || $target eq 'tex') {
+	if ($hidden) {
+	    my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
+	} else {
+	    my ($status,$accessmsg) = &Apache::lonhomework::check_access($id);
+	    push (@Apache::inputtags::status,$status);
+	    my $expression='$external::datestatus="'.$status.'";';
+	    $expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
+	    &Apache::run::run($expression,$safeeval);
+	    if ( $status eq 'CLOSED' ) {
+		my $bodytext=&Apache::lonxml::get_all_text("/part",$parser);
+		if ( $target eq "web" ) {
+		    $result="<br />Part is not open to be viewed. It $accessmsg<br />";
+		} elsif ( $target eq 'tex' ) {
+		    $result="\\end{minipage}\\vskip 0 mm Part is not open to be viewed. It $accessmsg \\\\\\begin{minipage}{\\textwidth}";
+		}
+	    } else {
+		if ($target eq 'tex') {
+		    $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
+		    my $weight = &Apache::lonnet::EXT("resource.$id.weight");
+		    if ($Apache::lonhomework::type eq 'exam') { $result .= '\fbox{\textit{'.$weight.' pt}}';}
+		}
+	    }
+	}
+    } elsif ($target eq 'edit') {
+	$result.=&Apache::edit::tag_start($target,$token);
+	$result.=&Apache::edit::text_arg('Part ID:','id',$token).
+	    &Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
+		&Apache::edit::end_row().&Apache::edit::start_spanning_row();
+    } elsif ($target eq 'modified') {
+	my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+						     $safeeval,'id');
+	if ($constructtag) {
+	    $result = &Apache::edit::rebuild_tag($token);
+	    $result.=&Apache::edit::handle_insert();
+	}
+    }
+    return $result;
 }
 
 sub end_part {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  &Apache::lonxml::debug("in end_part $target ");
-  my $status=$Apache::inputtags::status['-1'];
-  my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
-  my $result='';
-  if ( $target eq 'meta' ) {
-      $result='';
-  } elsif ( $target eq 'grade' && $status eq 'CAN_ANSWER' && !$hidden) {
-    $result=&Apache::inputtags::grade;
-  } elsif (($target eq 'web' || $target eq 'tex') && !$hidden ) {
-    my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
-						    $target);
-    if ($Apache::lonhomework::type eq 'exam') {$gradestatus='';}
-    $result=$gradestatus;
-  }
-  pop @Apache::inputtags::status;
-  $Apache::inputtags::part='';
-  return $result;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    &Apache::lonxml::debug("in end_part $target ");
+    my $status=$Apache::inputtags::status['-1'];
+    my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
+    my $result='';
+    if ( $target eq 'meta' ) {
+	$result='';
+    } elsif ( $target eq 'grade' && $status eq 'CAN_ANSWER' && !$hidden) {
+	$result=&Apache::inputtags::grade;
+    } elsif (($target eq 'web' || $target eq 'tex') && !$hidden ) {
+	my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
+							$target);
+	if ($Apache::lonhomework::type eq 'exam') {$gradestatus='';}
+	$result=$gradestatus;
+    }
+    pop @Apache::inputtags::status;
+    $Apache::inputtags::part='';
+    return $result;
 }
 
 sub start_preduedate {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
-    if ($Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
-	$Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER' && 
-        $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
-      &Apache::lonxml::get_all_text("/preduedate",$parser);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
+	if ($Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
+	    $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER' &&
+	    $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
+	    &Apache::lonxml::get_all_text("/preduedate",$parser);
+	}
     }
-  }
-  return '';
+    return '';
 }
 
 sub end_preduedate {
-  return '';
+    return '';
 }
 
 sub start_postanswerdate {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') {
-    if ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
-      &Apache::lonxml::get_all_text("/postanswerdate",$parser);
-    }
-  } elsif ($target eq 'tex') {
-      return '\vskip 0 mm \noindent';
-  }
-  return '';
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') {
+	if ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
+	    &Apache::lonxml::get_all_text("/postanswerdate",$parser);
+	}
+    } elsif ($target eq 'tex') {
+	return '\vskip 0 mm \noindent';
+    }
+    return '';
 }
 
 sub end_postanswerdate {
-  return '';
+    return '';
 }
 
 sub start_notsolved {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
-    my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
-    &Apache::lonxml::debug("not solved has :$gradestatus:");
-    if ($gradestatus =~ /^correct/) {
-      &Apache::lonxml::debug("skipping");
-      &Apache::lonxml::get_all_text("/notsolved",$parser);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
+	$target eq 'tex') {
+	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
+	&Apache::lonxml::debug("not solved has :$gradestatus:");
+	if ($gradestatus =~ /^correct/) {
+	    &Apache::lonxml::debug("skipping");
+	    &Apache::lonxml::get_all_text("/notsolved",$parser);
+	}
     }
-  }
-  return '';
+    return '';
 }
 
 sub end_notsolved {
-  return '';
+    return '';
 }
 
 sub start_solved {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
-    my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
-    if ($gradestatus !~ /^correct/) {
-      &Apache::lonxml::get_all_text("/solved",$parser);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
+	$target eq 'tex') {
+	my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
+	if ($gradestatus !~ /^correct/) {
+	    &Apache::lonxml::get_all_text("/solved",$parser);
+	}
     }
-  }
-  return '';
+    return '';
 }
 
 sub end_solved {
-  return '';
+    return '';
 }
 
 sub start_startouttext {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my @result=(''.'');
-  if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
-  return (@result);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my @result=(''.'');
+    if ($target eq 'edit' || $target eq 'modified' ) { @result=('','no'); }
+    return (@result);
 }
+
 sub end_startouttext {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $result='';
-  my $text='';
-
-  if ($target eq 'edit') {
-    $text=&Apache::lonxml::get_all_text("endouttext",$parser);
-    $result.=&Apache::edit::start_table($token)."<tr><td>Text Block</td>
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $result='';
+    my $text='';
+
+    if ($target eq 'edit') {
+	$text=&Apache::lonxml::get_all_text("endouttext",$parser);
+	$result.=&Apache::edit::start_table($token)."<tr><td>Text Block</td>
 <td>Delete:".
-  &Apache::edit::deletelist($target,$token)
-    ."</td>
+                 &Apache::edit::deletelist($target,$token)
+		 ."</td>
 <td>".
-  &Apache::edit::insertlist($target,$token).
-    &Apache::edit::end_row().&Apache::edit::start_spanning_row()."\n"
-	.'<table><tr><td>'.
-    &Apache::loncommon::help_open_topic("Greek_Symbols",'Greek Symbols',
-					undef,undef,600)
-	.'</td><td>'.
-    &Apache::loncommon::help_open_topic("Other_Symbols",'Other Symbols',
-					undef,undef,600)
-	.'</td></tr></table>'.
-    &Apache::edit::editfield($token->[1],$text,"",80,4);
-  }
-  if ($target eq 'modified') {
-    $text=&Apache::lonxml::get_all_text("endouttext",$parser);
-    $result='<startouttext />'.&Apache::edit::modifiedfield();
-  }
-  if ($target eq 'tex') {
-      $result .= '\noindent ';
-  }
-  return $result;
+                 &Apache::edit::insertlist($target,$token).
+		 &Apache::edit::end_row().
+                 &Apache::edit::start_spanning_row()."\n"
+		 .'<table><tr><td>'.
+		 &Apache::loncommon::help_open_topic("Greek_Symbols",
+						     'Greek Symbols',
+						     undef,undef,600)
+		 .'</td><td>'.
+		 &Apache::loncommon::help_open_topic("Other_Symbols",
+						     'Other Symbols',
+						     undef,undef,600)
+		 .'</td></tr></table>'.
+		 &Apache::edit::editfield($token->[1],$text,"",80,4);
+    }
+    if ($target eq 'modified') {
+	$text=&Apache::lonxml::get_all_text("endouttext",$parser);
+	$result='<startouttext />'.&Apache::edit::modifiedfield();
+    }
+    if ($target eq 'tex') {
+	$result .= '\noindent ';
+    }
+    return $result;
 }
+
 sub start_endouttext {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my $result='';
-  if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
-  if ($target eq "modified") { 
-     $result='<endouttext />'.
-     &Apache::edit::handle_insertafter('startouttext'); }
-  return $result;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my $result='';
+    if ($target eq "edit" ) { $result="</td></tr>".&Apache::edit::end_table()."\n"; }
+    if ($target eq "modified") {
+	$result='<endouttext />'.
+	    &Apache::edit::handle_insertafter('startouttext'); }
+    return $result;
 }
+
 sub end_endouttext {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-  my @result=('','');
-  if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
-  return (@result);
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    my @result=('','');
+    if ($target eq "edit" || $target eq 'modified') { @result=('','no'); }
+    return (@result);
 }
+
 sub delete_startouttext {
-  my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
-#  my $text=&Apache::lonxml::get_all_text("endouttext",$parser);
-  my $text=$$parser['-1']->get_text("/endouttext");
-  my $ntoken=$$parser['-1']->get_token();
-  &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
-  &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
-  # Deleting 2 parallel tag pairs, but we need the numbers later to look like 
-  # they did the last time round
-  &Apache::lonxml::increasedepth($ntoken);
-  &Apache::lonxml::decreasedepth($ntoken);
-  return 1;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+    #  my $text=&Apache::lonxml::get_all_text("endouttext",$parser);
+    my $text=$$parser['-1']->get_text("/endouttext");
+    my $ntoken=$$parser['-1']->get_token();
+    &Apache::lonxml::debug("Deleting :$text: and :$ntoken->[0]:$ntoken->[1]:$ntoken->[2]: for startouttext");
+    &Apache::lonxml::end_tag($tagstack,$parstack,$ntoken);
+    # Deleting 2 parallel tag pairs, but we need the numbers later to look like
+    # they did the last time round
+    &Apache::lonxml::increasedepth($ntoken);
+    &Apache::lonxml::decreasedepth($ntoken);
+    return 1;
 }
 
 1;

--albertel1049380319--