--- rat/lonratedt.pm	2004/04/23 22:34:15	1.54
+++ rat/lonratedt.pm	2005/06/08 18:49:38	1.71
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Edit Handler for RAT Maps
 #
-# $Id: lonratedt.pm,v 1.54 2004/04/23 22:34:15 www Exp $
+# $Id: lonratedt.pm,v 1.71 2005/06/08 18:49:38 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -25,10 +25,7 @@
 #
 # http://www.lon-capa.org/
 #
-# (TeX Content Handler
-#
-# 05/29/00,05/30 Gerd Kortemeyer)
-# 7/1,6/30 Gerd Kortemeyer
+
 
 package Apache::lonratedt;
 
@@ -36,7 +33,7 @@ package Apache::lonratedt;
 
 =head1 NAME
 
-Apache::lonratedt: advanced resource assembly tool
+Apache::lonratedt: simple resource assembly tool
 
 =head1 SYNOPSIS
 
@@ -176,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);
 
 
 # Mapread read maps into global arrays @links and @resources, determines status
@@ -190,8 +187,13 @@ sub mapread {
     undef @links;
     undef @resources;
     undef @order;
+    undef @resparms;
+    undef @zombies;
+
     @resources=('');
     @order=();
+    @resparms=();
+    @zombies=();
 
     my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');
     if ($errtext) { return ($errtext,2); }
@@ -200,13 +202,23 @@ 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 ($ext eq 'cond') { next; }
+	    if ($type ne 'zombie') {
+		$resources[$number]=$content;
+	    } else {
+		$zombies[$number]=$content;
+	    }
         }
         if ($command eq 'objlinks') {
             $links[$number]=$content;
         }
         if ($command eq 'objparms') {
-	    $resparms[$number]=$content;
+	    if ($resparms[$number]) {
+		$resparms[$number].='&&&'.$content;
+	    } else {
+		$resparms[$number]=$content;
+	    }
         }
     }
 # ------------------------------------------------------- Is this a linear map?
@@ -293,7 +305,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;
@@ -390,6 +405,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>
@@ -398,9 +417,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>
@@ -427,6 +446,30 @@ sub buttons {
     return $output.'</form><hr>';
 }
 
