--- loncom/interface/lonmeta.pm	2002/10/20 18:40:00	1.23
+++ loncom/interface/lonmeta.pm	2003/07/15 19:04:31	1.33
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Metadata display handler
 #
-# $Id: lonmeta.pm,v 1.23 2002/10/20 18:40:00 www Exp $
+# $Id: lonmeta.pm,v 1.33 2003/07/15 19:04:31 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -51,10 +51,13 @@ sub dynamicmeta {
     $regexp='___'.$regexp.'___';
     my %evaldata=&Apache::lonnet::dump('nohist_resevaldata',$adomain,
 				       $aauthor,$regexp);
-    my %sum;
-    my %cnt;
+    my %sum=();
+    my %cnt=();
+    my %concat=();
     my %listitems=('count'        => 'add',
                    'course'       => 'add',
+                   'goto'         => 'add',
+                   'comefrom'     => 'add',
                    'avetries'     => 'avg',
                    'stdno'        => 'add',
                    'difficulty'   => 'avg',
@@ -67,21 +70,24 @@ sub dynamicmeta {
                    'usage'        => 'cnt'
                    );
     foreach (keys %evaldata) {
-	$_=~/___(\w+)$/;
-        if (defined($cnt{$1})) { $cnt{$1}++; } else { $cnt{$1}=1; }
-        unless ($listitems{$1} eq 'app') {
-            if (defined($sum{$1})) {
-               $sum{$1}+=$evaldata{$_};
+	my ($item,$purl,$cat)=split(/\_\_\_/,$_);
+###	print "\n".$_.' - '.$item.'<br />';
+        if (defined($cnt{$cat})) { $cnt{$cat}++; } else { $cnt{$cat}=1; }
+        unless ($listitems{$cat} eq 'app') {
+            if (defined($sum{$cat})) {
+               $sum{$cat}+=$evaldata{$_};
+               $concat{$cat}.=','.$item;
 	    } else {
-               $sum{$1}=$evaldata{$_};
+               $sum{$cat}=$evaldata{$_};
+               $concat{$cat}=$item;
 	    }
         } else {
-            if (defined($sum{$1})) {
+            if (defined($sum{$cat})) {
                if ($evaldata{$_}) {
-                  $sum{$1}.='<hr>'.$evaldata{$_};
+                  $sum{$cat}.='<hr>'.$evaldata{$_};
 	       }
  	    } else {
-	       $sum{$1}=''.$evaldata{$_};
+	       $sum{$cat}=''.$evaldata{$_};
 	    }
 	}
     }
@@ -94,10 +100,38 @@ sub dynamicmeta {
        } else {
            $returnhash{$_}=$sum{$_};
        }
+       $returnhash{$_.'_list'}=$concat{$_};
+### print "\n<hr />".$_.': '.$returnhash{$_}.'<br />'.$returnhash{$_.'_list'};
     }
     return %returnhash;
 }
 
+# ------------------------------------- Try to make an alt tag if there is none
+
+sub alttag {
+    my ($base,$src)=@_;
+    my $fullpath=&Apache::lonnet::hreflocation($base,$src);
+    my $alttag=&Apache::lonnet::metadata($fullpath,'title').' '.
+               &Apache::lonnet::metadata($fullpath,'subject').' '.
+               &Apache::lonnet::metadata($fullpath,'abstract');
+    $alttag=~s/\s+/ /gs;
+    $alttag=~s/\"//gs;
+    $alttag=~s/\'//gs;
+    $alttag=~s/\s+$//gs;
+    $alttag=~s/^\s+//gs;
+    if ($alttag) { return $alttag; } else 
+                 { return 'No information available'; }
+}
+
+# -------------------------------------------------------------- Author display
+
+sub authordisplay {
+    my ($aname,$adom)=@_;
+    return &Apache::loncommon::aboutmewrapper(
+                &Apache::loncommon::plainname($aname,$adom),
+                    $aname,$adom).' <tt>['.$aname.'@'.$adom.']</tt>';
+}
+
 # -------------------------------------------------------------- Pretty display
 
 sub evalgraph {
@@ -193,6 +227,10 @@ my $mime=&Apache::loncommon::filedescrip
 my $disuri=&Apache::lonnet::declutter($uri);
   $disuri=~s/\.meta$//;
 my $currentversion=&Apache::lonnet::getversion($disuri);
+my $author=$content{'author'};
+$author=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;
+my $owner=$content{'owner'};
+$owner=~s/(\w+)(\:|\@)(\w+)/&authordisplay($1,$3)/gse;
 my $versiondisplay='';
 if ($thisversion) {
     $versiondisplay='Version: '.$thisversion.
@@ -200,6 +238,11 @@ if ($thisversion) {
 } else {
     $versiondisplay='Version: '.$currentversion;
 }
+my $customdistributionfile='';
+if ($content{'customdistributionfile'}) {
+   $customdistributionfile='<a href="'.$content{'customdistributionfile'}.
+     '"><tt>'.$content{'customdistributionfile'}.'</tt></a>';
+}
 my $bodytag=&Apache::loncommon::bodytag
             ('Catalog Information','','','',$resdomain);
   $r->print(<<ENDHEAD);
@@ -210,7 +253,7 @@ $bodytag
 $versiondisplay<br />
 <table cellspacing=2 border=0>
 <tr><td bgcolor='#AAAAAA'>Author(s)</td>
-<td bgcolor="#CCCCCC">$content{'author'}&nbsp;</td></tr>
+<td bgcolor="#CCCCCC">$author&nbsp;</td></tr>
 <tr><td bgcolor='#AAAAAA'>Subject</td>
 <td bgcolor="#CCCCCC">$content{'subject'}&nbsp;</td></tr>
 <tr><td bgcolor='#AAAAAA'>Keyword(s)</td>
@@ -228,9 +271,11 @@ $versiondisplay<br />
 <tr><td bgcolor='#AAAAAA'>
 Last Revision Date</td><td bgcolor="#CCCCCC">$lastrevisiondate&nbsp;</td></tr>
 <tr><td bgcolor='#AAAAAA'>Publisher/Owner</td>
-<td bgcolor="#CCCCCC">$content{'owner'}&nbsp;</td></tr>
+<td bgcolor="#CCCCCC">$owner&nbsp;</td></tr>
 <tr><td bgcolor='#AAAAAA'>Copyright/Distribution</td>
-<td bgcolor="#CCCCCC">$content{'copyright'}
+<td bgcolor="#CCCCCC">$content{'copyright'}&nbsp;</td></tr>
+<tr><td bgcolor='#AAAAAA'>Custom Distribution File</td>
+<td bgcolor="#CCCCCC">$customdistributionfile&nbsp;</td></tr>
 </table>
 ENDHEAD
   delete($content{'title'});
@@ -245,6 +290,7 @@ ENDHEAD
   delete($content{'lastrevisiondate'});
   delete($content{'owner'});
   delete($content{'copyright'});
+  delete($content{'customdistributionfile'});
   if ($ENV{'user.adv'}) {
 # ------------------------------------------------------------ Dynamic Metadata
    $r->print(
@@ -254,6 +300,8 @@ ENDHEAD
  'count'      => 'Network-wide number of accesses (hits)',
  'course'     => 'Network-wide number of courses using resource',
  'usage'      => 'Number of resources using or importing resource',
+ 'goto'       => 'Number of resources that follow this resource in maps',
+ 'comefrom'   => 'Number of resources that lead up to this resource in maps',
  'clear'      => 'Material presented in clear way',
  'depth'      => 'Material covered with sufficient depth',
  'helpful'    => 'Material is helpful',
@@ -265,11 +313,31 @@ ENDHEAD
    my %dynmeta=&dynamicmeta($uri);
    $r->print(
 '</table><h4>Access and Usage Statistics</h4><table cellspacing=2 border=0>');
-   foreach ('count','usage','course') {
+   foreach ('count') {
        $r->print(
 '<tr><td bgcolor="#AAAAAA">'.$items{$_}.'</td><td bgcolor="#CCCCCC">'.
 $dynmeta{$_}."&nbsp;</td></tr>\n");
    }
+   foreach my $cat ('usage','comefrom','goto') {
+       $r->print(
+'<tr><td bgcolor="#AAAAAA">'.$items{$cat}.'</td><td bgcolor="#CCCCCC">'.
+$dynmeta{$cat}.'<font size="-1"><ul>'.join("\n",
+      map { my $murl=$_; 
+ '<li><a href="'.&Apache::lonnet::clutter($murl).'" target="preview">'.
+                        &Apache::lonnet::gettitle($murl).' [<tt>'.$murl
+                        .'</tt>]</a></li>' }
+      split(/\,/,$dynmeta{$cat.'_list'}))."</ul></font></td></tr>\n");
+   }
+   foreach my $cat ('course') {
+       $r->print(
+'<tr><td bgcolor="#AAAAAA">'.$items{$cat}.'</td><td bgcolor="#CCCCCC">'.
+$dynmeta{$cat}.'<font size="-1"><ul>'.join("\n",
+      map { my %courseinfo=&Apache::lonnet::coursedescription($_);  
+ '<li><a href="/public/'.
+  $courseinfo{'domain'}.'/'.$courseinfo{'num'}.'/syllabus" target="preview">'.
+  $courseinfo{'description'}.'</a></li>' }
+      split(/\,/,$dynmeta{$cat.'_list'}))."</ul></font></td></tr>\n");
+   }
        $r->print('</table>');
    if ($uri=~/\.(problem|exam|quiz|assess|survey|form)\.meta$/) {
       $r->print(
@@ -303,7 +371,7 @@ $dynmeta{$_}."&nbsp;</td></tr>\n");
    '<h4>Error Messages (visible to author and co-authors only)</h4>');
       my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$1,$2);
       foreach (keys %errormsgs) {
-	if ($_=~/^$disuri\_\d+$/) {
+	if ($_=~/^\Q$disuri\E\_\d+$/) {
           my %content=&Apache::lonmsg::unpackagemsg($errormsgs{$_});
 	  $r->print('<b>'.$content{'time'}.'</b>: '.$content{'message'}.
                     '<br />');
@@ -315,20 +383,22 @@ $dynmeta{$_}."&nbsp;</td></tr>\n");
  '<h3>Additional Metadata (non-standard, parameters, exports)</h3>');
    foreach (sort keys %content) {
       my $name=$_;
-      my $display=&Apache::lonnet::metadata($uri,$name.'.display');
-      unless ($display) { $display=$name; };
-      my $otherinfo='';
-      foreach ('name','part','type','default') {
-          if (defined(&Apache::lonnet::metadata($uri,$name.'.'.$_))) {
-             $otherinfo.=' '.$_.'='.
-		 &Apache::lonnet::metadata($uri,$name.'.'.$_).'; ';
-          }
-      }
-      $r->print('<b>'.$display.':</b> '.$content{$name});
-      if ($otherinfo) {
-         $r->print(' ('.$otherinfo.')');
+      unless ($name=~/\.display$/) {
+	  my $display=&Apache::lonnet::metadata($uri,$name.'.display');
+	  unless ($display) { $display=$name; };
+	  my $otherinfo='';
+	  foreach ('name','part','type','default') {
+	      if (defined(&Apache::lonnet::metadata($uri,$name.'.'.$_))) {
+		  $otherinfo.=' '.$_.'='.
+		      &Apache::lonnet::metadata($uri,$name.'.'.$_).'; ';
+	      }
+	  }
+	  $r->print('<b>'.$display.':</b> '.$content{$name});
+	  if ($otherinfo) {
+	      $r->print(' ('.$otherinfo.')');
+	  }
+	  $r->print("<br>\n");
       }
-      $r->print("<br>\n");
    }
   }
 # ===================================================== End Resource Space Call
@@ -360,13 +430,60 @@ $dynmeta{$_}."&nbsp;</td></tr>\n");
 <html><head><title>Edit Catalog Information</title></head>
 $bodytag
 <h1>$displayfile</h1>
+<form method="post">
 ENDEDIT
-   foreach (keys %Apache::lonpublisher::metadatafields) {
-       $r->print('<br />'.$_.' '.$Apache::lonpublisher::metadatafields{$_});
+   foreach ('author','title','subject','keywords','abstract','notes',
+            'copyright','customdistributionfile','language') {
+       if ($ENV{'form.new_'.$_}) {
+	   $Apache::lonpublisher::metadatafields{$_}=$ENV{'form.new_'.$_};
+       }
+       if (m/copyright/) {
+	   $r->print(&Apache::lonpublisher::selectbox($_,'new_'.$_,
+			       $Apache::lonpublisher::metadatafields{$_},
+			       \&Apache::loncommon::copyrightdescription,
+			       (&Apache::loncommon::copyrightids)));
+       } elsif (m/language/) {
+	   $r->print(&Apache::lonpublisher::selectbox($_,'new_'.$_,
+			      $Apache::lonpublisher::metadatafields{$_},
+			      \&Apache::loncommon::languagedescription,
+			      (&Apache::loncommon::languageids)));
+       } else {
+	   $r->print(&Apache::lonpublisher::textfield($_,'new_'.$_,
+			     $Apache::lonpublisher::metadatafields{$_}));
+       }
    }
- }
- $r->print('</body></html>');
- return OK;
+   if ($ENV{'form.store'}) {
+      my $mfh;
+      unless ($mfh=Apache::File->new('>'.$fn)) {
+            $r->print(
+            '<p><font color=red>Could not write metadata, FAIL</font>');
+      } else {
+          foreach (sort keys %Apache::lonpublisher::metadatafields) {
+            unless ($_=~/\./) {
+                my $unikey=$_;
+                $unikey=~/^([A-Za-z]+)/;
+                my $tag=$1;
+                $tag=~tr/A-Z/a-z/;
+                print $mfh "\n\<$tag";
+                foreach 
+                  (split(/\,/,$Apache::lonpublisher::metadatakeys{$unikey})) {
+                    my $value=
+                       $Apache::lonpublisher::metadatafields{$unikey.'.'.$_};
+                    $value=~s/\"/\'\'/g;
+                    print $mfh ' '.$_.'="'.$value.'"';
+                }
+                print $mfh '>'.
+        &HTML::Entities::encode($Apache::lonpublisher::metadatafields{$unikey})
+                        .'</'.$tag.'>';
+            }
+	  }
+          $r->print('<p>Wrote Metadata');
+      }
+    }
+    $r->print(
+ '<br /><input type="submit" name="store" value="Store Catalog Information"></form></body></html>');
+    return OK;
+  }
 }
 
 1;