--- rat/lonratedt.pm	2003/12/12 15:16:35	1.49
+++ rat/lonratedt.pm	2005/06/08 15:44:51	1.67
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Edit Handler for RAT Maps
 #
-# $Id: lonratedt.pm,v 1.49 2003/12/12 15:16:35 sakharuk Exp $
+# $Id: lonratedt.pm,v 1.67 2005/06/08 15:44:51 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;
 
@@ -176,7 +173,7 @@ use Apache::loncommon;
 use Apache::lonlocal;
 use File::Copy;
 
-use vars qw(@order @resources);
+use vars qw(@order @resources @resparms @zombies %revzombies);
 
 
 # Mapread read maps into global arrays @links and @resources, determines status
@@ -190,8 +187,15 @@ sub mapread {
     undef @links;
     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); }
@@ -200,13 +204,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 ($type ne 'zombie') {
+		$resources[$number]=$content;
+	    } else {
+		$zombies[$number]=$content;
+		$revzombies{$src}=$number;
+	    }
         }
         if ($command eq 'objlinks') {
             $links[$number]=$content;
         }
         if ($command eq 'objparms') {
-	    return(&mt('Map has resource parameters. Use advanced editor.'),1);
+	    if ($resparms[$number]) {
+		$resparms[$number].='&&&'.$content;
+	    } else {
+		$resparms[$number]=$content;
+	    }
         }
     }
 # ------------------------------------------------------- Is this a linear map?
@@ -293,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;
@@ -390,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>
@@ -398,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>
@@ -414,12 +435,15 @@ sub buttons {
     my $adv=shift;
     my $output='<form method=post>';     
     if ($adv==1) {
-	$output.='<input type=submit name=forceadv value="'.&mt('Edit').'">';
+	$output.='<input type=submit name=forceadv value="'.&mt('Edit').'">'.
+	    &Apache::loncommon::help_open_topic('Sequence_Advanced_Editor_Creation');;
     } else {
         unless ($adv==2) {
-           $output.='<input type=submit name=forcesmp value="'.&mt('Simple Edit').'">';
+           $output.='<input type=submit name=forcesmp value="'.&mt('Simple Edit').'">'.
+	    &Apache::loncommon::help_open_topic('Sequence_Simple_Editor_Creation');
         }
-	$output.='<input type=submit name=forceadv value="'.&mt('Advanced Edit').'">';
+	$output.='<input type=submit name=forceadv value="'.&mt('Advanced Edit').'">'.
+	    &Apache::loncommon::help_open_topic('Sequence_Advanced_Editor_Creation');
     }
     return $output.'</form><hr>';
 }
@@ -511,6 +535,13 @@ sub storemap {
         if (defined($resources[$order[$i]])) {
 	    $output.='<&>objcont<:>'.$order[$i].'<:>'.$resources[$order[$i]];
         }
+	if (defined($resparms[$order[$i]])) {
+	    foreach (split('&&&',$resparms[$order[$i]])) {
+		if ($_) {
+		    $output.='<&>objparms<:>'.$order[$i].'<:>'.$_;
+		}
+	    }
+	}
         if (defined($order[$i+1])) {
 	    if (defined($resources[$order[$i+1]])) {
                $output.='<&>objlinks<:>'.$k.'<:>'.
@@ -520,13 +551,66 @@ sub storemap {
         }
     }
     $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();
     return(<<ENDSCRIPT);
 var srch;
 var srchflag=-1; // 1 means currently open
@@ -571,7 +655,7 @@ function idxopen(mode) {
    var options="scrollbars=1,resizable=1,menubar=0";
    idxmode=mode;
    idxflag=1;
-   idx=open("/res/?launch=1&mode=$mode&catalogmode="+mode,"idxout",options);
+   idx=open("$resurl/?launch=1&mode=$mode&catalogmode="+mode,"idxout",options);
    idx.focus();
 }
 
@@ -610,7 +694,7 @@ function idxcheck(mode) {
 
     var editbrowser;
     function openbrowser(formname,elementname,only,omit) {
-        var url = '/res/?';
+        var url = '$resurl/?';
         if (editbrowser == null) {
             url += 'launch=1&';
         }
@@ -639,15 +723,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),'');
@@ -659,34 +747,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;
 
@@ -703,7 +775,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]);
@@ -715,12 +787,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[$_]='';
        }
@@ -731,9 +803,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;
 
@@ -751,7 +823,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).'='.
@@ -769,19 +841,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;
 
@@ -815,7 +887,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;
@@ -829,7 +901,7 @@ sub smpedt {
        }
 
 # ----------------------------------------------------------------------- Paste
-   } elsif ($ENV{'form.paste'}) {
+   } elsif ($env{'form.paste'}) {
        my $lastsel;
        if (defined($targetselect[-1])) {
 	   $lastsel=$targetselect[-1];
@@ -837,14 +909,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];
@@ -854,7 +926,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];
@@ -864,10 +936,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));
@@ -878,7 +950,7 @@ sub smpedt {
    $importdetail='&'.$importdetail;
    $importdetail=~s/^\&+/\&/;
    my $importwindow=
-       '<option value="-1"> ---- Import and Paste Area ---- </option>'.
+       '<option value="-1"> ---- '.&mt('Import and Paste Area').' ---- </option>'.
      join("\n",map {
        $idx++;
        if ($_) { 
@@ -907,7 +979,9 @@ sub smpedt {
 
 # ----------------------------------------------------- Start simple RAT screen
    my $editscript=&editscript('simple');
-   my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);
+   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',
@@ -1063,31 +1137,62 @@ sub viewmap {
     my ($r,$url,$adv,$errtext)=@_;
     $r->print('<html>'.
      &Apache::loncommon::bodytag('Edit Content of a Map').
-     &buttons($adv));
+	      &Apache::loncommon::help_open_menu('','','','',6,'RAT').
+	      &buttons($adv));
     if ($errtext) {
-	$r->print($errtext.'<hr>');
+	$r->print($errtext.'<hr />');
     }
     my $idx=0;
     $r->print('<h1>'.$url.'</h1>');
     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) {
+                if (-e $resfilepath) {
+		    $r->print('<a href="'.$resurl.'">'.&mt('Resource space').'</a>');
+                } else {
+                    $r->print(&mt('unpublished'));
+                }
+            }
+            $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>');
 }
 
@@ -1099,7 +1204,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;
@@ -1118,8 +1223,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>);
@@ -1137,9 +1242,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);