--- loncom/xml/lonxml.pm	2007/02/23 00:39:35	1.440
+++ loncom/xml/lonxml.pm	2007/06/11 20:52:40	1.448
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.440 2007/02/23 00:39:35 albertel Exp $
+# $Id: lonxml.pm,v 1.448 2007/06/11 20:52:40 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -42,6 +42,7 @@ package Apache::lonxml;
 use vars 
 qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount);
 use strict;
+use LONCAPA;
 use HTML::LCParser();
 use HTML::TreeBuilder();
 use HTML::Entities();
@@ -124,6 +125,9 @@ $evaluate = 1;
 # stores the list of active tag namespaces
 @namespace=();
 
+# stores all Scrit Vars displays for later showing
+my @script_var_displays=();
+
 # a pointer the the Apache request object
 $Apache::lonxml::request='';
 
@@ -356,6 +360,11 @@ sub xmlparse {
 
  &clean_safespace($safeeval);
 
+ if (@script_var_displays) {
+     $finaloutput .= join('',@script_var_displays);
+     undef(@script_var_displays);
+ }
+
  if ($env{'form.return_only_error_and_warning_counts'}) {
      return "$errorcount:$warningcount";
  }
@@ -585,17 +594,23 @@ sub callsub {
 	  } elsif ($token->[0] eq 'E') {
 	    $currentstring = &Apache::edit::tag_end($target,$token);
 	  }
-	} elsif ($target eq 'modified') {
+	}
+      }
+      if ($target eq 'modified' && $nodefault eq '') {
+	  if ($currentstring eq '') {
+	      if ($token->[0] eq 'S') {
+		  $currentstring = $token->[4];
+	      } elsif ($token->[0] eq 'E') {
+		  $currentstring = $token->[2];
+	      } else {
+		  $currentstring = $token->[2];
+	      }
+	  }
 	  if ($token->[0] eq 'S') {
-	    $currentstring = $token->[4];
-	    $currentstring.=&Apache::edit::handle_insert();
+	      $currentstring.=&Apache::edit::handle_insert();
 	  } elsif ($token->[0] eq 'E') {
-	    $currentstring = $token->[2];
-            $currentstring.=&Apache::edit::handle_insertafter($token->[1]);
-	  } else {
-	    $currentstring = $token->[2];
+	      $currentstring.=&Apache::edit::handle_insertafter($token->[1]);
 	  }
-	}
       }
     }
     use strict 'refs';
