--- loncom/xml/lonxml.pm	2002/12/09 22:40:18	1.220
+++ loncom/xml/lonxml.pm	2003/02/14 15:14:37	1.233
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.220 2002/12/09 22:40:18 albertel Exp $
+# $Id: lonxml.pm,v 1.233 2003/02/14 15:14:37 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -41,7 +41,6 @@
 # 6/1/1 Gerd Kortemeyer
 # 2/21,3/13 Guy
 # 3/29,5/4 Gerd Kortemeyer
-# 5/10 Scott Harrison
 # 5/26 Gerd Kortemeyer
 # 5/27 H. K. Ng
 # 6/2,6/3,6/8,6/9 Gerd Kortemeyer
@@ -146,7 +145,7 @@ $Apache::lonxml::registered=0;
 $Apache::lonxml::request='';
 
 # a problem number counter, and check on ether it is used
-$Apache::lonxml::counter=1;
+$Apache::lonxml::counter=4;
 $Apache::lonxml::counter_changed=0;
 
 #internal check on whether to look at style defs
@@ -192,7 +191,8 @@ sub xmlend {
               my $idx;
               for ($idx=1;$idx<=$contrib{'version'};$idx++) {
 		my $hidden=($contrib{'hidden'}=~/\.$idx\./);
-		unless (($hidden) && (!$seeid)) {
+		my $deleted=($contrib{'deleted'}=~/\.$idx\./);
+		unless ((($hidden) && (!$seeid)) || ($deleted)) {
                  my $message=$contrib{$idx.':message'};
                  $message=~s/\n/\<br \/\>/g;
 		 $message=&Apache::lontexconvert::msgtexconverted($message);
@@ -226,8 +226,10 @@ sub xmlend {
                           } else {
                              $sender.=' <a href="/adm/feedback?hide='.
 				 $symb.':::'.$idx.'">Hide</a>';
-			  }
-                      }                   
+			  }                     
+                          $sender.=' <a href="/adm/feedback?deldisc='.
+				 $symb.':::'.$idx.'">Delete</a>';
+                      }
                   } else {
                       if ($screenname) {
 			  $sender='<i>'.$screenname.'</i>';
@@ -268,7 +270,7 @@ sub tokeninputfield {
     my $defhost=$Apache::lonnet::perlvar{'lonHostID'};
     $defhost=~tr/a-z/A-Z/;
     return (<<ENDINPUTFIELD)
-<script>
+<script type="text/javascript">
     function updatetoken() {
 	var comp=new Array;
         var barcode=unescape(document.tokeninput.barcode.value);
@@ -352,7 +354,7 @@ sub printtokenheader {
     if ($target eq 'web') {
         my %idhash=&Apache::lonnet::idrget($tudom,($tuname));
 	return 
- '<img align="right" src="/cgi-bin/barcode.gif?encode='.$token.'" />'.
+ '<img align="right" src="/cgi-bin/barcode.png?encode='.$token.'" />'.
                'Checked out for '.$plainname.
                '<br />User: '.$tuname.' at '.$tudom.
 	       '<br />ID: '.$idhash{$tuname}.
@@ -374,62 +376,50 @@ sub fontsettings() {
     return $headerstring;
 }
 
-
-##
-## switchmenu - modeled on lonmenu::switchmenu, but better. 
-## Helper function for registerurl
-##
-sub switchmenu {
-    my ($row,$col,$imgsrc,$texttop,$textbot,$action,$description)=@_;
-    return(<<ENDSMENU);
-    menu.switchbutton($row,$col,'$imgsrc','$texttop','$textbot','$action','$description');
-ENDSMENU
-}
-
 sub registerurl {
     my $forcereg=shift;
     my $target = shift;
     my $result = '';
     
     if ($target eq 'edit') {
-        $result .="<script>\n".
-            "if (typeof menu != 'undefined') {menu.currentURL=null;}\n".
+        $result .="<script type=\"text/javascrtipt\">\n".
+            "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
             &Apache::loncommon::browser_and_searcher_javascript().
                 "\n</script>\n";
     }
-    if ((($ENV{'request.publicaccess'}) || 
+    if (($ENV{'browser.interface'} eq 'textual') ||
+        ((($ENV{'request.publicaccess'}) || 
          (!&Apache::lonnet::is_on_map($ENV{'REQUEST_URI'}))) &&
-        (!$forcereg)) {
+        (!$forcereg))) {
 	return $result.
-         '<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>';
+         '<script type="text/javascript">function LONCAPAreg(){;} function LONCAPAstale(){}</script>';
     }
     if ($Apache::lonxml::registered && !$forcereg) { return ''; }
     $Apache::lonxml::registered=1;
-    my $nothing='';
-    if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; }
+    my $reopen=&Apache::lonmenu::reopenmenu();
     my $newmail='';
     if (&Apache::lonmsg::newmail()) { 
-       $newmail='menu.setstatus("you have","messages");';
+       $newmail='swmenu.setstatus("you have","messages");';
     }
-    my $timesync='menu.syncclock(1000*'.time.');';
+    my $timesync='swmenu.syncclock(1000*'.time.');';
     if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
         my $hwkadd='';
         if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
 	    if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
 		$hwkadd.=(<<ENDSUBM);
-                     menu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")',
+                     swmenu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")',
                      'View user submissions for this assessment resource');
 ENDSUBM
             }
 	    if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) {
 		$hwkadd.=(<<ENDGRDS);
-                     menu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")',
+                     swmenu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")',
                      'Modify user grades for this assessment resource');
 ENDGRDS
             }
 	    if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
 		$hwkadd.=(<<ENDPARM);
-                     menu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")',
+                     swmenu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")',
                      'Modify deadlines, etc, for this assessment resource');
 ENDPARM
             }
@@ -451,14 +441,14 @@ ENDPARM
                 if ($ENV{'request.role'} =~ /^ca/) { 
                     ($cadom,$caname)=($ENV{'request.role'}=~/(\w+)\/(\w+)$/);
                     ($top,$bottom) = ('co con-','struct');
-                    $action = 'go("/priv/'.$caname.'");';
+                    $action = "go('/priv/".$caname."');";
                     $desc = "Enter construction space as co-author";
                 }
                 # Check that we are on the correct machine
                 my $home = &Apache::lonnet::homeserver($caname,$cadom);
                 if ($home eq $Apache::lonnet::perlvar{'lonHostID'}) {
-                    $editbutton=&switchmenu
-                        (6,1,$top,,$bottom,$action,$desc);
+                    $editbutton=&Apache::lonmenu::switch
+                        ('','',6,1,$top,,$bottom,$action,$desc);
                 }
             }
             ##
@@ -481,11 +471,11 @@ ENDPARM
             }        
             # Finally, turn the button on or off
             if ($cfile) {
-                $editbutton=&switchmenu
-                    (6,1,'cstr.gif','edit','resource',
-                     'go("'.$cfile.'");',"Edit this resource");
+                $editbutton=&Apache::lonmenu::switch
+                    ('','',6,1,'cstr.gif','edit','resource',
+                     "go('".$cfile."');","Edit this resource");
             } elsif ($editbutton eq '') {
-                $editbutton = '    menu.clearbut(6,1);';
+                $editbutton = '    swmenu.clearbut(6,1);';
             }
         }
         ###
