--- rat/lonratedt.pm	2002/05/13 21:26:05	1.15
+++ rat/lonratedt.pm	2002/05/16 21:10:05	1.20
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Edit Handler for RAT Maps
 #
-# $Id: lonratedt.pm,v 1.15 2002/05/13 21:26:05 www Exp $
+# $Id: lonratedt.pm,v 1.20 2002/05/16 21:10:05 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -126,6 +126,117 @@ sub mapread {
     return $errtext;
 }
 
+# ---------------------------------------------- Read a map as well as possible
+
+sub attemptread {
+    my $fn=shift;
+
+    my @links;
+    undef @links;
+    my @theseres;
+    undef @theseres;
+
+    my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');
+    if ($errtext) { return @theseres }
+
+# -------------------------------------------------------------------- Read map
+    foreach (split(/\<\&\>/,$outtext)) {
+	my ($command,$number,$content)=split(/\<\:\>/,$_);
+        if ($command eq 'objcont') {
+	    $theseres[$number]=$content;
+        }
+        if ($command eq 'objlinks') {
+            $links[$number]=$content;
+        }
+    }
+
+# --------------------------------------------------------------- Sort, sort of
+
+    my @objsort=();
+    undef @objsort;
+
+    my @data1=();
+    my @data2=();
+    undef @data1;
+    undef @data2;
+
+    my $k;
+    my $kj;
+    my $j;
+    my $ij;
+
+   for ($k=1;$k<=$#theseres;$k++) {
+      if (defined($theseres[$k])) {
+         $objsort[$#objsort+1]=$k;
+      }
+   }
+
+   for ($k=1;$k<=$#links;$k++) {
+     if (defined($links[$k])) {
+      @data1=split(/\:/,$links[$k]);
+      $kj=-1;
+      for (my $j=0;$j<=$#objsort;$j++) {
+         if ((split(/\:/,$objsort[$j]))[0]==$data1[0]) {
+            $kj=$j;
+         }
+      }
+      if ($kj!=-1) { $objsort[$kj].=':'.$data1[1]; }
+     }
+   }
+    for ($k=0;$k<=$#objsort;$k++) {
+      for ($j=0;$j<=$#objsort;$j++) {
+        if ($k!=$j) {
+          @data1=split(/\:/,$objsort[$k]);
+          @data2=split(/\:/,$objsort[$j]);
+          my $dol=$#data1+1;
+          my $dtl=$#data2+1;
+          if ($dol+$dtl<1000) {
+           for ($kj=1;$kj<$dol;$kj++) {
+             if ($data1[$kj]==$data2[0]) {
+                for ($ij=1;$ij<$dtl;$ij++) {
+                   $data1[$#data1+1]=$data2[$ij];
+                }
+             }
+           }
+           for ($kj=1;$kj<$dtl;$kj++) {
+             if ($data2[$kj]==$data1[0]) {
+                 for ($ij=1;$ij<$dol;$ij++) {
+                    $data2[$#data2+1]=$data1[$ij];
+                 }
+             }
+           }
+           $objsort[$k]=join(':',@data1);
+           $objsort[$j]=join(':',@data2);
+          }
+         }
+      } 
+  }
+# ---------------------------------------------------------------- Now sort out
+
+    @objsort=sort {
+      my @data1=split(/\:/,$a);
+      my @data2=split(/\:/,$b);
+      my $rvalue=0;
+      my $k;
+      for ($k=1;$k<=$#data1;$k++) {
+         if ($data1[$k]==$data2[0]) { $rvalue--; }
+      }
+      for ($k=1;$k<=$#data2;$k++) {
+         if ($data2[$k]==$data1[0]) { $rvalue++; }
+      }
+      if ($rvalue==0) { $rvalue=$#data2-$#data1; }
+      $rvalue;
+    } @objsort;
+
+    my @outres=();
+    undef @outres;
+
+    for ($k=0;$k<=$#objsort;$k++) {
+	$outres[$k]=$theseres[(split(/\:/,$objsort[$k]))[0]];
+    }
+    return @outres;
+}
+
 # --------------------------------------------------------- Build up RAT screen
 sub ratedt {
   my ($r,$url)=@_;
@@ -163,6 +274,33 @@ sub buttons {
     return $output.'</form><hr>';
 }
 
+# ----------------------------------------------------------- Paste into target
+# modifies @order, @resources
+
+sub pastetarget {
+    my ($after,@which)=@_;
+    my @insertorder=();
+    foreach (@which) {
+        if (defined($_)) {
+	    my ($name,$url)=split(/\=/,$_);
+	    my $idx=$#resources+1;
+            $insertorder[$#insertorder+1]=$idx;
+            my $ext='false';
+            if ($url=~/^http\:\/\//) { $ext='true'; }
+            $resources[$idx]=$name.':'.$url.':normal:'.$ext.':res';
+        }
+    }
+    print "insertorder:".join(',',@insertorder).'<br>';
+    print "order:".join(',',@order).'<br>';
+    my @oldorder=splice(@order,$after,$#insertorder+1,@insertorder);
+    print "oldorder:".join(',',@oldorder).'<br>';
+    print "order:".join(',',@order).'<br>';
+    @order=push(@order,@oldorder);
+    print "order:".join(',',@order).'<br>';
+}
+
+# ------------------------------------------------------- Simple edit processor
+
 sub smpedt {
    my ($r,$errtext)=@_;
    my $buttons=&buttons(2);
@@ -193,7 +331,7 @@ sub smpedt {
    my $importdetail=$ENV{'form.curimpdetail'};
 
 # ---------------------------------------------------- Importing from groupsort
-   if ($ENV{'form.importdetail'}) {
+   if (($ENV{'form.importdetail'}) && (!$ENV{'form.impfortarget'})) {
 
        $importdetail='';
        my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
@@ -209,8 +347,7 @@ sub smpedt {
        for (my $i=0;$i<=$lastsel;$i++) {
            my ($name,$url)=split(/\=/,$curimport[$i]);
            if ($url) {
-              $importdetail.='&'.&Apache::lonnet::escape($name).'='.
-		 	         &Apache::lonnet::escape($url);
+              $importdetail.='&'.$name.'='.$url;
 	   }
        }
 
@@ -219,8 +356,7 @@ sub smpedt {
        for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
            my ($name,$url)=split(/\=/,$curimport[$i]);
            if ($url) {
-              $importdetail.='&'.&Apache::lonnet::escape($name).'='.
-		 	         &Apache::lonnet::escape($url);
+              $importdetail.='&'.$name.'='.$url;
 	  }
        }
        $importdetail=~s/\&+/\&/g;
@@ -239,15 +375,65 @@ sub smpedt {
        for (my $i=0;$i<=$#curimport;$i++) {
            my ($name,$url)=split(/\=/,$curimport[$i]);
            if ($url) {
+              $importdetail.='&'.$name.'='.$url;
+	   }
+       }
+# --------------------------------------------------------- Loading another map
+   } elsif ($ENV{'form.loadmap'}) {
+       $importdetail='';
+       my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
+
+       my $lastsel;
+
+       if (defined($importselect[-1])) {
+	   $lastsel=$importselect[-1];
+       } else {
+           $lastsel=$#curimport;
+       }
+
+       for (my $i=0;$i<=$lastsel;$i++) {
+           my ($name,$url)=split(/\=/,$curimport[$i]);
+           if ($url) {
+              $importdetail.='&'.$name.'='.$url;
+	   }
+       }
+
+       foreach (
+    &attemptread(&Apache::lonnet::filelocation('',$ENV{'form.importmap'}))) {
+	   my ($name,$url)=split(/\:/,$_);
+           if ($url) {
               $importdetail.='&'.&Apache::lonnet::escape($name).'='.
 		 	         &Apache::lonnet::escape($url);
-	   }
+	  }
        }
-# ---------------------------
-   }
 
-# ------------------------------------------------------------ Assemble windows
+       for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
+           my ($name,$url)=split(/\=/,$curimport[$i]);
+           if ($url) {
+              $importdetail.='&'.$name.'='.$url;
+	  }
+       }
+       $importdetail=~s/\&+/\&/g;
+       $importdetail=~s/^\&//;
 
+# ------------------------------------------------ Groupimport/search to target
+   } elsif ($ENV{'form.importdetail'}) {
+       my $lastsel;
+
+       if (defined($targetselect[-1])) {
+	   $lastsel=$targetselect[-1];
+       } else {
+           $lastsel=$#order;
+       }
+       &pastetarget($lastsel,split(/\&/,$ENV{'form.importdata'}));
+# ------------------------------------------------------------------------- Cut
+   } elsif ($ENV{'form.cut'}) {
+# ----------------------------------------------------------------------- Paste
+   } elsif ($ENV{'form.paste'}) {
+# ------------------------------------------------ 
+   }
+# ------------------------------------------------------------ Assemble windows
+   
    my $idx=-1;
    my $importwindow=join("\n",map {
        $idx++;
@@ -268,7 +454,7 @@ sub smpedt {
        $targetdetail.='&'.&Apache::lonnet::escape($name).'='.
 	                  &Apache::lonnet::escape($url);
        $idx++;
-       '<option value="'.$idx.'_'.$_.'">'.$name.'</option>';
+       '<option value="'.$idx.'">'.$name.'</option>';
    } @order);
 
 # ----------------------------------------------------- Start simple RAT screen
@@ -378,6 +564,25 @@ function idxcheck(mode) {
         editbrowser = open(url,title,options,'1');
         editbrowser.focus();
     }
+
+   function openview(entry) {
+       var url=unescape((entry.split('='))[1]);
+       var parts=new Array;
+       parts=url.split('&colon;');
+       url=parts.join(':');
+       if (url) { open(url,'cat'); }
+   }
+
+   function viewtarget() {
+       openview((document.forms.simpleedit.targetdetail.value.split('&'))
+                [document.forms.simpleedit.target.selectedIndex+1]);
+   }
+
+   function viewimport() {
+       openview((document.forms.simpleedit.curimpdetail.value.split('&'))
+                [document.forms.simpleedit.import.selectedIndex+1]);
+   }
+
 </script>
 </head>                 
 <body bgcolor='#FFFFFF'>
@@ -401,9 +606,17 @@ value="Browse"><input type=submit name=l
 <input type=submit name="discard" value="Discard Selected">
 <input type=submit name="clear" value="Clear All">
 <input type=button onClick="javascript:viewimport()" value="View">
+
     </td><td>&nbsp;</td><td bgcolor="#FFFFCC">
-<input type=button onClick="javascript:viewtarget()" value="View">
+
+<input type=button onClick=
+"javascript:impfortarget.value=1;groupsearch()" value="Group Search">
+<input type=button onClick=
+"javascript:impfortarget.value=1;groupimport();" value="Group Import">
+after selected
+<hr><input type=button onClick="javascript:viewtarget()" value="View">
 </td></tr>
+
 <tr><td bgcolor="#FFFFCC"><select name="import" multiple>
 $importwindow
 </select>
@@ -422,6 +635,7 @@ $targetwindow
 <input type=hidden name=importdetail value="">
 <input type=hidden name=curimpdetail value="$importdetail">
 <input type=hidden name=targetdetail value="$targetdetail">
+<input type=hidden name=impfortarget value="0">
 </form>
 </body></html>
 ENDSMPHEAD
@@ -443,12 +657,12 @@ ENDNODIR
 # ---------------------------------------------------------------- View Handler
 
 sub viewmap {
-    my ($r,$adv,$errtext)=@_;
+    my ($r,$url,$adv,$errtext)=@_;
     $r->print('<html><body bgcolor="#FFFFFF">'.&buttons($adv));
     if ($errtext) {
 	$r->print($errtext.'<hr>');
     }
-    foreach (@resources) {
+    foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
 	if (defined($_)) {
 	    my ($title,$url)=split(/\:/,$_);
             $title=~s/\&colon\;/\:/g;
@@ -511,7 +725,7 @@ sub handler {
   } elsif ($ENV{'form.forcesmp'}) {
       &smpedt($r,$errtext);
   } else {
-      &viewmap($r,$adv,$errtext);
+      &viewmap($r,$url,$adv,$errtext);
   }
   return OK;
 }