--- loncom/xml/lonxml.pm	2001/08/07 16:54:14	1.106
+++ loncom/xml/lonxml.pm	2001/08/17 19:50:28	1.117
@@ -13,7 +13,7 @@
 # 6/12,6/13 H. K. Ng
 # 6/16 Gerd Kortemeyer
 # 7/27 H. K. Ng
-# 8/7 Gerd Kortemeyer
+# 8/7,8/9,8/10,8/11,8/15,8/16,8/17 Gerd Kortemeyer
 
 package Apache::lonxml; 
 use vars 
@@ -97,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'},
@@ -107,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>';
           }
@@ -122,6 +152,42 @@ sub xmlend {
     return $discussion.'</html>';
 }
 
+sub maketoken {
+    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 $token=&Apache::lonnet::checkout($symb,$tuname,$tudom,$tcrsid);
+ 
+    unless ($token) { return ''; }
+
+    my %reply=&Apache::lonnet::get('environment',
+              ['firstname','middlename','lastname','generation'],
+              $tudom,$tuname);
+    my $plainname=$reply{'firstname'}.' '. 
+                  $reply{'middlename'}.' '.
+                  $reply{'lastname'}.' '.
+		  $reply{'generation'};
+
+    if ($target eq 'web') {
+	return 
+ '<img align="right" src="/cgi-bin/barcode.gif?encode='.$token.'" />'.
+               'Checked out for '.$plainname.
+               '<br />User: '.$tuname.' at '.$tudom.
+	       '<br />CourseID: '.$tcrsid.
+               '<br />DocID: '.$token.
+               '<br />Time: '.localtime().'<hr />';
+    } else {
+        return $token;                         
+    }
+}
+
 sub fontsettings() {
     my $headerstring='';
     if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) { 
@@ -172,6 +238,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)');
@@ -200,7 +268,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);
 
       }
@@ -284,19 +352,20 @@ sub xmlparse {
 }
 
 sub htmlclean {
-    my $raw=shift;
+    my ($raw,$full)=@_;
 
     my $tree = HTML::TreeBuilder->new;
     $tree->ignore_unknown(0);
     
     $tree->parse($raw);
-    my %emptyhash=();
 
-    my $output= $tree->as_HTML(undef,' ',\%emptyhash), "\n";
+    my $output= $tree->as_HTML(undef,' ');
      
-    $output=~s/\<(br|hr|img)([^\>\/]*)\>/\<$1$2 \/\>/gis;
-    $output=~s/\<\/(br|hr|img)\>//gis;
-    $output=~s/\<[\/]*(body|head|html)\>//gis;
+    $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;
 
@@ -744,6 +813,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=();
@@ -831,7 +903,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;
@@ -862,7 +936,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'});
       }
   }
@@ -882,6 +956,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);
   }