--- loncom/xml/lonxml.pm	2001/08/06 19:44:54	1.105
+++ loncom/xml/lonxml.pm	2001/08/15 14:03:03	1.112
@@ -13,12 +13,14 @@
 # 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 Gerd Kortemeyer
 
 package Apache::lonxml; 
 use vars 
 qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace);
 use strict;
 use HTML::TokeParser;
+use HTML::TreeBuilder;
 use Safe;
 use Safe::Hole;
 use Math::Cephes qw(:trigs :hypers :bessels erf erfc);
@@ -95,6 +97,12 @@ sub xmlbegin {
 sub xmlend {
     my $discussion='';
     if ($ENV{'request.course.id'}) {
+       my $crs='/'.$ENV{'request.course.id'};
+       if ($ENV{'request.course.sec'}) {
+          $crs.='_'.$ENV{'request.course.sec'};
+       }                 
+       $crs=~s/\_/\//g;
+       my $seeid=&Apache::lonnet::allowed('rin',$crs);
        my $symb=&Apache::lonnet::symbread();
        if ($symb) {
           my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
@@ -105,13 +113,37 @@ sub xmlend {
                   '<address><hr /><h2>Course Discussion of Resource</h2>';
               my $idx;
               for ($idx=1;$idx<=$contrib{'version'};$idx++) {
-                  my $message=$contrib{$idx.':message'};
-                  $message=~s/\n/\<br \/\>/g;
-		  $discussion.='<p><b>'.$contrib{$idx.':sendername'}.' at '.
-		      $contrib{$idx.':senderdomain'}.'</b> ('.
+		my $hidden=($contrib{'hidden'}=~/\.$idx\./);
+		unless (($hidden) && (!$seeid)) {
+                 my $message=$contrib{$idx.':message'};
+                 $message=~s/\n/\<br \/\>/g;
+                 if ($message) {
+                  if ($hidden) {
+		      $message='<font color="#888888">'.$message.'</font>';
+                  }
+                  my $sender='Anonymous';
+                  if ((!$contrib{$idx.':anonymous'}) || ($seeid)) {
+                      $sender=$contrib{$idx.':sendername'}.' at '.
+		      $contrib{$idx.':senderdomain'};
+                      if ($contrib{$idx.':anonymous'}) {
+			  $sender.=' (anonymous)';
+                      }
+                      if ($seeid) {
+			  if ($hidden) {
+                             $sender.=' <a href="/adm/feedback?unhide='.
+				 $symb.':::'.$idx.'">Make Visible</a>';
+                          } else {
+                             $sender.=' <a href="/adm/feedback?hide='.
+				 $symb.':::'.$idx.'">Hide</a>';
+			  }
+                      }                   
+                  }
+		  $discussion.='<p><b>'.$sender.'</b> ('.
                       localtime($contrib{$idx.':timestamp'}).
                       '):<blockquote>'.$message.
-                      '</blockquote></p>'; 
+                      '</blockquote></p>';
+	        }
+               } 
               }
               $discussion.='</address>';
           }
@@ -120,6 +152,39 @@ sub xmlend {
     return $discussion.'</html>';
 }
 
+sub checkout {
+    my ($target,$symb,$tuname,$tudom,$tcrsid)=@_;
+    unless ($symb) {
+	$symb=&Apache::lonnet::symbread();
+    }
+    unless ($tuname) {
+	$tuname=$ENV{'user.name'};
+        $tudom=$ENV{'user.domain'};
+        $tcrsid=$ENV{'request.course.id'};
+    }
+    my $lonhost = $Apache::lonnet::perlvar{'lonHostID'};
+    my $infostr=&Apache::lonnet::escape(
+                 $tuname.'&'.
+                 $tudom.'&'.
+                 $tcrsid.'&'.
+                 $symb.'&'.
+		 time.'&'.$ENV{'REMOTE_ADDR'});
+    my $token=Apache::lonnet::reply('tmpput:'.$infostr,$lonhost);
+    if ($token=~/^error\:/) { return ''; }
+    $token=~s/^(\d+)\_.*\_(\d+)$/$1\_$2\_$lonhost/;
+    if (&Apache::lonnet::log($tudom,$tuname,
+                         &Apache::lonnet::homeserver($tuname,$tudom),
+                         &Apache::lonnet::escape('Checkout '.$infostr.' - '.
+                                                 $token)) ne 'ok') {
+	return '';
+    }
+    if ($target eq 'web') {
+	return '<img src="/cgi-bin/barcode.gif?encode='.$token.'" />';
+    } else {
+        return $token;                         
+    }
+}
+
 sub fontsettings() {
     my $headerstring='';
     if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) { 
@@ -170,6 +235,8 @@ ENDPARM
           menu.currentStale=0;
           menu.clearbut(3,1);
           menu.switchbutton
+       (6,3,'catalog.gif','catalog','info','catalog_info()');
+          menu.switchbutton
        (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)');
           menu.switchbutton
     (8,2,'fdbk.gif','feedback','on this','gopost("/adm/feedback",currentURL)');
@@ -198,7 +265,7 @@ ENDPARM
           menu.clearbut(7,3);
           menu.menucltim=menu.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(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3)',
 			  2000);
 
       }
@@ -281,6 +348,27 @@ sub xmlparse {
  return $finaloutput;
 }
 
+sub htmlclean {
+    my ($raw,$full)=@_;
+
+    my $tree = HTML::TreeBuilder->new;
+    $tree->ignore_unknown(0);
+    
+    $tree->parse($raw);
+
+    my $output= $tree->as_HTML(undef,' ');
+     
+    $output=~s/\<(br|hr|img|meta|allow)([^\>\/]*)\>/\<$1$2 \/\>/gis;
+    $output=~s/\<\/(br|hr|img|meta|allow)\>//gis;
+    unless ($full) {
+       $output=~s/\<[\/]*(body|head|html)\>//gis;
+    }
+
+    $tree = $tree->delete;
+
+    return $output;
+}
+
 sub inner_xmlparse {
   my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
   &Apache::lonxml::debug('Reentrant parser starting, again?');
@@ -722,6 +810,9 @@ sub parstring {
 
 sub writeallows {
     my $thisurl='/res/'.&Apache::lonnet::declutter(shift);
+    if ($ENV{'httpref.'.$thisurl}) {
+	$thisurl=$ENV{'httpref.'.$thisurl};
+    }
     my $thisdir=$thisurl;
     $thisdir=~s/\/[^\/]+$//;
     my %httpref=();
@@ -809,7 +900,9 @@ SIMPLECONTENT
 <form method="post">
 <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>
 <br />
-<input type="submit" name="savethisfile" value="Save this file" />
+<input type="submit" name="attemptclean" 
+       value="Save and then attempt to clean HTML" />
+<input type="submit" name="savethisfile" value="Save this" />
 </form>
 ENDFOOTER
       $result=~s/(\<body[^\>]*\>)/$1$editheader/is;
@@ -840,7 +933,7 @@ sub handler {
 # Edit action? Save file.
 #
   unless ($ENV{'request.state'} eq 'published') {
-      if ($ENV{'form.savethisfile'}) {
+      if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
 	  &storefile($file,$ENV{'form.filecont'});
       }
   }
@@ -860,6 +953,11 @@ sub handler {
 ENDNOTFOUND
     $filecontents='';
   } else {
+      unless ($ENV{'request.state'} eq 'published') {
+         if ($ENV{'form.attemptclean'}) {
+	    $filecontents=&htmlclean($filecontents,1);
+         }
+      }
     $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);
   }