@@ -496,49 +486,49 @@ ENDPARM
 // BEGIN LON-CAPA Internal
 
     function LONCAPAreg() {
-	  menu=window.open("$nothing","LONCAPAmenu","",false);
-          menu.clearTimeout(menu.menucltim);
+	  swmenu=$reopen;
+          swmenu.clearTimeout(swmenu.menucltim);
           $timesync
           $newmail
-	  menu.currentURL=window.location.pathname;
-          menu.reloadURL=window.location.pathname;
-          menu.currentSymb="$ENV{'request.symb'}";
-          menu.reloadSymb="$ENV{'request.symb'}";
-          menu.currentStale=0;
-          menu.clearbut(3,1);
-          menu.switchbutton
-       (6,3,'catalog.gif','catalog','info','catalog_info()');
-          menu.switchbutton
+	  swmenu.currentURL=window.location.pathname;
+          swmenu.reloadURL=window.location.pathname;
+          swmenu.currentSymb="$ENV{'request.symb'}";
+          swmenu.reloadSymb="$ENV{'request.symb'}";
+          swmenu.currentStale=0;
+          swmenu.clearbut(3,1);
+          swmenu.switchbutton
+       (6,3,'catalog.gif','catalog','info','catalog_info()','Show catalog information');
+          swmenu.switchbutton
        (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)','Provide my evaluation of this resource');
-          menu.switchbutton
+          swmenu.switchbutton
     (8,2,'fdbk.gif','feedback','discuss','gopost("/adm/feedback",currentURL)','Provide feedback messages or contribute to the course discussion about this resource');
-          menu.switchbutton
+          swmenu.switchbutton
      (8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)','Prepare a printable document');
-          menu.switchbutton
+          swmenu.switchbutton
        (2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)','Go to the previous resource in the course sequence');
-          menu.switchbutton
+          swmenu.switchbutton
      (2,3,'forw.gif','forward','','gopost("/adm/flip","forward:"+currentURL)','Go to the next resource in the course sequence');
-          menu.switchbutton
+          swmenu.switchbutton
                             (9,1,'sbkm.gif','set','bookmark','set_bookmark()','Set a bookmark for this resource');
-          menu.switchbutton
+          swmenu.switchbutton
                          (9,2,'vbkm.gif','view','bookmark','edit_bookmarks()','Use or edit my bookmark collection');
-          menu.switchbutton
+          swmenu.switchbutton
                                (9,3,'anot.gif','anno-','tations','annotate()','Make notes and annotations about this resource');
           $hwkadd
           $editbutton
     }
 
     function LONCAPAstale() {
-	  menu=window.open("$nothing","LONCAPAmenu","",false);
-          menu.currentStale=1;
-          if (menu.reloadURL!='' && menu.reloadURL!= null) { 
-             menu.switchbutton
+	  swmenu=$reopen
+          swmenu.currentStale=1;
+          if (swmenu.reloadURL!='' && swmenu.reloadURL!= null) { 
+             swmenu.switchbutton
              (3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence');
 	  }
-          menu.clearbut(7,1);
-          menu.clearbut(7,2);
-          menu.clearbut(7,3);
-          menu.menucltim=menu.setTimeout(
+          swmenu.clearbut(7,1);
+          swmenu.clearbut(7,2);
+          swmenu.clearbut(7,3);
+          swmenu.menucltim=swmenu.setTimeout(
  'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
  'clearbut(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3);clearbut(6,1)',
 			  2000);
@@ -556,19 +546,19 @@ ENDREGTHIS
 // BEGIN LON-CAPA Internal
 
     function LONCAPAreg() {
-	  menu=window.open("$nothing","LONCAPAmenu","",false);
+	  swmenu=$reopen
           $timesync
-          menu.currentStale=1;
-          menu.clearbut(2,1);
-          menu.clearbut(2,3);
-          menu.clearbut(8,1);
-          menu.clearbut(8,2);
-          menu.clearbut(8,3);
-          if (menu.currentURL) {
-             menu.switchbutton
+          swmenu.currentStale=1;
+          swmenu.clearbut(2,1);
+          swmenu.clearbut(2,3);
+          swmenu.clearbut(8,1);
+          swmenu.clearbut(8,2);
+          swmenu.clearbut(8,3);
+          if (swmenu.currentURL) {
+             swmenu.switchbutton
               (3,1,'reload.gif','return','location','go(currentURL)');
  	  } else {
-	      menu.clearbut(3,1);
+	      swmenu.clearbut(3,1);
           }
     }
 
@@ -602,6 +592,9 @@ sub xmlparse {
  my ($request,$target,$content_file_string,$safeinit,%style_for_target) = @_;
 
  &setup_globals($request,$target);
+ &Apache::inputtags::initialize_inputtags();
+ &Apache::outputtags::initialize_outputtags();
+ &Apache::edit::initialize_edit();
 #
 # do we have a course style file?
 #
@@ -667,18 +660,24 @@ sub htmlclean {
 }
 
 sub latex_special_symbols {
-    my ($current_token,$stack,$parstack)=@_;
-    $current_token=~s/\\ /\\char92 /g;
-    $current_token=~s/\^/\\char94 /g;
-    $current_token=~s/\~/\\char126 /g;
-    $current_token=~s/(&[^a-z\#])/\\$1/g;
-    $current_token=~s/([^&])\#/$1\\#/g;
-    $current_token=~s/(\$|_|{|})/\\$1/g;
-    $current_token=~s/\\char92 /\\texttt{\\char92}/g;
-    $current_token=~s/>/\$>\$/g; #more
-    $current_token=~s/</\$<\$/g; #less
-    if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
-    if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
+    my ($current_token,$stack,$parstack,$where)=@_;
+    if ($where=='header') {
+      $current_token =~ s/_/ /g;
+      $current_token =~ s/\^/ /g;
+      $current_token =~ s/&/\\&/g;
+    } else {
+     $current_token=~s/\\ /\\char92 /g;
+     $current_token=~s/\^/\\char94 /g;
+     $current_token=~s/\~/\\char126 /g;
+     $current_token=~s/(&[^a-z\#])/\\$1/g;
+     $current_token=~s/([^&])\#/$1\\#/g;
+     $current_token=~s/(\$|_|{|})/\\$1/g;
+     $current_token=~s/\\char92 /\\texttt{\\char92}/g;
+     $current_token=~s/>/\$>\$/g; #more
+     $current_token=~s/</\$<\$/g; #less
+     if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
+     if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
+    }
     return $current_token;
 }
 
@@ -771,7 +770,7 @@ sub inner_xmlparse {
       if ($token->[0] eq 'E') { 
 	&end_tag($stack,$parstack,$token);
       }
-    }
+    }	
     if ($#$pars > -1) {
 	pop @$pars;
 	pop @Apache::lonxml::pwd;
@@ -1113,7 +1112,9 @@ sub store_counter {
 sub get_all_text {
  my($tag,$pars)= @_;
  &Apache::lonxml::debug("Got a ".ref($pars));
+ my $gotfullstack=1;
  if (ref($pars) ne 'ARRAY') {
+     $gotfullstack=0;
      $pars=[$pars];
  }
  my $depth=0;
@@ -1122,7 +1123,8 @@ sub get_all_text {
  if ( $tag =~ m:^/: ) { 
    my $tag=substr($tag,1); 
    #&Apache::lonxml::debug("have:$tag:");
-   while (($depth >=0) && ($#$pars > -1)) {
+   my $top_empty=0;
+   while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) {
      while (($depth >=0) && ($token = $$pars[-1]->get_token)) {
        #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd);
        if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
@@ -1140,11 +1142,21 @@ sub get_all_text {
 	 }
        }
      }
+     if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; }
      if (($depth >=0) && ($#$pars > 0) ) {
        pop(@$pars);
        pop(@Apache::lonxml::pwd);
      }
    }
+   if ($top_empty && $depth >= 0) {
+       #never found the end tag ran out of text, throw error send back blank
+       &error('Never found end tag for &lt;'.$tag.'&gt;');
+       if ($gotfullstack) {
+	   my $newstring='</'.$tag.'>'.$result;
+	   &Apache::lonxml::newparser($pars,\$newstring);
+       }
+       $result='';
+   }
  } else {
      while ($#$pars > -1) {
 	 while ($token = $$pars[-1]->get_token) {
@@ -1196,7 +1208,7 @@ sub parstring {
   foreach (@{$token->[3]}) {
     unless ($_=~/\W/) {
       my $val=$token->[2]->{$_};
-      $val =~ s/([\%\@\\\"])/\\$1/g;
+      $val =~ s/([\%\@\\\"\'])/\\$1/g;
       #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
       $temp .= "my \$$_=\"$val\";"
     }
@@ -1250,7 +1262,7 @@ sub afterburn {
         $matchthis=~s/\_+/\\s\+/g;
         $result=~s/($matchthis)/\<a name=\"$anchorname\"\>$1\<\/a\>/s;
         $result.=(<<"ENDSCRIPT");
-<script>
+<script type="text/javascript">
     document.location.hash='$anchorname';
 </script>
 ENDSCRIPT
@@ -1486,14 +1498,22 @@ sub get_param_var {
   if ( ! $context ) { $context = -1; }
   my $args ='';
   if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; }
+  &Apache::lonxml::debug("Args are $args param is $param");
   if ($case_insensitive) {
       if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) {
 	  return undef;
       }
   } elsif ( $args !~ /my \$\Q$param\E=\"/ ) { return undef; }
   my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #'
-  if ($value =~ /^[\$\@\%]/) {
-    return &Apache::run::run("return $value",$safeeval,1);
+  &Apache::lonxml::debug("first run is $value");
+  if ($value =~ /^[\$\@\%]\w+$/) {
+      &Apache::lonxml::debug("doing second");
+      my @result=&Apache::run::run("return $value",$safeeval,1);
+      if (!defined($result[0])) {
+	  return $value
+      } else {
+	  if (wantarray) { return @result; } else { return $result[0]; }
+      }
   } else {
     return $value;
   }