@@ -613,6 +628,7 @@ sub setup_globals {
   &init_counter();
   @Apache::lonxml::pwd=();
   @Apache::lonxml::extlinks=();
+  @script_var_displays=();
   @Apache::lonxml::ssi_info=();
   $Apache::lonxml::post_evaluate=1;
   $Apache::lonxml::warnings_error_header='';
@@ -990,6 +1006,24 @@ sub get_all_text_unbalanced {
     return $result
 }
 
+=pod
+
+For bubble grading mode and exam bubble printing mode, the tracking of
+the current 'bubble line number' is stored in the %env element
+'form.counter', and is modifed and handled by the following routines.
+
+The value of it is stored in $Apache:lonxml::counter when live and
+stored back to env after done.
+
+=item &increment_counter($increment);
+
+Increments the internal counter environment variable a specified amount
+
+Optional Arguments:
+  $increment - amount to increment by (defaults to 1)
+
+=cut
+
 sub increment_counter {
     my ($increment) = @_;
     if (defined($increment) && $increment gt 0) {
@@ -1000,6 +1034,14 @@ sub increment_counter {
     $Apache::lonxml::counter_changed=1;
 }
 
+=pod
+
+=item &init_counter($increment);
+
+Initialize the internal counter environment variable
+
+=cut
+
 sub init_counter {
     if ($env{'request.state'} eq 'construct') {
 	$Apache::lonxml::counter=1;
@@ -1202,7 +1244,7 @@ sub writeallows {
     my %httpref=();
     foreach (@extlinks) {
        $httpref{'httpref.'.
- 	        &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl;
+ 	        &Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl;
     }
     @extlinks=();
     &Apache::lonnet::appenv(%httpref);
@@ -1221,6 +1263,12 @@ sub do_registered_ssi {
 	&Apache::lonnet::ssi($url,%form);
     }
 }
+
+sub add_script_result {
+    my ($display) = @_;
+    push(@script_var_displays, $display);
+}
+
 #
 # Afterburner handles anchors, highlights and links
 #
@@ -1692,50 +1740,11 @@ sub get_param_var {
   }
 }
 
-sub register_insert_tab {
-  my @data = split /\n/, &Apache::lonnet::getfile('/home/httpd/lonTabs/insertlist.tab');
-  my $i;
-  my $tagnum=0;
-  my @order;
-  for ($i=0;$i < $#data; $i++) {
-    my $line = $data[$i];
-    if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
-    if ( $line =~ /TABLE/ ) { last; }
-    my ($tag,$descrip,$color,$function,$show,$helpfile,$helpdesc) = split(/,/, $line);
-    if ($tag) {
-      $insertlist{"$tagnum.tag"} = $tag;
-      $insertlist{"$tag.description"} = $descrip;
-      $insertlist{"$tag.color"} = $color;
-      $insertlist{"$tag.function"} = $function;
-      if (!defined($show)) { $show='yes'; }
-      $insertlist{"$tag.show"}= $show;
-      $insertlist{"$tag.helpfile"} = $helpfile;
-      $insertlist{"$tag.helpdesc"} = $helpdesc;
-      $insertlist{"$tag.num"}=$tagnum;
-      $tagnum++;
-    }
-  }
-  $i++; #skipping TABLE line
-  $tagnum = 0;
-  for (;$i < $#data;$i++) {
-    my $line = $data[$i];
-    my ($mnemonic,@which) = split(/ +/,$line);
-    my $tag = $insertlist{"$tagnum.tag"};
-    for (my $j=0;$j <=$#which;$j++) {
-      if ( $which[$j] eq 'Y' ) {
-	if ($insertlist{"$j.show"} ne 'no') {
-	  push(@{ $insertlist{"$tag.which"} },$insertlist{"$j.tag"});
-	}
-      }
-    }
-    $tagnum++;
-  }
-}
-
 sub register_insert_xml {
     my $parser = HTML::LCParser->new($Apache::lonnet::perlvar{'lonTabDir'}
 				     .'/insertlist.xml');
     my ($tagnum,$in_help)=(0,0);
+    my @alltags;
     my $tag;
     while (my $token = $parser->get_token()) {
 	if ($token->[0] eq 'S') {
@@ -1744,6 +1753,7 @@ sub register_insert_xml {
 		$tag = $token->[2]{'name'};
 		$insertlist{"$tagnum.tag"} = $tag;
 		$insertlist{"$tag.num"}   = $tagnum;
+		push(@alltags,$tag);
 	    } elsif ($in_help && $token->[1] eq 'file') {
 		$key = $tag.'.helpfile';
 	    } elsif ($in_help && $token->[1] eq 'description') {
@@ -1757,11 +1767,7 @@ sub register_insert_xml {
 	    } elsif ($token->[1] eq 'help') {
 		$in_help=1;
 	    } elsif ($token->[1] eq 'allow') {
-		my $allow = $parser->get_text();
-		foreach my $element (split(',',$allow)) {
-		    $element =~ s/(^\s*|\s*$ )//gx;
-		    push(@{ $insertlist{$tag.'.which'} },$element);
-		}
+		$key = $tag.'.allow';
 	    }
 	    if (defined($key)) {
 		$insertlist{$key} = $parser->get_text();
@@ -1776,12 +1782,22 @@ sub register_insert_xml {
 	    }
 	}
     }
+    
+    # parse the allows and ignore tags set to <show>no</show>
+    foreach my $tag (@alltags) {	
+        next if (!exists($insertlist{"$tag.allow"}));
+	my $allow =  $insertlist{"$tag.allow"};
+       	foreach my $element (split(',',$allow)) {
+	    $element =~ s/(^\s*|\s*$ )//gx;
+	    if (!exists($insertlist{"$element.show"})
+                || $insertlist{"$element.show"} ne 'no') {
+		push(@{ $insertlist{$tag.'.which'} },$element);
+	    }
+	}
+    }
 }
 
 sub register_insert {
-#    &register_insert_tab(@_);
-#    &dump_insertlist('1');
-#    undef(%insertlist);
     return &register_insert_xml(@_);
 #    &dump_insertlist('2');
 }