--- rat/lonratedt.pm 2002/05/10 15:42:16 1.7 +++ rat/lonratedt.pm 2002/05/11 23:23:01 1.10 @@ -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.10 2002/05/11 23:23:01 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,26 @@ sub ratedt { ENDDOCUMENT } +# ---------------------------------------------------------------- Make buttons + +sub buttons { + my $adv=shift; + my $output='
'; + if ($adv==1) { + $output.=''; + } else { + unless ($adv==2) { + $output.=''; + } + $output.=''; + } + return $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); +# ----------------------------------------------------- Start simple RAT screen $r->print(< @@ -148,17 +252,13 @@ function idxcheck(mode) { -
-
+$buttons $errtext Group Search Group Import ENDSMPHEAD - $r->print('
');
-   foreach (@loadelements) { $r->print($_."\n") }
-			     $r->print('
'); + $r->print( '
'); } @@ -175,6 +275,31 @@ sub nodir { ENDNODIR } +# ---------------------------------------------------------------- View Handler + +sub viewmap { + my ($r,$adv,$errtext)=@_; + $r->print(''.&buttons($adv)); + if ($errtext) { + $r->print($errtext.'
'); + } + foreach (@resources) { + if (defined($_)) { + my ($title,$url)=split(/\:/,$_); + $title=~s/\&colon\;/\:/g; + $url=~s/\&colon\;/\:/g; + unless ($title) { $title='Unknown'; } + if ($url) { + $r->print(''); + } + $r->print(&Apache::lonratsrv::qtescape($title)); + if ($url) { $r->print(''); } + $r->print('
'); + } + } + $r->print(''); +} + # ================================================================ Main Handler sub handler { @@ -192,6 +317,8 @@ sub handler { &nodir($r,$dir); return OK; } + +# ------------------------------------------- Determine which tools can be used my $adv=0; unless ($ENV{'form.forcesmp'}) { @@ -203,10 +330,22 @@ sub handler { } } - if ($adv) { + my $errtext=''; + my $fatal=0; + +# -------------------------------------------------------------------- Load map + ($errtext,$fatal)=&mapread($fn,$errtext); + + if ($fatal==1) { $adv=1; } + +# ----------------------------------- adv==1 now means "graphical MUST be used" + + if ($ENV{'form.forceadv'}) { &ratedt($r,$url); + } elsif ($ENV{'form.forcesmp'}) { + &smpedt($r,$errtext); } else { - &smpedt($r,$fn); + &viewmap($r,$adv,$errtext); } return OK; }