+# ------------------------------------- Revive zombie idx or get unused number
+
+sub getresidx {
+    my $url=shift;
+    my $max=1+($#resources>$#zombies?$#resources:$#zombies);
+    unless ($url) { return $max; }
+    for (my $i=0; $i<=$#zombies; $i++) {
+	my ($title,$src,$ext,$type)=split(/\:/,$zombies[$i]);
+	if ($src eq $url) {
+	    undef $zombies[$i];
+	    return $i;
+	}
+    }
+    return $max;
+}
+
+# --------------------------------------------------------------- Make a zombie
+
+sub makezombie {
+    my $idx=shift;
+    my ($name,$url,$ext)=split(/\:/,$resources[$idx]);
+    $zombies[$idx]=$name.':'.$url.':'.$ext.':zombie';
+}
+
 # ----------------------------------------------------------- Paste into target
 # modifies @order, @resources
 
@@ -439,7 +482,7 @@ sub pastetarget {
             $name=&Apache::lonnet::unescape($name);
             $url=&Apache::lonnet::unescape($url);
             if ($url) {
-	       my $idx=$#resources+1;
+	       my $idx=&getresidx($url);
                $insertorder[$#insertorder+1]=$idx;
                my $ext='false';
                if ($url=~/^http\:\/\//) { $ext='true'; }
@@ -485,7 +528,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[&getresidx()]='::false';
        $order[1]=$#resources;
    }
 # Make the last one a finish resource
@@ -515,7 +558,11 @@ sub storemap {
 	    $output.='<&>objcont<:>'.$order[$i].'<:>'.$resources[$order[$i]];
         }
 	if (defined($resparms[$order[$i]])) {
-	    $output.='<&>objparms<:>'.$order[$i].'<:>'.$resparms[$order[$i]];
+	    foreach (split('&&&',$resparms[$order[$i]])) {
+		if ($_) {
+		    $output.='<&>objparms<:>'.$order[$i].'<:>'.$_;
+		}
+	    }
 	}
         if (defined($order[$i+1])) {
 	    if (defined($resources[$order[$i+1]])) {
@@ -525,12 +572,69 @@ sub storemap {
             }
         }
     }
+    for (my $i=0; $i<=$#zombies; $i++) {
+        if (defined($zombies[$i])) {
+	    $output.='<&>objcont<:>'.$i.'<:>'.$zombies[$i];
+        }
+    }
     $output=~s/http\&colon\;\/\///g;
-    $ENV{'form.output'}=$output;
+    $env{'form.output'}=$output;
     return 
      &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,''));
 }
 
+# ------------------------------------------ Store and get parameters in global
+
+sub storeparameter {
+    my ($to,$name,$value,$ptype)=@_;
+    my $newentry='';
+    my $nametype='';
+    foreach (split('&&&',$resparms[$to])) {
+	my ($thistype,$thisname,$thisvalue)=split('___',$_);
+	if ($thisname) {
+	    unless ($thisname eq $name) {
+		$newentry.=$_.'&&&';
+	    } else {
+		$nametype=$thistype;
+	    }
+	}
+    }
+    unless ($ptype) { $ptype=$nametype; }
+    unless ($ptype) { $ptype='string'; }
+    $newentry.=$ptype.'___'.$name.'___'.$value;
+    $resparms[$to]=$newentry;
+}
+
+sub delparameter {
+    my ($to,$name)=@_;
+    my $newentry='';
+    my $nametype='';
+    foreach (split('&&&',$resparms[$to])) {
+	my ($thistype,$thisname,$thisvalue)=split('___',$_);
+	if ($thisname) {
+	    unless ($thisname eq $name) {
+		$newentry.=$_.'&&&';
+	    }
+	}
+    }
+    $resparms[$to]=$newentry;
+}
+
+sub getparameter {
+    my ($to,$name)=@_;
+    my $value=undef;
+    my $ptype=undef;
+    foreach (split('&&&',$resparms[$to])) {
+	my ($thistype,$thisname,$thisvalue)=split('___',$_);
+	if ($thisname eq $name) {
+	    $value=$thisvalue;
+	    $ptype=$thistype;
+	}
+    }
+    return ($value,$ptype);
+}
+
+# ----------------------------------------------------------------- Edit script
 sub editscript {
     my $mode=shift;
     my $resurl=&Apache::loncommon::lastresurl();
@@ -646,15 +750,19 @@ sub smpedt {
    my $buttons=&buttons(2);
    my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';
    my $targetmsg='';
-   if ($ENV{'form.save'}) {
-       $targetmsg='<b>Saving ...</b><br>';
+   if ($env{'form.save'}) {
        copy($tmpfn,&Apache::lonnet::filelocation('',$url));
        unlink($tmpfn);
        my ($errtext,$fatal)=
                            &mapread(&Apache::lonnet::filelocation('',$url),'');
+       unless ($fatal) {
+	   $targetmsg='<b>'.&mt('Saved.').'</b><br />';
+       } else {
+	   $targetmsg='<b>'.&mt('An error occured while saving.').'</b><br />';
+       }
    }
-   if ($ENV{'form.revert'}) {
-       $targetmsg='<b>Reverting ...</b><br>';
+   if ($env{'form.revert'}) {
+       $targetmsg='<b>'.&mt('Reverted.').'</b><br />';
        unlink($tmpfn);
        my ($errtext,$fatal)=
                            &mapread(&Apache::lonnet::filelocation('',$url),'');
@@ -666,34 +774,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;
 
@@ -710,7 +802,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]);
@@ -722,12 +814,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[$_]='';
        }
@@ -738,9 +830,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;
 
@@ -758,7 +850,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).'='.
@@ -776,19 +868,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;
 
@@ -822,21 +914,25 @@ 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;
                foreach (@targetselect) {
 		   if ($_-1==$i) { $include=0; }
                }
-               if ($include) { $neworder[$#neworder+1]=$order[$i]; }
+               if ($include) { 
+		   $neworder[$#neworder+1]=$order[$i]; 
+	       } else {
+		   &makezombie($order[$i]);
+	       }
            }
            @order=@neworder;
            &storemap(&Apache::lonnet::filelocation('',$url));      
        }
 
 # ----------------------------------------------------------------------- Paste
-   } elsif ($ENV{'form.paste'}) {
+   } elsif ($env{'form.paste'}) {
        my $lastsel;
        if (defined($targetselect[-1])) {
 	   $lastsel=$targetselect[-1];
@@ -844,14 +940,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];
@@ -861,7 +957,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];
@@ -871,10 +967,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));
@@ -914,10 +1010,9 @@ sub smpedt {
 
 # ----------------------------------------------------- Start simple RAT screen
    my $editscript=&editscript('simple');
-   my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1).
-       &Apache::loncommon::help_open_topic('Sequence_Simple_Editor_Creation').
-       &Apache::loncommon::help_open_faq(6).
-       &Apache::loncommon::help_open_bug('RAT');
+   my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
+					($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',
 				      'nt' => 'New Title',
@@ -1073,8 +1168,7 @@ sub viewmap {
     my ($r,$url,$adv,$errtext)=@_;
     $r->print('<html>'.
      &Apache::loncommon::bodytag('Edit Content of a Map').
-	      &Apache::loncommon::help_open_faq(6).
-	      &Apache::loncommon::help_open_bug('RAT').
+	      &Apache::loncommon::help_open_menu('','','','',6,'RAT').
 	      &buttons($adv));
     if ($errtext) {
 	$r->print($errtext.'<hr />');
@@ -1084,22 +1178,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>');
 }
 
@@ -1111,7 +1231,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;
@@ -1130,8 +1250,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>);
@@ -1149,9 +1269,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);