--- rat/lonratedt.pm	2002/08/20 13:02:41	1.32
+++ rat/lonratedt.pm	2002/11/11 21:04:49	1.40
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Edit Handler for RAT Maps
 #
-# $Id: lonratedt.pm,v 1.32 2002/08/20 13:02:41 www Exp $
+# $Id: lonratedt.pm,v 1.40 2002/11/11 21:04:49 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -37,9 +37,10 @@ use Apache::Constants qw(:common);
 use Apache::lonnet;
 use Apache::lonratsrv;
 use Apache::lonsequence;
+use Apache::loncommon;
+use File::Copy;
 
-my @order;
-my @resources;
+use vars qw(@order @resources);
 
 
 # Mapread read maps into global arrays @links and @resources, determines status
@@ -102,7 +103,12 @@ sub mapread {
             }
         }
     }
-
+# ---------------------------------------------- Did we just read an empty map?
+    if ($#resources<1) {
+        undef $resources[0];
+	$resources[1]=':::start';
+        $resources[2]=':::finish';
+    }
 # -------------------------------------------------- This is a linear map, sort
 
     my $startidx=0;
@@ -299,6 +305,7 @@ sub pastetarget {
                my $ext='false';
                if ($url=~/^http\:\/\//) { $ext='true'; }
                $url=~s/\:/\&colon;/g;
+               $name=~s/\:/\&colon;/g;
                $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res';
 	   }
         }
@@ -318,6 +325,10 @@ sub startfinish {
     }
    my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]);
    $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res';
+   if ($#order==0) {
+       $resources[$#resources+1]='::false';
+       $order[1]=$#resources;
+   }
    my ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]);
    $resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res';
 }
