--- rat/lonratedt.pm	2002/05/10 18:58:04	1.8
+++ rat/lonratedt.pm	2002/05/13 15:36:05	1.12
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Edit Handler for RAT Maps
 #
-# $Id: lonratedt.pm,v 1.8 2002/05/10 18:58:04 www Exp $
+# $Id: lonratedt.pm,v 1.12 2002/05/13 15:36:05 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -37,39 +37,92 @@ use Apache::Constants qw(:common);
 use Apache::lonnet;
 use Apache::lonratsrv;
 
-my @links=();
+my @order=();
 my @resources=();
 
 
 # Mapread read maps into global arrays @links and @resources, determines status
-
+# sets @order - pointer to resources in right order
+# sets @resources - array with the resources with correct idx
+#
 sub mapread {
     my $fn=shift;
 
+    my @links;
     undef @links;
     undef @resources;
+    undef @order;
 
     my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');
     if ($errtext) { return ($errtext,2); }
 
+# -------------------------------------------------------------------- Read map
     foreach (split(/\<\&\>/,$outtext)) {
-	my ($command,$parms)=split(/\<\:\>/,$_);
-        my @item=split(/\:/,$parms);
+	my ($command,$number,$content)=split(/\<\:\>/,$_);
         if ($command eq 'objcont') {
+	    $resources[$number]=$content;
         }
         if ($command eq 'objlinks') {
-	    if (defined($links[$item[0]])) {
+            $links[$number]=$content;
+        }
+    }
+# ------------------------------------------------------- Is this a linear map?
+    my @starters=();
+    my @endings=();
+    undef @starters;
+    undef @endings;
+
+    foreach (@links) {
+        if (defined($_)) {
+	    my ($start,$end,$cond)=split(/\:/,$_);
+            if ((defined($starters[$start])) || (defined($endings[$end]))) { 
 		return
-                 ('Map too complex, has branchings. Use advanced editor.',1);
+                 ('Map has branchings. Use advanced editor.',1);
             }
-	    if ($links[$item[2]]) {
+	    $starters[$start]=1;
+	    $endings[$end]=1;
+	    if ($cond) {
 		return
-                 ('Map too complex, has conditions. Use advanced editor.',1);
+                 ('Map has conditions. Use advanced editor.',1);
             }
-	    $links[$item[0]]=$item[1];
 	}
 
     }
+    for (my $i=0; $i<=$#resources; $i++) {
+        if (defined($resources[$i])) {
+	    unless (($starters[$i]) || ($endings[$i])) {
+                return
+		 ('Map has unconnected resources. Use advanced editor.',1);
+            }
+        }
+    }
+
+# -------------------------------------------------- This is a linear map, sort
+
+    my $startidx=0;
+    my $endidx=0;
+    for (my $i=0; $i<=$#resources; $i++) {
+        if (defined($resources[$i])) {
+            my ($title,$url,$ext,$type)=split(/\:/,$resources[$i]);
+	    if ($type eq 'start') { $startidx=$i; }
+            if ($type eq 'finish') { $endidx=$i; }
+        }
+    }
+    my $k=0;
+    my $currentidx=$startidx;
+    $order[$k]=$currentidx;
+    for (my $i=0; $i<=$#resources; $i++) {
+        foreach (@links) {
+	    my ($start,$end)=split(/\:/,$_);
+            if ($start==$currentidx) {
+		$currentidx=$end;
+                $k++;
+                $order[$k]=$currentidx;
+                last;
+            }
+        }
+        if ($currentidx==$endidx) { last; }
+    }
     return $errtext;
 }
 
@@ -113,6 +166,48 @@ sub buttons {
 sub smpedt {
    my ($r,$errtext)=@_;
    my $buttons=&buttons(2);
+
+# ---------------------------------------------------------- Process form input
+
+   my @importselect=();
+   my @targetselect=();
+   undef @importselect;
+   undef @targetselect;
+   if (defined($ENV{'form.import'})) {
+       if (ref($ENV{'form.import'})) {
+	   @importselect=$ENV->{'form.import'};
+       } else {
+           @importselect=($ENV{'form.import'});
+       }
+   }
+   if (defined($ENV{'form.target'})) {
+       if (ref($ENV{'form.target'})) {
+	   @targetselect=$ENV->{'form.target'};
+       } else {
+           @targetselect=($ENV{'form.target'});
+       }
+   }
+# --------------------------------------------------------- 
+
+   my $targetdetail=();
+
+   my @imporder=();
+   my @impresources=();
+   my $importdetail='';
+# ------------------------------------------------------------ Assemble windows
+
+   my $importwindow=join("\n",map { 
+       my ($name)=split(/\:/,$impresources[$_]);
+       unless ($name) { $name='UNKNOWN'; }
+       '<option value="'.$_.'">'.$name.'</option>';
+   } @imporder);
+
+   my $targetwindow=join("\n",map { 
+       my ($name)=split(/\:/,$resources[$_]);
+       unless ($name) { $name='UNKNOWN'; }
+       '<option value="'.$_.'">'.$name.'</option>';
+   } @order);
+
 # ----------------------------------------------------- Start simple RAT screen
    $r->print(<<ENDSMPHEAD);
 <html>
@@ -201,15 +296,42 @@ function idxcheck(mode) {
 <body bgcolor='#FFFFFF'>
 $buttons
 <font color=red>$errtext</font>
-<a href="javascript:groupsearch()">Group Search</a>
-<a href="javascript:groupimport()">Group Import</a>
-
+<form method=post>
+<input type=hidden name=forcesmp value=1>
+<table>
+    <tr><th width="40%">Import</th>
+<th>&nbsp;</th>
+<th width="40%">Target</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:viewimport()" value="View">
+    </td><td>&nbsp;</td><td bgcolor="#FFFFCC">
+<input type=button onClick="javascript:viewtarget()" value="View">
+</td></tr>
+<tr><td bgcolor="#FFFFCC"><select name="import" multiple>
+$importwindow
+</select>
+</td>
+<td bgcolor="#FFFFAA" align="center">
+Cut selected<br>
+<input type=submit name=cut value='<<<'><p>
+<hr>
+Paste after selected<br>
+<input type=submit name=paste value='>>>'>
+</td>
+<td bgcolor="#FFFFCC"><select name="target" multiple>
+$targetwindow
+</select>
+</table>
+<input type=hidden name=importdetail value="$importdetail">
+<input type=hidden name=targetdetail value="$targetdetail">
+</form>
+</body></html>
 ENDSMPHEAD
-
-    $r->print(
-      '<input type=submit name=forcesmp value="Store"></form></body></html>');
 }
 
+# ----------------------------------------------------------------- No such dir
 sub nodir {
    my ($r,$dir)=@_;
    $dir=~s/^\/home\/\w+\/public\_html//;
@@ -225,9 +347,25 @@ ENDNODIR
 # ---------------------------------------------------------------- View Handler
 
 sub viewmap {
-    my ($r,$adv)=@_;
+    my ($r,$adv,$errtext)=@_;
     $r->print('<html><body bgcolor="#FFFFFF">'.&buttons($adv));
-
+    if ($errtext) {
+	$r->print($errtext.'<hr>');
+    }
+    foreach (@resources) {
+	if (defined($_)) {
+	    my ($title,$url)=split(/\:/,$_);
+            $title=~s/\&colon\;/\:/g;
+            $url=~s/\&colon\;/\:/g;
+            unless ($title) { $title='<i>Unknown</i>'; }
+            if ($url) {
+		$r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">');
+            }
+            $r->print(&Apache::lonratsrv::qtescape($title));
+            if ($url) { $r->print('</a>'); }
+            $r->print('<br>');
+        }
+    }
     $r->print('</body></html>');
 }
 
@@ -276,7 +414,7 @@ sub handler {
   } elsif ($ENV{'form.forcesmp'}) {
       &smpedt($r,$errtext);
   } else {
-      &viewmap($r,$adv);
+      &viewmap($r,$adv,$errtext);
   }
   return OK;
 }