--- loncom/xml/lonxml.pm	2001/08/20 16:12:46	1.120
+++ loncom/xml/lonxml.pm	2001/10/01 20:06:45	1.132
@@ -13,7 +13,10 @@
 # 6/12,6/13 H. K. Ng
 # 6/16 Gerd Kortemeyer
 # 7/27 H. K. Ng
-# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20 Gerd Kortemeyer
+# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20,8/23,8/24 Gerd Kortemeyer
+# Guy Albertelli
+# 9/26 Gerd Kortemeyer
+
 
 package Apache::lonxml; 
 use vars 
@@ -245,7 +248,7 @@ sub printtokenheader {
                '<br />DocID: '.$token.
                '<br />Time: '.localtime().'<hr />';
     } else {
-        return $token;                         
+        return $token;
     }
 }
 
@@ -260,7 +263,11 @@ sub fontsettings() {
 
 sub registerurl {
     my $forcereg=shift;
-    if ($Apache::lonxml::registered) { return ''; }
+    if ($ENV{'request.publicaccess'}) {
+	return 
+         '<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>';
+    }
+    if ($Apache::lonxml::registered && !$forcereg) { return ''; }
     $Apache::lonxml::registered=1;
     if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
         my $hwkadd='';
@@ -323,7 +330,7 @@ ENDPARM
 	  menu=window.open("","LONCAPAmenu");
           menu.currentStale=1;
           menu.switchbutton
-            (3,1,'reload.gif','return','location','go(currentURL)');
+             (3,1,'reload.gif','return','location','go(currentURL)');
           menu.clearbut(7,1);
           menu.clearbut(7,2);
           menu.clearbut(7,3);
@@ -408,7 +415,9 @@ sub xmlparse {
 
  my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
 				   $safeeval,\%style_for_target);
-
+ if ($ENV{'request.uri'}) {
+    &writeallows($ENV{'request.uri'});
+ }
  return $finaloutput;
 }
 
@@ -435,7 +444,6 @@ sub htmlclean {
 
 sub inner_xmlparse {
   my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
-  &Apache::lonxml::debug('Reentrant parser starting, again?');
   my $finaloutput = '';
   my $result;
   my $token;
@@ -657,11 +665,17 @@ sub setup_globals {
   my ($target)=@_;
   $Apache::lonxml::registered = 0;
   @Apache::lonxml::pwd=();
+  @Apache::lonxml::extlinks=();
   if ($target eq 'meta') {
     $Apache::lonxml::redirection = 0;
     $Apache::lonxml::metamode = 1;
     $Apache::lonxml::evaluate = 1;
     $Apache::lonxml::import = 0;
+  } elsif ($target eq 'answer') {
+    $Apache::lonxml::redirection = 0;
+    $Apache::lonxml::metamode = 1;
+    $Apache::lonxml::evaluate = 1;
+    $Apache::lonxml::import = 1;
   } elsif ($target eq 'grade') {
     &startredirection;
     $Apache::lonxml::metamode = 0;
@@ -738,7 +752,10 @@ sub init_safespace {
 #need to inspect this class of ops
 # $safeeval->deny(":base_orig");
   $safeinit .= ';$external::target="'.$target.'";';
-  $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';';
+  my $rndseed;
+  my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
+  $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name);
+  $safeinit .= ';$external::randomseed='.$rndseed.';';
   &Apache::run::run($safeinit,$safeeval);
 }
 
@@ -873,6 +890,7 @@ sub parstring {
 }
 
 sub writeallows {
+    unless ($#extlinks>=0) { return; }
     my $thisurl='/res/'.&Apache::lonnet::declutter(shift);
     if ($ENV{'httpref.'.$thisurl}) {
 	$thisurl=$ENV{'httpref.'.$thisurl};
@@ -882,7 +900,9 @@ sub writeallows {
     my %httpref=();
     map {
        $httpref{'httpref.'.
- 	        &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl;              } @extlinks;
+ 	        &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl;
+    } @extlinks;
+    @extlinks=();
     &Apache::lonnet::appenv(%httpref);
 }
 
@@ -1031,10 +1051,11 @@ ENDNOTFOUND
   unless ($ENV{'request.state'} eq 'published') {
       $result=&inserteditinfo($result,$filecontents);
   }
+  
+  writeallows($request->uri);
 
   $request->print($result);
 
-  writeallows($request->uri);
   return OK;
 }
  
@@ -1077,7 +1098,25 @@ sub get_param {
   if ( ! $context ) { $context = -1; }
   my $args ='';
   if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
-  return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+  if ( $args =~ /my \$$param=\"/ ) {
+    return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+  } else {
+    return undef;
+  }
+}
+
+sub get_param_var {
+  my ($param,$parstack,$safeeval,$context) = @_;
+  if ( ! $context ) { $context = -1; }
+  my $args ='';
+  if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
+  if ( $args !~ /my \$$param=\"/ ) { return undef; }
+  my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
+  if ($value =~ /^[\$\@\%]/) {
+    return &Apache::run::run("return $value",$safeeval,1);
+  } else {
+    return $value;
+  }
 }
 
 sub register_insert {
@@ -1119,6 +1158,29 @@ sub description {
   my ($token)=@_;
   return $insertlist{$insertlist{"$token->[1].num"}.'.description'};
 }
+
+# ----------------------------------------------------------------- whichuser
+# returns a list of $symb, $courseid, $domain, $name that is correct for
+# calls to lonnet functions for this setup.
+# - looks for form.grade_ parameters
+sub whichuser {
+  my $symb=&Apache::lonnet::symbread();
+  my $courseid=$ENV{'request.course.id'};
+  my $domain=$ENV{'user.domain'};
+  my $name=$ENV{'user.name'};
+  if (defined($ENV{'form.grade_symb'})) {
+    my $tmp_courseid=$ENV{'form.grade_courseid'};
+    my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid);
+    if ($allowed) {
+      $symb=$ENV{'form.grade_symb'};
+      $courseid=$ENV{'form.grade_courseid'};
+      $domain=$ENV{'form.grade_domain'};
+      $name=$ENV{'form.grade_username'};
+    }
+  }
+  return ($symb,$courseid,$domain,$name);
+}
+
 1;
 __END__