--- rat/lonratedt.pm 2002/05/10 15:42:16 1.7
+++ rat/lonratedt.pm 2002/05/13 19:38:32 1.14
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Edit Handler for RAT Maps
#
-# $Id: lonratedt.pm,v 1.7 2002/05/10 15:42:16 www Exp $
+# $Id: lonratedt.pm,v 1.14 2002/05/13 19:38:32 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,6 +37,95 @@ use Apache::Constants qw(:common);
use Apache::lonnet;
use Apache::lonratsrv;
+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,$number,$content)=split(/\<\:\>/,$_);
+ if ($command eq 'objcont') {
+ $resources[$number]=$content;
+ }
+ if ($command eq 'objlinks') {
+ $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 has branchings. Use advanced editor.',1);
+ }
+ $starters[$start]=1;
+ $endings[$end]=1;
+ if ($cond) {
+ return
+ ('Map has conditions. Use advanced editor.',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;
+}
+
# --------------------------------------------------------- Build up RAT screen
sub ratedt {
my ($r,$url)=@_;
@@ -58,11 +147,129 @@ sub ratedt {
ENDDOCUMENT
}
+# ---------------------------------------------------------------- Make buttons
+
+sub buttons {
+ my $adv=shift;
+ my $output='
';
+}
+
sub smpedt {
- my ($r,$fn)=@_;
- my $errtext='';
- my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,$errtext);
- my @loadelements=split(/\<\&\>/,$outtext);
+ 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=sort($ENV->{'form.import'});
+ } else {
+ @importselect=($ENV{'form.import'});
+ }
+ }
+ if (defined($ENV{'form.target'})) {
+ if (ref($ENV{'form.target'})) {
+ @targetselect=sort($ENV->{'form.target'});
+ } else {
+ @targetselect=($ENV{'form.target'});
+ }
+ }
+# ============================================================ Process commands
+
+ my $targetdetail=$ENV{'form.targetdetail'};
+ my $importdetail=$ENV{'form.curimpdetail'};
+
+# ---------------------------------------------------- Importing from groupsort
+ if ($ENV{'form.importdetail'}) {
+
+ $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.='&'.&Apache::lonnet::escape($name).'='.
+ &Apache::lonnet::escape($url);
+ }
+ }
+
+ $importdetail.='&'.$ENV{'form.importdetail'};
+
+ 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=~s/\&+/\&/g;
+ $importdetail=~s/^\&//;
+
+# ------------------------------------------------------------------- Clear all
+ } elsif ($ENV{'form.clear'}) {
+ $importdetail='';
+# ------------------------------------------------------------ Discard selected
+ } elsif ($ENV{'form.discard'}) {
+ $importdetail='';
+ my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
+ foreach (@importselect) {
+ $curimport[$_]='';
+ }
+ for (my $i=0;$i<=$#curimport;$i++) {
+ my ($name,$url)=split(/\=/,$curimport[$i]);
+ if ($url) {
+ $importdetail.='&'.&Apache::lonnet::escape($name).'='.
+ &Apache::lonnet::escape($url);
+ }
+ }
+# ---------------------------
+ }
+
+# ------------------------------------------------------------ Assemble windows
+
+ my $idx=-1;
+ my $importwindow=join("\n",map {
+ $idx++;
+ if ($_) {
+ my ($name)=split(/\=/,$_);
+ unless ($name) { $name='UNKNOWN'; }
+ '';
+ }
+ } split(/\&/,$importdetail));
+
+ $idx=0;
+ my $targetwindow=join("\n",map {
+ my ($name,$url)=split(/\:/,$resources[$_]);
+ unless ($name) { $name='UNKNOWN'; }
+ $targetdetail.='&'.&Apache::lonnet::escape($name).'='.
+ &Apache::lonnet::escape($url);
+ $idx++;
+ '';
+ } @order);
+
+# ----------------------------------------------------- Start simple RAT screen
$r->print(<
@@ -148,21 +355,49 @@ function idxcheck(mode) {
-
+