--- loncom/lonnet/perl/lonnet.pm	2001/08/07 09:47:53	1.140
+++ loncom/lonnet/perl/lonnet.pm	2001/08/09 19:28:47	1.147
@@ -122,7 +122,7 @@
 # 5/30 H. K. Ng
 # 6/1 Gerd Kortemeyer
 # July Guy Albertelli
-# 8/4,8/7 Gerd Kortemeyer
+# 8/4,8/7,8/8,8/9 Gerd Kortemeyer
 
 package Apache::lonnet;
 
@@ -896,7 +896,7 @@ sub rolesinit {
         my $author=0;
         map {
             %thesepriv=();
-            if (($_!~/^st/) && ($_!~/^ta/)) { $adv=1; }
+            if (($_!~/^st/) && ($_!~/^ta/) && ($_!~/^cm/)) { $adv=1; }
             if (($_=~/^au/) || ($_=~/^ca/)) { $author=1; }
             map {
                 if ($_ ne '') {
@@ -1674,7 +1674,7 @@ sub condval {
 # --------------------------------------------------------- Value of a Variable
 
 sub EXT {
-    my $varname=shift;
+    my ($varname,$symbparm)=@_;
     unless ($varname) { return ''; }
     my ($realm,$space,$qualifier,@therest)=split(/\./,$varname);
     my $rest;
@@ -1735,8 +1735,17 @@ sub EXT {
                               $spacequalifierrest};
     } elsif ($realm eq 'resource') {
        if ($ENV{'request.course.id'}) {
+
+#	   print '<br>'.$space.' - '.$qualifier.' - '.$spacequalifierrest;
+
+
 # ----------------------------------------------------- Cascading lookup scheme
-         my $symbp=&symbread();
+         my $symbp;
+         if ($symbparm) {
+            $symbp=$symbparm;
+	 } else {
+            $symbp=&symbread();
+         }            
          my $mapp=(split(/\_\_\_/,$symbp))[0];
 
          my $symbparm=$symbp.'.'.$spacequalifierrest;
@@ -1824,6 +1833,21 @@ sub EXT {
                                          'parameter_'.$spacequalifierrest);
       if ($metadata) { return $metadata; }
 
+# ------------------------------------------------------------------ Cascade up
+
+      unless ($space eq '0') {
+          my ($part,$id)=split(/\_/,$space);
+          if ($id) {
+	      my $partgeneral=&EXT('resource.'.$part.'.'.$qualifierrest,
+                                   $symbparm);
+              if ($partgeneral) { return $partgeneral; }
+          } else {
+              my $resourcegeneral=&EXT('resource.0.'.$qualifierrest,
+                                       $symbparm);
+              if ($resourcegeneral) { return $resourcegeneral; }
+          }
+      }
+
 # ---------------------------------------------------- Any other user namespace
     } elsif ($realm eq 'environment') {
 # ----------------------------------------------------------------- environment
@@ -1872,14 +1896,18 @@ sub metadata {
 		  if ($_=~/^$package\&/) {
 		      my ($pack,$name,$subp)=split(/\&/,$_);
                       my $value=$packagetab{$_};
+		      my $part=$keyroot;
+                      $part=~s/^\_//;
                       if ($subp eq 'display') {
-			  my $part=$keyroot;
-                          $part=~s/^\_//;
 			  $value.=' [Part: '.$part.']';
                       }
                       my $unikey='parameter'.$keyroot.'_'.$name;
                       $metathesekeys{$unikey}=1;
-                      $metacache{$uri.':'.$unikey.'.'.$subp}=$value;
+                      $metacache{$uri.':'.$unikey.'.part'}=$part;
+                      unless 
+                       (defined($metacache{$uri.':'.$unikey.'.'.$subp})) {
+                         $metacache{$uri.':'.$unikey.'.'.$subp}=$value;
+		      }
                   }
               } keys %packagetab;
              } else {
@@ -2194,7 +2222,11 @@ if ($readit ne 'done') {
     while (my $configline=<$config>) {
        chomp($configline);
        my ($short,$plain)=split(/:/,$configline);
-       if ($plain ne '') { $packagetab{$short}=$plain; }
+       my ($pack,$name)=split(/\&/,$short);
+       if ($plain ne '') {
+          $packagetab{$pack.'&'.$name.'&name'}=$name; 
+          $packagetab{$short}=$plain; 
+       }
     }
 }