--- rat/lonratedt.pm	2004/11/13 21:17:55	1.61
+++ rat/lonratedt.pm	2005/06/08 16:10:01	1.68
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Edit Handler for RAT Maps
 #
-# $Id: lonratedt.pm,v 1.61 2004/11/13 21:17:55 albertel Exp $
+# $Id: lonratedt.pm,v 1.68 2005/06/08 16:10:01 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -173,7 +173,7 @@ use Apache::loncommon;
 use Apache::lonlocal;
 use File::Copy;
 
-use vars qw(@order @resources @resparms);
+use vars qw(@order @resources @resparms @zombies %revzombies);
 
 
 # Mapread read maps into global arrays @links and @resources, determines status
@@ -188,9 +188,14 @@ sub mapread {
     undef @resources;
     undef @order;
     undef @resparms;
+    undef @zombies;
+    undef %revzombies;
+
     @resources=('');
     @order=();
     @resparms=();
+    @zombies=();
+    %revzombies=();
 
     my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');
     if ($errtext) { return ($errtext,2); }
@@ -199,7 +204,13 @@ sub mapread {
     foreach (split(/\<\&\>/,$outtext)) {
 	my ($command,$number,$content)=split(/\<\:\>/,$_);
         if ($command eq 'objcont') {
-	    $resources[$number]=$content;
+	    my ($title,$src,$ext,$type)=split(/\:/,$content);
+	    if ($type ne 'zombie') {
+		$resources[$number]=$content;
+	    } else {
+		$zombies[$number]=$content;
+		$revzombies{$src}=$number;
+	    }
         }
         if ($command eq 'objlinks') {
             $links[$number]=$content;
@@ -296,7 +307,10 @@ sub attemptread {
     foreach (split(/\<\&\>/,$outtext)) {
 	my ($command,$number,$content)=split(/\<\:\>/,$_);
         if ($command eq 'objcont') {
-	    $theseres[$number]=$content;
+	    my ($title,$src,$ext,$type)=split(/\:/,$content);
+	    unless ($type eq 'zombie') {
+		$theseres[$number]=$content;
+	    }
         }
         if ($command eq 'objlinks') {
             $links[$number]=$content;
@@ -393,6 +407,10 @@ sub attemptread {
 # --------------------------------------------------------- Build up RAT screen
 sub ratedt {
   my ($r,$url)=@_;
+  my $frameset = '<frameset rows="1,70,*" border="0">';
+  if ($env{'environment.remote'} eq 'off') {
+      $frameset = '<frameset rows="1,250,*" border="0">';
+  }
   $r->print(<<ENDDOCUMENT);
 
 <html>
@@ -401,9 +419,9 @@ sub ratedt {
     var flag=0;
 </script>
 </head>
-<frameset rows="1,50,*" border=0>
+$frameset
 <frame name=server src="$url/loadonly/ratserver" noresize noscroll>
-<frame name=code src="/adm/rat/code.html">
+<frame name=code src="$url/loadonly/adveditmenu">
 <frame name=mapout src="/adm/rat/map.html">
 </frameset>
 </html>
@@ -430,6 +448,12 @@ sub buttons {
     return $output.'</form><hr>';
 }
 
+# ----------------------------------------------------- Get an unused res index
+
+sub unusedindex {
+    return 1+($#resources>$#zombies?$#resources:$#zombies);
+}
+
 # ----------------------------------------------------------- Paste into target
 # modifies @order, @resources
 
@@ -442,7 +466,7 @@ sub pastetarget {
             $name=&Apache::lonnet::unescape($name);
             $url=&Apache::lonnet::unescape($url);
             if ($url) {
-	       my $idx=$#resources+1;
+	       my $idx=&unusedindex();
                $insertorder[$#insertorder+1]=$idx;
                my $ext='false';
                if ($url=~/^http\:\/\//) { $ext='true'; }
@@ -488,7 +512,7 @@ sub startfinish {
    $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res';
 # Make sure this has at least start and finish
    if ($#order==0) {
-       $resources[$#resources+1]='::false';
+       $resources[&unusedindex()]='::false';
        $order[1]=$#resources;
    }
 # Make the last one a finish resource
@@ -533,7 +557,7 @@ sub storemap {
         }
     }
     $output=~s/http\&colon\;\/\///g;
-    $ENV{'form.output'}=$output;
+    $env{'form.output'}=$output;
     return 
      &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,''));
 }
@@ -705,7 +729,7 @@ sub smpedt {
    my $buttons=&buttons(2);
    my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';
    my $targetmsg='';
-   if ($ENV{'form.save'}) {
+   if ($env{'form.save'}) {
        copy($tmpfn,&Apache::lonnet::filelocation('',$url));
        unlink($tmpfn);
        my ($errtext,$fatal)=
@@ -716,7 +740,7 @@ sub smpedt {
 	   $targetmsg='<b>'.&mt('An error occured while saving.').'</b><br />';
        }
    }
-   if ($ENV{'form.revert'}) {
+   if ($env{'form.revert'}) {
        $targetmsg='<b>'.&mt('Reverted.').'</b><br />';
        unlink($tmpfn);
        my ($errtext,$fatal)=
@@ -729,34 +753,18 @@ sub smpedt {
    }
 # ---------------------------------------------------------- Process form input
 
-   my @importselect=();
-   my @targetselect=();
-   undef @importselect;
-   undef @targetselect;
-   if (defined($ENV{'form.importsel'})) {
-       if (ref($ENV{'form.importsel'})) {
-	   @importselect=sort(@{$ENV{'form.importsel'}});
-       } else {
-           @importselect=($ENV{'form.importsel'});
-       }
-   }
-   if (defined($ENV{'form.target'})) {
-       if (ref($ENV{'form.target'})) {
-	   @targetselect=sort(@{$ENV{'form.target'}});
-       } else {
-           @targetselect=($ENV{'form.target'});
-       }
-   }
+   my @importselect=&Apache::loncommon::get_env_multiple('form.importsel');
+   my @targetselect=&Apache::loncommon::get_env_multiple('form.target');
 # ============================================================ Process commands
 
-   my $targetdetail=$ENV{'form.targetdetail'};
-   my $importdetail=$ENV{'form.curimpdetail'};
+   my $targetdetail=$env{'form.targetdetail'};
+   my $importdetail=$env{'form.curimpdetail'};
 
 # ---------------------------------------------------- Importing from groupsort
-   if (($ENV{'form.importdetail'}) && (!$ENV{'form.impfortarget'})) {
+   if (($env{'form.importdetail'}) && (!$env{'form.impfortarget'})) {
 
        $importdetail='';
-       my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
+       my @curimport=split(/\&/,$env{'form.curimpdetail'});
 
        my $lastsel;
 
@@ -773,7 +781,7 @@ sub smpedt {
 	   }
        }
 
-      $importdetail.='&'.$ENV{'form.importdetail'};
+      $importdetail.='&'.$env{'form.importdetail'};
 
        for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
            my ($name,$url)=split(/\=/,$curimport[$i]);
@@ -785,12 +793,12 @@ sub smpedt {
        $importdetail=~s/^\&//;
 
 # ------------------------------------------------------------------- Clear all
-   } elsif ($ENV{'form.clear'}) {
+   } elsif ($env{'form.clear'}) {
        $importdetail='';
 # ------------------------------------------------------------ Discard selected
-   } elsif ($ENV{'form.discard'}) {
+   } elsif ($env{'form.discard'}) {
        $importdetail='';
-       my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
+       my @curimport=split(/\&/,$env{'form.curimpdetail'});
        foreach (@importselect) {
 	   $curimport[$_]='';
        }
@@ -801,9 +809,9 @@ sub smpedt {
 	   }
        }
 # --------------------------------------------------------- Loading another map
-   } elsif ($ENV{'form.loadmap'}) {
+   } elsif ($env{'form.loadmap'}) {
        $importdetail='';
-       my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
+       my @curimport=split(/\&/,$env{'form.curimpdetail'});
 
        my $lastsel;
 
@@ -821,7 +829,7 @@ sub smpedt {
        }
 
        foreach (
-    &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$ENV{'form.importmap'}))) {
+    &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
 	   my ($name,$url)=split(/\:/,$_);
            if ($url) {
               $importdetail.='&'.&Apache::lonnet::escape($name).'='.
@@ -839,19 +847,19 @@ sub smpedt {
        $importdetail=~s/^\&//;
 
 # ------------------------------------------------ Groupimport/search to target
-   } elsif ($ENV{'form.importdetail'}) {
+   } elsif ($env{'form.importdetail'}) {
        my $lastsel;
        if (defined($targetselect[-1])) {
 	   $lastsel=$targetselect[-1];
        } else {
            $lastsel=$#order+1;
        }
-       &pastetarget($lastsel,split(/\&/,$ENV{'form.importdetail'}));
+       &pastetarget($lastsel,split(/\&/,$env{'form.importdetail'}));
        &storemap(&Apache::lonnet::filelocation('',$url));
 # ------------------------------------------------------------------------- Cut
-   } elsif (($ENV{'form.cut'}) || ($ENV{'form.copy'})) {
+   } elsif (($env{'form.cut'}) || ($env{'form.copy'})) {
        $importdetail='';
-       my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
+       my @curimport=split(/\&/,$env{'form.curimpdetail'});
 
        my $lastsel;
 
@@ -885,7 +893,7 @@ sub smpedt {
        $importdetail=~s/\&+/\&/g;
        $importdetail=~s/^\&//;
 
-       if ($ENV{'form.cut'}) {
+       if ($env{'form.cut'}) {
            my @neworder=();
            for (my $i=0;$i<=$#order;$i++) {
                my $include=1;
@@ -899,7 +907,7 @@ sub smpedt {
        }
 
 # ----------------------------------------------------------------------- Paste
-   } elsif ($ENV{'form.paste'}) {
+   } elsif ($env{'form.paste'}) {
        my $lastsel;
        if (defined($targetselect[-1])) {
 	   $lastsel=$targetselect[-1];
@@ -907,14 +915,14 @@ sub smpedt {
            $lastsel=$#order+1;
        }
        my @newsequence;
-       my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
+       my @curimport=split(/\&/,$env{'form.curimpdetail'});
        foreach (@importselect) {
           $newsequence[$#newsequence+1]=$curimport[$_];
        }
        &pastetarget($lastsel,@newsequence);
        &storemap(&Apache::lonnet::filelocation('',$url));
 # -------------------------------------------------------------------- Move up 
-   } elsif ($ENV{'form.moveup'}) {
+   } elsif ($env{'form.moveup'}) {
        foreach (sort @targetselect) {
            if ($_-1>0) {
               my $movethis=$order[$_-1];
@@ -924,7 +932,7 @@ sub smpedt {
        }
        &storemap(&Apache::lonnet::filelocation('',$url));
 # ------------------------------------------------------------------ Move down
-   } elsif ($ENV{'form.movedown'}) {
+   } elsif ($env{'form.movedown'}) {
        foreach (reverse sort @targetselect) {
            if ($_-1<$#order) {
               my $movethis=$order[$_-1];
@@ -934,10 +942,10 @@ sub smpedt {
        }
        &storemap(&Apache::lonnet::filelocation('',$url));
 # --------------------------------------------------------------------- Rename
-   } elsif ($ENV{'form.renameres'}) {
-       my $residx=$Apache::lonratedt::order[$ENV{'form.renameidx'}-1];
+   } elsif ($env{'form.renameres'}) {
+       my $residx=$Apache::lonratedt::order[$env{'form.renameidx'}-1];
        my ($name,@resrest)=split(/\:/,$Apache::lonratedt::resources[$residx]);
-       $name=$ENV{'form.renametitle'};
+       $name=$env{'form.renametitle'};
        $name=~s/\:/\&colon\;/g;
        $Apache::lonratedt::resources[$residx]=$name.':'.join(':',@resrest);
        &storemap(&Apache::lonnet::filelocation('',$url));
@@ -978,7 +986,7 @@ sub smpedt {
 # ----------------------------------------------------- Start simple RAT screen
    my $editscript=&editscript('simple');
    my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
-					($ENV{'environment.remote'} ne 'off')).
+					($env{'environment.remote'} ne 'off')).
        &Apache::loncommon::help_open_menu('','Sequence_Simple_Editor_Creation','Sequence_Simple_Editor_Creation','',6,'RAT');
    my %lt=&Apache::lonlocal::texthash(
 				      'sa' => 'Save',
@@ -1145,22 +1153,48 @@ sub viewmap {
     if ($adv) {
 	$r->print('<p><b><font color="red">'.&mt('Map contents are not shown in order.').'</font></b></p><br />');
     }
+    $r->print( '<table border="0" cellspacing="2" cellpadding="4">'.
+               '<tr bgcolor="#DDDDDD"><th>'.&mt('Type').'</th>'.
+               '<th>'.&mt('Title in map').'</th>'.
+               '<th>'.&mt('Filename of resource').'</th>'.
+               '<th>'.&mt('Link to published resource').'</th>'.
+               '<th>'.&mt('Link to resource in Construction Space').'</th>'.
+               '</tr>');
+    my @backgroundColors = ("#FFFFFF", "#F6F6F6");
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
 	if (defined($_)) {
             $idx++;
-	    my ($title,$url)=split(/\:/,$_);
+	    my ($title,$url,$cond)=split(/\:/,$_);
+	    if ($cond eq 'cond') { next; }
             $title=~s/\&colon\;/\:/g;
             $url=~s/\&colon\;/\:/g;
             unless ($title) { $title=(split(/\//,$url))[-1] };
-            unless ($title) { $title='<i>Empty</i>'; }
+            unless ($title) { $title='<i>'.&mt('Empty').'</i>'; }
+            my $resurl = &Apache::lonratsrv::qtescape($url);
+            my $resfilepath = $Apache::lonnet::perlvar{'lonDocRoot'}.$resurl;
+            my $filename; 
+            if ($resurl =~ m#/([^/]+)$#) {
+                $filename = $1;
+            }
+            my $cstrurl = $resurl;
+            $cstrurl =~ s#^/res/[^/]+/([^/]+)/#/priv/$1/#;
+            my $bgcol = $idx%2; 
+            $r->print('<tr bgcolor='.$backgroundColors[$bgcol].'><td>'.
+                      '<img src="'.&Apache::loncommon::icon($resfilepath).
+                      '" /></td><td>'.&Apache::lonratsrv::qtescape($title).
+                      '</td><td>'.$filename.'</td><td>');
+            if ($url) {
+		$r->print('<a href="'.$resurl.'">'.&mt('Resource space').'</a>');
+            }
+            $r->print('</td><td>');
             if ($url) {
-		$r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">');
+               $r->print('<a href="'.$cstrurl.'">'.
+                         &mt('Construction space').'</a>');
             }
-            $r->print(&Apache::lonratsrv::qtescape($title));
-            if ($url) { $r->print('</a>'); }
-	    $r->print('<br>');
+            $r->print('</td></tr>'."\n");
         }
     }
+    $r->print('</table>');
     $r->print('</body></html>');
 }
 
@@ -1172,7 +1206,7 @@ sub handler {
   $r->send_http_header;
 
   return OK if $r->header_only;
-  my $target = $ENV{'form.grade_target'};
+  my $target = $env{'form.grade_target'};
   if ($target eq 'meta') {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
@@ -1191,8 +1225,8 @@ sub handler {
 # ------------------------------------------- Determine which tools can be used
   my $adv=0;
 
-  unless ($ENV{'form.forcesmp'}) {
-     if ($ENV{'form.forceadv'}) {
+  unless ($env{'form.forcesmp'}) {
+     if ($env{'form.forceadv'}) {
         $adv=1;
      } elsif (my $fh=Apache::File->new($fn)) {
 	 my $allmap=join('',<$fh>);
@@ -1210,9 +1244,9 @@ sub handler {
 
 # ----------------------------------- adv==1 now means "graphical MUST be used"
 
-  if ($ENV{'form.forceadv'}) {
+  if ($env{'form.forceadv'}) {
       &ratedt($r,$url);
-  } elsif ($ENV{'form.forcesmp'}) {
+  } elsif ($env{'form.forcesmp'}) {
       &smpedt($r,$url,$errtext);
   } else {
       &viewmap($r,$url,$adv,$errtext);