@@ -325,7 +336,17 @@ sub startfinish {
 # ------------------------------------------------------------------- Store map
 
 sub storemap {
-    my $fn=shift;
+    my $realfn=shift;
+    my $fn=$realfn;
+# unless this is forced to work from the original file, use a temporary file
+# instead
+    unless (shift) {
+       $fn=$realfn.'.tmp';
+       unless (-e $fn) {
+	  copy($realfn,$fn);
+       }
+    }
+# store data either into tmp or real file
     &startfinish();
     my $output='graphdef<:>no';
     my $k=1;
@@ -459,7 +480,26 @@ ENDSCRIPT
 sub smpedt {
    my ($r,$url,$errtext)=@_;
    my $buttons=&buttons(2);
-
+   my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';
+   my $targetmsg='';
+   if ($ENV{'form.save'}) {
+       $targetmsg='<b>Saving ...</b><br>';
+       copy($tmpfn,&Apache::lonnet::filelocation('',$url));
+       unlink($tmpfn);
+       my ($errtext,$fatal)=
+                           &mapread(&Apache::lonnet::filelocation('',$url),'');
+   }
+   if ($ENV{'form.revert'}) {
+       $targetmsg='<b>Reverting ...</b><br>';
+       unlink($tmpfn);
+       my ($errtext,$fatal)=
+                           &mapread(&Apache::lonnet::filelocation('',$url),'');
+   }
+   if (-e $tmpfn) {
+      $targetmsg=
+        '<b><font color="red">You are working with an unsaved version of your map.</font></b><br>';
+      my ($errtext,$fatal)=&mapread($tmpfn,'');
+   }
 # ---------------------------------------------------------- Process form input
 
    my @importselect=();
@@ -646,11 +686,40 @@ sub smpedt {
        }
        &pastetarget($lastsel,@newsequence);
        &storemap(&Apache::lonnet::filelocation('',$url));
-# ------------------------------------------------ 
+# -------------------------------------------------------------------- Move up 
+   } elsif ($ENV{'form.moveup'}) {
+       foreach (sort @targetselect) {
+           if ($_-1>0) {
+              my $movethis=$order[$_-1];
+              $order[$_-1]=$order[$_-2];
+              $order[$_-2]=$movethis;
+	  }
+       }
+       &storemap(&Apache::lonnet::filelocation('',$url));
+# ------------------------------------------------------------------ Move down
+   } elsif ($ENV{'form.movedown'}) {
+       foreach (reverse sort @targetselect) {
+           if ($_-1<$#order) {
+              my $movethis=$order[$_-1];
+              $order[$_-1]=$order[$_];
+              $order[$_]=$movethis;
+	   }
+       }
+       &storemap(&Apache::lonnet::filelocation('',$url));
+# --------------------------------------------------------------------- Rename
+   } 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=~s/\:/\&colon\;/g;
+       $Apache::lonratedt::resources[$residx]=$name.':'.join(':'.@resrest);
+       &storemap(&Apache::lonnet::filelocation('',$url));
    }
 # ------------------------------------------------------------ Assemble windows
    
    my $idx=-1;
+   $importdetail='&'.$importdetail;
+   $importdetail=~s/^\&+/\&/;
    my $importwindow=
        '<option value="-1"> ---- Import and Paste Area ---- </option>'.
      join("\n",map {
@@ -665,6 +734,7 @@ sub smpedt {
    } split(/\&/,$importdetail));
 
    $idx=0;
+   $targetdetail='';
    my $targetwindow=       
        '<option value="0"> ------- Target Edit Map ------- </option>'.
      join("\n",map { 
@@ -674,11 +744,13 @@ sub smpedt {
        $targetdetail.='&'.&Apache::lonnet::escape($name).'='.
 	                  &Apache::lonnet::escape($url);
        $idx++;
+       $name=~s/\&colon;/\:/g;
        '<option value="'.$idx.'">'.$name.'</option>';
    } @order);
 
 # ----------------------------------------------------- Start simple RAT screen
    my $editscript=&editscript('simple');
+   my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);
    $r->print(<<ENDSMPHEAD);
 <html>
 <head>
@@ -696,29 +768,44 @@ sub smpedt {
 
    function viewtarget() {
        openview((document.forms.simpleedit.targetdetail.value.split('&'))
-                [document.forms.simpleedit.target.selectedIndex+1]);
+                [document.forms.simpleedit.target.selectedIndex]);
    }
 
    function viewimport() {
        openview((document.forms.simpleedit.curimpdetail.value.split('&'))
-                [document.forms.simpleedit.importsel.selectedIndex+1]);
+                [document.forms.simpleedit.importsel.selectedIndex]);
+   }
+
+   function renametarget() {
+       var selidx=document.forms.simpleedit.target.selectedIndex;
+       var entry=(document.forms.simpleedit.targetdetail.value.split('&'))
+                [selidx];
+       var newtitle=prompt('New Title',unescape((entry.split('='))[0]));
+       if (newtitle) {
+           document.forms.simpleedit.renameres.value=1;
+           document.forms.simpleedit.renameidx.value=selidx;
+           document.forms.simpleedit.renametitle.value=newtitle;
+	   document.forms.simpleedit.submit();
+       }
    }
 
 </script>
 </head>                 
-<body bgcolor='#FFFFFF'>
+$bodytag
 $buttons
 <font color=red>$errtext</font>
-<h1>$url</h1>
 <form name=simpleedit method=post>
 <input type=hidden name=forcesmp value=1>
+<input type=hidden name=renameres value=0>
+<input type=hidden name=renametitle value=''>
+<input type=hidden name=renameidx value=0>
 <table>
-    <tr><th width="40%">Import</th>
+    <tr><th width="40%">Temporary Assembly Workspace</th>
 <th>&nbsp;</th>
-<th width="40%">Target</th></tr>
+<th width="40%">File: $url</th></tr>
 <tr><td bgcolor="#FFFFCC">
-<input type=button onClick="javascript:groupsearch()" value="Group Search">
-<input type=button onClick="javascript:groupimport();" value="Group Import">
+<input type=button onClick="javascript:groupsearch()" value="Search">
+<input type=button onClick="javascript:groupimport();" value="Import">
 after selected
 <hr>
 <input type=text size=20 name=importmap>
@@ -732,11 +819,18 @@ value="Browse"><input type=submit name=l
     </td><td>&nbsp;</td><td bgcolor="#FFFFCC">
 
 <input type=button onClick=
-"javascript:impfortarget.value=1;groupsearch()" value="Group Search">
+"javascript:impfortarget.value=1;groupsearch()" value="Search">
 <input type=button onClick=
-"javascript:impfortarget.value=1;groupimport();" value="Group Import">
+"javascript:impfortarget.value=1;groupimport();" value="Import">
 after selected
-<hr><input type=button onClick="javascript:viewtarget()" value="View">
+<hr>
+<input type=submit name="moveup" value="Move Up">
+<input type=submit name="movedown" value="Move Down">
+<input type=button onClick="javascript:renametarget()" value="Rename">
+<hr>$targetmsg
+<input type=submit name="revert" value="Revert to Last Saved">
+<input type=submit name="save" value="Save">
+<input type=button onClick="javascript:viewtarget()" value="View">
 </td></tr>
 
 <tr><td bgcolor="#FFFFCC"><select name="importsel" size=10 multiple>
@@ -783,11 +877,14 @@ ENDNODIR
 
 sub viewmap {
     my ($r,$url,$adv,$errtext)=@_;
-    $r->print('<html><body bgcolor="#FFFFFF">'.&buttons($adv));
+    $r->print('<html>'.
+     &Apache::loncommon::bodytag('Edit Content of a Map').
+     &buttons($adv));
     if ($errtext) {
 	$r->print($errtext.'<hr>');
     }
     my $idx=0;
+    $r->print('<h1>'.$url.'</h1>');
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
 	if (defined($_)) {
             $idx++;