Diff for /rat/lonratedt.pm between versions 1.31.2.1 and 1.101

version 1.31.2.1, 2002/08/30 22:28:05 version 1.101, 2010/08/24 09:11:40
Line 25 Line 25
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 # (TeX Content Handler  
 #  
 # 05/29/00,05/30 Gerd Kortemeyer)  
 # 7/1,6/30 Gerd Kortemeyer  
   
 package Apache::lonratedt;  package Apache::lonratedt;
   
 use strict;  use strict;
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::lonnet;  use Apache::lonnet;
 use Apache::lonratsrv;  use Apache::lonsequence();
 use Apache::lonsequence;  use Apache::loncommon();
   use Apache::lonlocal;
 use vars qw(@order @resources);  use LONCAPA::map();
   use File::Copy;
   use LONCAPA;
 # Mapread read maps into global arrays @links and @resources, determines status  use HTML::Entities();
 # sets @order - pointer to resources in right order  
 # sets @resources - array with the resources with correct idx  
 #  
 sub mapread {  
     my $fn=shift;  
   
     my @links;  # --------------------------------------------------------- Build up RAT screen
     undef @links;  sub ratedt {
     undef @resources;    my ($r,$url)=@_;
     undef @order;    my %layout = ('border' => "0",
     @resources=('');                  'rows'   => "1,250,*");
     @order=();    my $js ='
   <script type="text/javascript">
     my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');      var flag=0;
     if ($errtext) { return ($errtext,2); }  </script>';
   
 # -------------------------------------------------------------------- Read map  
     foreach (split(/\<\&\>/,$outtext)) {  
  my ($command,$number,$content)=split(/\<\:\>/,$_);  
         if ($command eq 'objcont') {  
     $resources[$number]=$content;  
         }  
         if ($command eq 'objlinks') {  
             $links[$number]=$content;  
         }  
         if ($command eq 'objparms') {  
     return('Map has resource parameters. Use advanced editor.',1);  
         }  
     }  
 # ------------------------------------------------------- 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);  
             }  
  }  
   
     }    my $start_page = 
     for (my $i=1; $i<=$#resources; $i++) {        &Apache::loncommon::start_page('Edit Sequence',$js,
         if (defined($resources[$i])) {       {'frameset'    => 1,
     unless (($starters[$i]) || ($endings[$i])) {        'add_entries' => \%layout});
                 return  
  ('Map has unconnected resources. Use advanced editor.',1);  
             }  
         }  
     }  
   
 # -------------------------------------------------- This is a linear map, sort    my $end_page = 
         &Apache::loncommon::end_page({'frameset' => 1});
   
     my $startidx=0;    $r->print(<<ENDDOCUMENT);
     my $endidx=0;  $start_page
     for (my $i=0; $i<=$#resources; $i++) {  <frame name="server" src="$url/loadonly/ratserver" noresize="noresize"
         if (defined($resources[$i])) {         noscroll="noscroll" />
             my ($title,$url,$ext,$type)=split(/\:/,$resources[$i]);  <frame name="code" src="$url/loadonly/adveditmenu" />
     if ($type eq 'start') { $startidx=$i; }  <frame name="mapout" src="/adm/rat/map.html" />
             if ($type eq 'finish') { $endidx=$i; }  $end_page
         }  ENDDOCUMENT
     }  
     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;  
 }  }
   
 # ---------------------------------------------- Read a map as well as possible  # ---------------------------------------------------------------- Make buttons
 # Also used by the sequence handler  
 # Call lonsequence::attemptread to read from resource space  
 #  
 sub attemptread {  
     my $fn=shift;  
   
     my @links;  sub buttons {
     undef @links;      my $adv=shift;
     my @theseres;      my $output='<form method="post">';     
     undef @theseres;      if ($adv==1) {
           $output.=
     my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');              '<input type="submit" name="forceadv"'
     if ($errtext) { return @theseres }             .' value="'.&mt('Edit').'" />'
              .&Apache::loncommon::help_open_topic(
 # -------------------------------------------------------------------- Read map                  'Sequence_Advanced_Editor_Creation');
     foreach (split(/\<\&\>/,$outtext)) {      } else {
  my ($command,$number,$content)=split(/\<\:\>/,$_);          unless ($adv==2) {
         if ($command eq 'objcont') {             $output.=
     $theseres[$number]=$content;                 '<input type="submit" name="forcesmp"'
         }                .' value="'.&mt('Simple Edit').'" />'
         if ($command eq 'objlinks') {                .&Apache::loncommon::help_open_topic(
             $links[$number]=$content;                     'Sequence_Simple_Editor_Creation')
         }                .' ';
     }          }
           $output.=
               '<input type="submit" name="forceadv"'
              .' value="'.&mt('Advanced Edit').'" />'
              .&Apache::loncommon::help_open_topic(
                   'Sequence_Advanced_Editor_Creation');
       }
       return $output.'</form>';
   }
   
   # ----------------------------------------------------------------- Edit script
   sub editscript {
       my $mode=shift;
       my $resurl=
    &Apache::loncommon::escape_single(&Apache::loncommon::lastresurl());
       return(<<ENDSCRIPT);
   var srch;
   var srchflag=-1; // 1 means currently open
                    // 0 means closed (but has been open)
                    // -1 means never yet opened/defined
   var srchmode='';
   
 # --------------------------------------------------------------- Sort, sort of  var idx;
   var idxflag=-1; // 1 means currently open
                    // 0 means closed (but has been open)
                    // -1 means never yet opened/defined
   var idxmode='';
   
     my @objsort=();  // ------------------------------------------------------ Clears indexer window
     undef @objsort;  function idxclear() {
     idx.document.clear();
   }
   
     my @data1=();  // ------------------------------------------------------- Clears search window
     my @data2=();  function srchclear() {
     undef @data1;    srch.document.clear();
     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++) {  // ------------------------------------------------------ Closes indexer window
      if (defined($links[$k])) {  function idxclose() {
       @data1=split(/\:/,$links[$k]);    if (idx && !idx.closed) {
       $kj=-1;      idxflag=0;
       for (my $j=0;$j<=$#objsort;$j++) {      idx.close();
          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  // ------------------------------------------------------- Closes search window
 sub ratedt {  function srchclose() {
   my ($r,$url)=@_;    if (srch && !srch.closed) {
   $r->print(<<ENDDOCUMENT);      srchflag=0;
       srch.close();
 <html>    }
 <head>  
 <script language="JavaScript">  
     var flag=0;  
 </script>  
 </head>  
 <frameset rows="1,50,*" border=0>  
 <frame name=server src="$url/loadonly/ratserver" noresize noscroll>  
 <frame name=code src="/adm/rat/code.html">  
 <frame name=mapout src="/adm/rat/map.html">  
 </frameset>  
 </html>  
   
 ENDDOCUMENT  
 }  }
   
 # ---------------------------------------------------------------- Make buttons  // -------------------------------------------------------- Open indexer window
   function idxopen(mode) {
      var options="scrollbars=1,resizable=1,menubar=0,location=1,toolbar=1";
      idxmode=mode;
      idxflag=1;
      idx=open('$resurl/?inhibitmenu=yes&launch=1&mode=$mode&catalogmode='+mode,'idxout',options);
      idx.focus();
   }
   
 sub buttons {  // ------------------------------------------------------ Open groupsort window
     my $adv=shift;  function groupopen(url,recover) {
     my $output='<form method=post>';          var options="scrollbars=1,resizable=1,menubar=0";
     if ($adv==1) {     idxflag=1;
  $output.='<input type=submit name=forceadv value="Edit">';     idx=open("/adm/groupsort?inhibitmenu=yes&mode=$mode&recover="+recover+"&readfile="+url,"idxout",options);
     } else {     idx.focus();
         unless ($adv==2) {  
            $output.='<input type=submit name=forcesmp value="Simple Edit">';  
         }  
  $output.='<input type=submit name=forceadv value="Advanced Edit">';  
     }  
     return $output.'</form><hr>';  
 }  }
   
 # ----------------------------------------------------------- Paste into target  // --------------------------------------------------------- Open search window
 # modifies @order, @resources  function srchopen(mode) {
      var options="scrollbars=1,resizable=1,menubar=0";
      srchmode=mode;
      srchflag=1;
      srch=open("/adm/searchcat?inhibitmenu=yes&launch=1&mode=$mode&catalogmode="+mode,"srchout",options);
      srch.focus();
   }
   // ----------------------------------------------------- launch indexer browser
   function groupsearch() {
      srchcheck('import');
   }
   
 sub pastetarget {  function groupimport() {
     my ($after,@which)=@_;     idxcheck('import');
     my @insertorder=();  
     foreach (@which) {  
         if (defined($_)) {  
     my ($name,$url)=split(/\=/,$_);  
             $name=&Apache::lonnet::unescape($name);  
             $url=&Apache::lonnet::unescape($url);  
             if ($url) {  
        my $idx=$#resources+1;  
                $insertorder[$#insertorder+1]=$idx;  
                my $ext='false';  
                if ($url=~/^http\:\/\//) { $ext='true'; }  
                $url=~s/\:/\&colon;/g;  
                $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res';  
    }  
         }  
     }  
     my @oldorder=splice(@order,$after);  
     @order=(@order,@insertorder,@oldorder);  
 }  }
   
 # ------------------------------------------------ Get start and finish correct  // ------------------------------------------------------- Do srch status check
 # modifies @resources  function srchcheck(mode) {
      if (!srch || srch.closed || srchmode!=mode) {
         srchopen(mode);
      }
      srch.focus();
   }
   
 sub startfinish {  // -------------------------------------------------------- Do idx status check
     foreach (@order) {  function idxcheck(mode) {
  my ($name,$url,$ext)=split(/\:/,$resources[$_]);     if (!idx || idx.closed || idxmode!=mode) {
         if ($url=~/http\&colon\:\/\//) { $ext='true'; }        idxopen(mode);
         $resources[$_]=$name.':'.$url.':'.$ext.':normal:res';  
     }  
    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]]);     idx.focus();
    $resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res';  
 }  }
   
 # ------------------------------------------------------------------- Store map  
   
 sub storemap {      var editbrowser;
     my $fn=shift;      function openbrowser(formname,elementname,only,omit) {
     &startfinish();          var url = '$resurl/?';
     my $output='graphdef<:>no';          if (editbrowser == null) {
     my $k=1;              url += 'launch=1&';
     for (my $i=0; $i<=$#order; $i++) {  
         if (defined($resources[$order[$i]])) {  
     $output.='<&>objcont<:>'.$order[$i].'<:>'.$resources[$order[$i]];  
         }          }
         if (defined($order[$i+1])) {          url += 'inhibitmenu=yes&';
     if (defined($resources[$order[$i+1]])) {          url += 'catalogmode=interactive&';
                $output.='<&>objlinks<:>'.$k.'<:>'.          url += 'mode=edit&';
    $order[$i].':'.$order[$i+1].':0';          url += 'form=' + formname + '&';
        $k++;          if (only != null) {
             }              url += 'only=' + only + '&';
           } 
           if (omit != null) {
               url += 'omit=' + omit + '&';
         }          }
           url += 'element=' + elementname + '';
           var title = 'Browser';
           var options = 'scrollbars=1,resizable=1,menubar=0,toolbar=1,location=1';
           options += ',width=700,height=600';
           editbrowser = open(url,title,options,'1');
           editbrowser.focus();
     }      }
     $output=~s/http\&colon\;\/\///g;  ENDSCRIPT
     $ENV{'form.output'}=$output;  
     return   
      &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,''));  
 }  }
   
 # ------------------------------------------------------- Simple edit processor  # ------------------------------------------------------- Simple edit processor
   
 sub smpedt {  sub smpedt {
    my ($r,$url,$errtext)=@_;     my ($r,$url,$errtext)=@_;
    my $buttons=&buttons(2);     my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';
      my $targetmsg='';
 # ---------------------------------------------------------- Process form input     if ($env{'form.save'}) {
          copy($tmpfn,&Apache::lonnet::filelocation('',$url));
    my @importselect=();         unlink($tmpfn);
    my @targetselect=();         my ($errtext,$fatal)=
    undef @importselect;     &LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$url),'');
    undef @targetselect;         unless ($fatal) {
    if (defined($ENV{'form.importsel'})) {     $targetmsg='<b>'.&mt('Saved.').'</b><br />';
        if (ref($ENV{'form.importsel'})) {  
    @importselect=sort(@{$ENV{'form.importsel'}});  
        } else {         } else {
            @importselect=($ENV{'form.importsel'});     $targetmsg='<b>'.&mt('An error occurred while saving.').'</b><br />';
        }         }
    }     }
    if (defined($ENV{'form.target'})) {     if ($env{'form.revert'}) {
        if (ref($ENV{'form.target'})) {         $targetmsg='<b>'.&mt('Reverted.').'</b><br />';
    @targetselect=sort(@{$ENV{'form.target'}});         unlink($tmpfn);
        } else {         my ($errtext,$fatal)=
            @targetselect=($ENV{'form.target'});     &LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$url),'');
        }     }
      if (-e $tmpfn) {
         $targetmsg=
           '<span class="LC_warning">'.&mt('You are working with an unsaved version of your map.').'</span><br />';
         my ($errtext,$fatal)=&LONCAPA::map::mapread($tmpfn,'');
    }     }
   # ---------------------------------------------------------- Process form input
   
      my @importselect=&Apache::loncommon::get_env_multiple('form.importsel');
      my @targetselect=&Apache::loncommon::get_env_multiple('form.target');
 # ============================================================ Process commands  # ============================================================ Process commands
   
    my $targetdetail=$ENV{'form.targetdetail'};     my $targetdetail=$env{'form.targetdetail'};
    my $importdetail=$ENV{'form.curimpdetail'};     my $importdetail=$env{'form.curimpdetail'};
   
 # ---------------------------------------------------- Importing from groupsort  # ---------------------------------------------------- Importing from groupsort
    if (($ENV{'form.importdetail'}) && (!$ENV{'form.impfortarget'})) {     if (($env{'form.importdetail'}) && (!$env{'form.impfortarget'})) {
   
        $importdetail='';         $importdetail='';
        my @curimport=split(/\&/,$ENV{'form.curimpdetail'});         my @curimport=split(/\&/,$env{'form.curimpdetail'});
   
        my $lastsel;         my $lastsel;
   
Line 402  sub smpedt { Line 275  sub smpedt {
    }     }
        }         }
   
       $importdetail.='&'.$ENV{'form.importdetail'};        $importdetail.='&'.$env{'form.importdetail'};
   
        for (my $i=$lastsel+1;$i<=$#curimport;$i++) {         for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
            my ($name,$url)=split(/\=/,$curimport[$i]);             my ($name,$url)=split(/\=/,$curimport[$i]);
Line 414  sub smpedt { Line 287  sub smpedt {
        $importdetail=~s/^\&//;         $importdetail=~s/^\&//;
   
 # ------------------------------------------------------------------- Clear all  # ------------------------------------------------------------------- Clear all
    } elsif ($ENV{'form.clear'}) {     } elsif ($env{'form.clear'}) {
        $importdetail='';         $importdetail='';
 # ------------------------------------------------------------ Discard selected  # ------------------------------------------------------------ Discard selected
    } elsif ($ENV{'form.discard'}) {     } elsif ($env{'form.discard'}) {
        $importdetail='';         $importdetail='';
        my @curimport=split(/\&/,$ENV{'form.curimpdetail'});         my @curimport=split(/\&/,$env{'form.curimpdetail'});
        foreach (@importselect) {         foreach (@importselect) {
    $curimport[$_]='';     $curimport[$_]='';
        }         }
Line 430  sub smpedt { Line 303  sub smpedt {
    }     }
        }         }
 # --------------------------------------------------------- Loading another map  # --------------------------------------------------------- Loading another map
    } elsif ($ENV{'form.loadmap'}) {     } elsif ($env{'form.loadmap'}) {
        $importdetail='';         $importdetail='';
        my @curimport=split(/\&/,$ENV{'form.curimpdetail'});         my @curimport=split(/\&/,$env{'form.curimpdetail'});
   
        my $lastsel;         my $lastsel;
   
Line 450  sub smpedt { Line 323  sub smpedt {
        }         }
   
        foreach (         foreach (
     &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$ENV{'form.importmap'}))) {      &Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) {
    my ($name,$url)=split(/\:/,$_);     my ($name,$url)=split(/\:/,$_);
            if ($url) {             if ($url) {
               $importdetail.='&'.&Apache::lonnet::escape($name).'='.                $importdetail.='&'.&escape($name).'='.
          &Apache::lonnet::escape($url);           &escape($url);
   }    }
        }         }
   
Line 468  sub smpedt { Line 341  sub smpedt {
        $importdetail=~s/^\&//;         $importdetail=~s/^\&//;
   
 # ------------------------------------------------ Groupimport/search to target  # ------------------------------------------------ Groupimport/search to target
    } elsif ($ENV{'form.importdetail'}) {     } elsif ($env{'form.importdetail'}) {
        my $lastsel;         my $lastsel;
        if (defined($targetselect[-1])) {         if (defined($targetselect[-1])) {
    $lastsel=$targetselect[-1];     $lastsel=$targetselect[-1];
        } else {         } else {
            $lastsel=$#order+1;             $lastsel=$#LONCAPA::map::order+1;
        }         }
        &pastetarget($lastsel,split(/\&/,$ENV{'form.importdetail'}));         &LONCAPA::map::pastetarget($lastsel,split(/\&/,$env{'form.importdetail'}));
        &storemap(&Apache::lonnet::filelocation('',$url));         &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
 # ------------------------------------------------------------------------- Cut  # ------------------------------------------------------------------------- Cut
    } elsif (($ENV{'form.cut'}) || ($ENV{'form.copy'})) {     } elsif (($env{'form.cut'}) || ($env{'form.copy'})) {
        $importdetail='';         $importdetail='';
        my @curimport=split(/\&/,$ENV{'form.curimpdetail'});         my @curimport=split(/\&/,$env{'form.curimpdetail'});
   
        my $lastsel;         my $lastsel;
   
Line 498  sub smpedt { Line 371  sub smpedt {
        }         }
   
        foreach (@targetselect) {         foreach (@targetselect) {
    my ($name,$url)=split(/\:/,$resources[$order[$_-1]]);     my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$LONCAPA::map::order[$_-1]]);
            if ($url) {             if ($url) {
               $importdetail.='&'.&Apache::lonnet::escape($name).'='.                $importdetail.='&'.&escape($name).'='.
          &Apache::lonnet::escape($url);           &escape($url);
   }    }
        }         }
   
Line 514  sub smpedt { Line 387  sub smpedt {
        $importdetail=~s/\&+/\&/g;         $importdetail=~s/\&+/\&/g;
        $importdetail=~s/^\&//;         $importdetail=~s/^\&//;
   
        if ($ENV{'form.cut'}) {         if ($env{'form.cut'}) {
            my @neworder=();             my @neworder=();
            for (my $i=0;$i<=$#order;$i++) {             for (my $i=0;$i<=$#LONCAPA::map::order;$i++) {
                my $include=1;                 my $include=1;
                foreach (@targetselect) {                 foreach (@targetselect) {
    if ($_-1==$i) { $include=0; }     if ($_-1==$i) { $include=0; }
                }                 }
                if ($include) { $neworder[$#neworder+1]=$order[$i]; }                 if ($include) { 
      $neworder[$#neworder+1]=$LONCAPA::map::order[$i]; 
          } else {
      &LONCAPA::map::makezombie($LONCAPA::map::order[$i]);
          }
            }             }
            @order=@neworder;             @LONCAPA::map::order=@neworder;
            &storemap(&Apache::lonnet::filelocation('',$url));                   &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));      
        }         }
   
 # ----------------------------------------------------------------------- Paste  # ----------------------------------------------------------------------- Paste
    } elsif ($ENV{'form.paste'}) {     } elsif ($env{'form.paste'}) {
        my $lastsel;         my $lastsel;
        if (defined($targetselect[-1])) {         if (defined($targetselect[-1])) {
    $lastsel=$targetselect[-1];     $lastsel=$targetselect[-1];
        } else {         } else {
            $lastsel=$#order+1;             $lastsel=$#LONCAPA::map::order+1;
        }         }
        my @newsequence;         my @newsequence;
        my @curimport=split(/\&/,$ENV{'form.curimpdetail'});         my @curimport=split(/\&/,$env{'form.curimpdetail'});
        foreach (@importselect) {         foreach (@importselect) {
           $newsequence[$#newsequence+1]=$curimport[$_];            $newsequence[$#newsequence+1]=$curimport[$_];
        }         }
        &pastetarget($lastsel,@newsequence);         &LONCAPA::map::pastetarget($lastsel,@newsequence);
        &storemap(&Apache::lonnet::filelocation('',$url));         &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
 # ------------------------------------------------   # -------------------------------------------------------------------- Move up 
      } elsif ($env{'form.moveup'}) {
          foreach (sort @targetselect) {
              if ($_-1>0) {
                 my $movethis=$LONCAPA::map::order[$_-1];
                 $LONCAPA::map::order[$_-1]=$LONCAPA::map::order[$_-2];
                 $LONCAPA::map::order[$_-2]=$movethis;
     }
          }
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
   # ------------------------------------------------------------------ Move down
      } elsif ($env{'form.movedown'}) {
          foreach (reverse sort @targetselect) {
              if ($_-1<$#LONCAPA::map::order) {
                 my $movethis=$LONCAPA::map::order[$_-1];
                 $LONCAPA::map::order[$_-1]=$LONCAPA::map::order[$_];
                 $LONCAPA::map::order[$_]=$movethis;
      }
          }
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
   # --------------------------------------------------------------------- Rename
      } elsif ($env{'form.renameres'}) {
          my $residx=$LONCAPA::map::order[$env{'form.renameidx'}-1];
          my ($name,@resrest)=split(/\:/,$LONCAPA::map::resources[$residx]);
          $name=$env{'form.renametitle'};
          $name=~s/\:/\&colon\;/g;
          $LONCAPA::map::resources[$residx]=$name.':'.join(':',@resrest);
          &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
    }     }
 # ------------------------------------------------------------ Assemble windows  # ------------------------------------------------------------ Assemble windows
         
    my $idx=-1;     my $idx=-1;
      $importdetail='&'.$importdetail;
      $importdetail=~s/^\&+/\&/;
    my $importwindow=     my $importwindow=
        '<option value="-1"> ---- Import and Paste Area ---- </option>'.         '<option value="-1"> ---- '.&mt('Import and Paste Area').' ---- </option>'.
      join("\n",map {       join("\n",map {
        $idx++;         $idx++;
        if ($_) {          if ($_) { 
           my ($name,$url)=split(/\=/,$_);            my ($name,$url)=split(/\=/,$_);
           unless ($name) { $name=(split(/\//,$url))[-1]; }            unless ($name) { $name=(split(/\//,$url))[-1]; }
           unless ($name) { $name='EMPTY'; }            unless ($name) { $name='EMPTY'; }
           '<option value="'.$idx.'">'.&Apache::lonnet::unescape($name).            '<option value="'.$idx.'">'.&unescape($name).
                                     '</option>';                                      '</option>';
       }        }
    } split(/\&/,$importdetail));     } split(/\&/,$importdetail));
   
    $idx=0;     $idx=0;
      $targetdetail='';
    my $targetwindow=            my $targetwindow=       
        '<option value="0"> ------- Target Edit Map ------- </option>'.         '<option value="0"> ------- '.&mt('Target Edit Map').' ------- </option>'.
      join("\n",map {        join("\n",map { 
        my ($name,$url)=split(/\:/,$resources[$_]);         my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$_]);
        unless ($name) {  $name=(split(/\//,$url))[-1]; }         unless ($name) {  $name=(split(/\//,$url))[-1]; }
        unless ($name) { $name='EMPTY'; }         unless ($name) { $name='EMPTY'; }
        $targetdetail.='&'.&Apache::lonnet::escape($name).'='.         $name = &LONCAPA::map::qtescape($name);
                   &Apache::lonnet::escape($url);         $url  = &LONCAPA::map::qtescape($url);
          $targetdetail.='&'.&escape($name).'='.
                     &escape($url);
        $idx++;         $idx++;
          $name = &HTML::Entities::encode($name,'\'"<>&');
        '<option value="'.$idx.'">'.$name.'</option>';         '<option value="'.$idx.'">'.$name.'</option>';
    } @order);     } @LONCAPA::map::order);
   
 # ----------------------------------------------------- Start simple RAT screen  # ----------------------------------------------------- Start simple RAT screen
    $r->print(<<ENDSMPHEAD);     my $editscript=&editscript('simple');
 <html>  
 <head>  
 <script>  
 var srch;  
 var srchflag=-1; // 1 means currently open  
                  // 0 means closed (but has been open)  
                  // -1 means never yet opened/defined  
 var srchmode='';  
   
 var idx;  
 var idxflag=-1; // 1 means currently open  
                  // 0 means closed (but has been open)  
                  // -1 means never yet opened/defined  
 var idxmode='';  
   
 // ------------------------------------------------------ Clears indexer window  
 function idxclear() {  
   idx.document.clear();  
 }  
   
 // ------------------------------------------------------- Clears search window  
 function srchclear() {  
   srch.document.clear();  
 }  
   
 // ------------------------------------------------------ Closes indexer window     my %lt=&Apache::lonlocal::texthash(
 function idxclose() {        'sa' => 'Save',
   if (idx && !idx.closed) {        'nt' => 'New Title',
     idxflag=0;        'se' => 'Search',
     idx.close();        'im' => 'Import',
   }                                        'wl' => 'Import from Wishlist',
 }        'vi' => 'View',
         'lm' => 'Load Map',
         'ds' => 'Discard Selected',
         'ca' => 'Clear All',
         'ta' => 'Temporary Assembly Workspace',
         'rv' => 'Revert to Last Saved',
                                         'sa' => 'Save',
                                         'mu' => 'Move Up',
                                         'md' => 'Move Down',
                                         're' => 'Rename',
                                         'as' => 'after selected',
                                         'cs' => 'Cut selected',
                                         'ps' => 'Copy selected',
                                         'pas' => 'Paste after selected',
                                         'reco' => 'Recover Deleted'
         );
      my $js=<<ENDJS;
   <script type="text/javascript">
   
 // ------------------------------------------------------- Closes search window     $editscript
 function srchclose() {  
   if (srch && !srch.closed) {  
     srchflag=0;  
     srch.close();  
   }  
 }  
   
 // -------------------------------------------------------- Open indexer window  
 function idxopen(mode) {  
    var options="scrollbars=1,resizable=1,menubar=0";  
    idxmode=mode;  
    idxflag=1;  
    idx=open("/res/?launch=1&mode=simple&catalogmode="+mode,"idxout",options);  
    idx.focus();  
 }  
   
 // --------------------------------------------------------- Open search window  
 function srchopen(mode) {  
    var options="scrollbars=1,resizable=1,menubar=0";  
    srchmode=mode;  
    srchflag=1;  
    srch=open("/adm/searchcat?launch=1&mode=simple&catalogmode="+mode,"srchout",options);  
    srch.focus();  
 }  
 // ----------------------------------------------------- launch indexer browser  
 function groupsearch() {  
    srchcheck('groupsearch');  
 }  
   
 function groupimport() {  
    idxcheck('groupimport');  
 }  
 // ------------------------------------------------------- Do srch status check  
 function srchcheck(mode) {  
    if (!srch || srch.closed || srchmode!=mode) {  
       srchopen(mode);  
    }  
    srch.focus();  
 }  
   
 // -------------------------------------------------------- Do idx status check  
 function idxcheck(mode) {  
    if (!idx || idx.closed || idxmode!=mode) {  
       idxopen(mode);  
    }  
    idx.focus();  
 }  
   
   
     var editbrowser;  
     function openbrowser(formname,elementname,only,omit) {  
         var url = '/res/?';  
         if (editbrowser == null) {  
             url += 'launch=1&';  
         }  
         url += 'catalogmode=interactive&';  
         url += 'mode=edit&';  
         url += 'form=' + formname + '&';  
         if (only != null) {  
             url += 'only=' + only + '&';  
         }   
         if (omit != null) {  
             url += 'omit=' + omit + '&';  
         }  
         url += 'element=' + elementname + '';  
         var title = 'Browser';  
         var options = 'scrollbars=1,resizable=1,menubar=0';  
         options += ',width=700,height=600';  
         editbrowser = open(url,title,options,'1');  
         editbrowser.focus();  
     }  
   
    function openview(entry) {     function openview(entry) {
        var url=unescape((entry.split('='))[1]);         var url=unescape((entry.split('='))[1]);
        var parts=new Array;         var parts=new Array;
        parts=url.split('&colon;');  
        url=parts.join(':');  
        if (url) { open(url,'cat'); }         if (url) { open(url,'cat'); }
    }     }
   
    function viewtarget() {     function viewtarget() {
        openview((document.forms.simpleedit.targetdetail.value.split('&'))         openview((document.forms.simpleedit.targetdetail.value.split('&'))
                 [document.forms.simpleedit.target.selectedIndex+1]);                  [document.forms.simpleedit.target.selectedIndex]);
    }     }
   
    function viewimport() {     function viewimport() {
        openview((document.forms.simpleedit.curimpdetail.value.split('&'))         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 oldname=unescape((entry.split('='))[0]);
          newtitle=prompt('$lt{'nt'}',oldname);
          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>  </script>
 </head>                   ENDJS
 <body bgcolor='#FFFFFF'>  
 $buttons      &Apache::lonhtmlcommon::clear_breadcrumbs();
 <font color=red>$errtext</font>      &Apache::lonhtmlcommon::add_breadcrumb({
 <h1>$url</h1>          text  => 'Construction Space',
 <form name=simpleedit method=post>          href  => &Apache::loncommon::authorspace(),
 <input type=hidden name=forcesmp value=1>          faq   => 6,
           bug   => 'RAT',
           help  => 'Sequence_Simple_Editor_Creation',});
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'RAT',
           title => 'Resource Assembly Tool',
           href  => '',});
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'Editor',
           title => 'Simple Editor',
           href  => '',});
   
       # Breadcrumbs are included by &start_page
       my $start_page = &Apache::loncommon::start_page('Construction Space',$js)
                       .&Apache::loncommon::head_subbox(
                            &Apache::loncommon::CSTR_pageheader()
                           .&buttons(2));
       my $end_page = &Apache::loncommon::end_page();
   
       $r->print(<<ENDSMPHEAD);
   $start_page
   <span class="LC_error">$errtext</span>
   <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>  <table>
     <tr><th width="40%">Import</th>      <tr><th width="40%">$lt{'ta'}</th>
 <th>&nbsp;</th>  <th>&nbsp;</th>
 <th width="40%">Target</th></tr>  <th width="40%">File: $url</th></tr>
 <tr><td bgcolor="#FFFFCC">  <tr><td bgcolor="#FFFFCC">
 <input type=button onClick="javascript:groupsearch()" value="Group Search">  <input type="button" onClick="javascript:groupsearch()" value="$lt{'se'}" />
 <input type=button onClick="javascript:groupimport();" value="Group Import">  <input type="button" onClick="javascript:groupimport();" value="$lt{'im'}" />
 after selected  $lt{'as'}
 <hr>  <hr />
 <input type=text size=20 name=importmap>  <input type="text" size="20" name="importmap" />
 <input type=button   <input type="button" 
 onClick="javascript:openbrowser('simpleedit','importmap','sequence,page','')"  onClick="javascript:openbrowser('simpleedit','importmap','sequence,page','')"
 value="Browse"><input type=submit name=loadmap value="Load Map"><hr>  value="Select Map" /><input type="submit" name="loadmap" value="$lt{'lm'}" /><hr />
 <input type=submit name="discard" value="Discard Selected">  <input type="submit" name="discard" value="$lt{'ds'}" />
 <input type=submit name="clear" value="Clear All">  <input type="submit" name="clear" value="$lt{'ca'}" />
 <input type=button onClick="javascript:viewimport()" value="View">  <input type="button" onClick="javascript:viewimport()" value="$lt{'vi'}" />
   
     </td><td>&nbsp;</td><td bgcolor="#FFFFCC">      </td><td>&nbsp;</td><td bgcolor="#FFFFCC">
   
 <input type=button onClick=  <input type="button" onClick=
 "javascript:impfortarget.value=1;groupsearch()" value="Group Search">  "javascript:impfortarget.value=1;groupsearch()" value="$lt{'se'}" />
 <input type=button onClick=  <input type="button" onClick=
 "javascript:impfortarget.value=1;groupimport();" value="Group Import">  "javascript:impfortarget.value=1;groupimport();" value="$lt{'im'}" />
 after selected  <input type="button" onClick=
 <hr><input type=button onClick="javascript:viewtarget()" value="View">  "javascript:impfortarget.value=1;open_Wishlist_Import('simple');" value="$lt{'wl'}" />
   <input type="button" onClick=
   "javascript:impfortarget.value=1;groupopen('$url',1);" value="$lt{'reco'}" />
   $lt{'as'}
   <hr />
   <input type="submit" name="moveup" value="$lt{'mu'}" />
   <input type="submit" name="movedown" value="$lt{'md'}" />
   <input type="button" onClick="javascript:renametarget()" value="$lt{'re'}" />
   <hr />$targetmsg
   <input type="submit" name="revert" value="$lt{'rv'}" />
   <input type="submit" name="save" value="$lt{'sa'}" />
   <input type="button" onClick="javascript:viewtarget()" value="$lt{'vi'}" />
 </td></tr>  </td></tr>
   
 <tr><td bgcolor="#FFFFCC"><select name="importsel" size=10 multiple>  <tr><td bgcolor="#FFFFCC"><select name="importsel" size="10" multiple="multiple">
 $importwindow  $importwindow
 </select>  </select>
 </td>  </td>
 <td bgcolor="#FFFFAA" align="center">  <td bgcolor="#FFFFAA" align="center">
 Cut selected<br>  $lt{'cs'}<br />
 <input type=submit name=cut value='<<<'><p>  <input type="submit" name="cut" value="<<<" /><p>
 <hr>  <hr />
 Copy selected<br>  $lt{'ps'}<br />
 <input type=submit name=copy value='<--'><p>  <input type="submit" name="copy" value="<--" /><p>
 <hr>  <h /r>
 Paste after selected<br>  $lt{'pas'}<br />
 <input type=submit name=paste value='-->'>  <input type="submit" name="paste" value="-->" />
 </td>  </td>
 <td bgcolor="#FFFFCC"><select name="target" size=10 multiple>  <td bgcolor="#FFFFCC"><select name="target" size="10" multiple="multiple">
 $targetwindow  $targetwindow
 </select>  </select>
 </table>  </table>
 <input type=hidden name=importdetail value="">  <input type="hidden" name="importdetail" value="" />
 <input type=hidden name=curimpdetail value="$importdetail">  <input type="hidden" name="curimpdetail" value="$importdetail" />
 <input type=hidden name=targetdetail value="$targetdetail">  <input type="hidden" name="targetdetail" value="$targetdetail" />
 <input type=hidden name=impfortarget value="0">  <input type="hidden" name="impfortarget" value="0" />
 </form>  </form>
 </body></html>  $end_page
 ENDSMPHEAD  ENDSMPHEAD
 }  }
   
 # ----------------------------------------------------------------- No such dir  # ----------------------------------------------------------------- No such dir
 sub nodir {  sub nodir {
    my ($r,$dir)=@_;     my ($r,$dir)=@_;
    $dir=~s/^\/home\/\w+\/public\_html//;     $dir=~s{^/home/$LONCAPA::username_re/public_html}{};
    $r->print(<<ENDNODIR);     my $brcrum = [{'href' => &Apache::loncommon::authorspace(),
 <html>                    'text' => 'Construction Space'}];
 <body bgcolor='#FFFFFF'>  #                 {'href' => '',
 <h1>No such directory: $dir</h1>  #                  'text' => 'No such directory'}];
 </body>     $r->print(&Apache::loncommon::start_page('Construction Space',
 </html>                                              undef,
 ENDNODIR                                              {'bread_crumbs' => $brcrum,})
               .&Apache::loncommon::head_subbox(
                    &Apache::loncommon::CSTR_pageheader())
               .'<p class="LC_error">'
               .&mt('No such directory: [_1]','<span class="LC_filename">'.$dir.'</span>'
               .'</p>'
               .&Apache::loncommon::end_page())
      );
 }  }
   
 # ---------------------------------------------------------------- View Handler  # ---------------------------------------------------------------- View Handler
   
 sub viewmap {  sub viewmap {
     my ($r,$url,$adv,$errtext)=@_;      my ($r,$url,$adv,$errtext)=@_;
     $r->print('<html><body bgcolor="#FFFFFF">'.&buttons($adv));  
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'Construction Space',
           href  => &Apache::loncommon::authorspace(),
           faq   => 6,
           bug   => 'RAT',
           help  => 'Sequence_Simple_Editor_Creation',});
       &Apache::lonhtmlcommon::add_breadcrumb({
           text  => 'RAT',
           title => 'Resource Assembly Tool',
           href  => '',});
   
       # Breadcrumbs are included by &start_page
       $r->print(&Apache::loncommon::start_page('Edit Content of a Map')
                .&Apache::loncommon::head_subbox(
                     &Apache::loncommon::CSTR_pageheader()
                    .&buttons($adv))
       );
     if ($errtext) {      if ($errtext) {
  $r->print($errtext.'<hr>');   $r->print('<div class="LC_error">'
                    .$errtext
                    .'</div>'
                    .'<hr />'
           );
     }      }
     my $idx=0;      my $idx=0;
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {      $r->print('<p><span class="LC_filename">'.$url.'</span></p>');
       if ($adv) {
    $r->print('<p class="LC_warning">'
                    .&mt('Map contents are not shown in order.')
                    .'</p><br />'
           );
       }
       $r->print(&Apache::loncommon::start_data_table()
                .&Apache::loncommon::start_data_table_header_row()
                .'<th>'.&mt('Type').'</th>'
                .'<th>'.&mt('Title in map').'</th>'
                .'<th>'.&mt('Filename of resource').'</th>'
                .'<th>'.&mt('Link to published resource').'</th>'
                .'<th>'.&mt('Link to resource in Construction Space').'</th>'
                .&Apache::loncommon::end_data_table_header_row()
       );
       foreach (&LONCAPA::map::attemptread(&Apache::lonnet::filelocation('',$url))) {
  if (defined($_)) {   if (defined($_)) {
             $idx++;              $idx++;
     my ($title,$url)=split(/\:/,$_);      my ($title,$url,$cond)=split(/\:/,$_);
             $title=~s/\&colon\;/\:/g;      if ($cond eq 'cond') { next; }
             $url=~s/\&colon\;/\:/g;              $title= &LONCAPA::map::qtescape($title);
               $url  = &LONCAPA::map::qtescape($url);
             unless ($title) { $title=(split(/\//,$url))[-1] };              unless ($title) { $title=(split(/\//,$url))[-1] };
             unless ($title) { $title='<i>Empty</i>'; }              unless ($title) { $title='<i>'.&mt('Empty').'</i>'; }
               my $resurl = $url;
               my $resfilepath = $Apache::lonnet::perlvar{'lonDocRoot'}.$resurl;
               my $filename; 
               if ($resurl =~ m#/([^/]+)$#) {
                   $filename = $1;
               }
               my $cstrurl = $resurl;
               $cstrurl =~ s#^/res/[^/]+/([^/]+)/#/priv/$1/#;
               $r->print(&Apache::loncommon::start_data_table_row()
                        .'<td>'
                        .'<img src="'.&Apache::loncommon::icon($resfilepath).'" />'
                        .'</td>'
                        .'<td>'
                        .&HTML::Entities::encode(&LONCAPA::map::qtescape($title))
                        .'</td>'
                        .'<td>'.$filename.'</td>'
                        .'<td>'
               );
               if ($url) {
    $r->print('<a href="'.$resurl.'">'.&mt('Resource space').'</a>');
               } else {
                   $r->print('&nbsp;');
               }
               $r->print('</td><td>');
             if ($url) {              if ($url) {
  $r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">');                 $r->print('<a href="'.$cstrurl.'">'.
                            &mt('Construction space').'</a>');
               } else {
                   $r->print('&nbsp;');
             }              }
             $r->print(&Apache::lonratsrv::qtescape($title));              $r->print('</td>'
             if ($url) { $r->print('</a>'); }                       .&Apache::loncommon::end_data_table_row()
     $r->print('<br>');              );
         }          }
     }      }
     $r->print('</body></html>');      $r->print(&Apache::loncommon::end_data_table());
       $r->print(&Apache::loncommon::end_page());
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
   my $r=shift;    my $r=shift;
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   return OK if $r->header_only;    return OK if $r->header_only;
     my $target = $env{'form.grade_target'};
     if ($target eq 'meta') {
         &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         return OK;
     }
     
   my $url=$r->uri;    my $url=$r->uri;
   my $fn=&Apache::lonnet::filelocation('',$url);    my $fn=&Apache::lonnet::filelocation('',$url);
   
Line 823  sub handler { Line 784  sub handler {
 # ------------------------------------------- Determine which tools can be used  # ------------------------------------------- Determine which tools can be used
   my $adv=0;    my $adv=0;
   
   unless ($ENV{'form.forcesmp'}) {    unless ($env{'form.forcesmp'}) {
      if ($ENV{'form.forceadv'}) {       if ($env{'form.forceadv'}) {
         $adv=1;          $adv=1;
      } elsif (my $fh=Apache::File->new($fn)) {       } elsif (my $fh=Apache::File->new($fn)) {
  my $allmap=join('',<$fh>);   my $allmap=join('',<$fh>);
Line 836  sub handler { Line 797  sub handler {
   my $fatal=0;    my $fatal=0;
   
 # -------------------------------------------------------------------- Load map  # -------------------------------------------------------------------- Load map
   ($errtext,$fatal)=&mapread($fn,$errtext);    ($errtext,$fatal)=&LONCAPA::map::mapread($fn,$errtext);
   
   if ($fatal==1) { $adv=1; }    if ($fatal==1) { $adv=1; }
   
 # ----------------------------------- adv==1 now means "graphical MUST be used"  # ----------------------------------- adv==1 now means "graphical MUST be used"
   
   if ($ENV{'form.forceadv'}) {    if ($env{'form.forceadv'}) {
       &ratedt($r,$url);        &ratedt($r,$url);
   } elsif ($ENV{'form.forcesmp'}) {    } elsif ($env{'form.forcesmp'}) {
       &smpedt($r,$url,$errtext);        &smpedt($r,$url,$errtext);
   } else {    } else {
       &viewmap($r,$url,$adv,$errtext);        &viewmap($r,$url,$adv,$errtext);
Line 857  __END__ Line 818  __END__
   
   
   
   =pod
   
   =head1 NAME
   
   Apache::lonratedt: simple resource assembly tool
   
   =head1 SYNOPSIS
   
   lonratedt provides the routines and the handler for the Advanced
       Resource Assembly Tool (RAT), and ties the various pieces together
       with Javascript.
   
   =head1 OVERVIEW
   
   =head2 Map Representation
   
   =begin latex
   
   %
   \begin{figure}
   \begin{center}\includegraphics[%
     width=0.55\paperwidth,bb = 0 0 200 100, draft, type=eps]{Map_Example}\end{center}
   
   
   \caption{\label{Map_In_Advanced_Editor}Example of a Map in the Advanced Editor}
   \end{figure}
   %
   \begin{figure}
   \begin{lyxcode}
   <map>
   
   ~~<resource~id=\char`\"{}1\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/korte/phy231welcome.html\char`\"{}
   
   ~~~~type=\char`\"{}start\char`\"{}
   
   ~~~~title=\char`\"{}Start\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}2\char`\"{}
   
   ~~~~src=\char`\"{}\char`\"{}~type=\char`\"{}finish\char`\"{}
   
   ~~~~title=\char`\"{}Finish\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}6\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/korte/tests/units.problem\char`\"{}
   
   ~~~~type=\char`\"{}mandatory\char`\"{}
   
   ~~~~title=\char`\"{}Physical~Units~Test\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}9\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/korte/chapters/onedim.sequence\char`\"{}
   
   ~~~~title=\char`\"{}Motion~in~One~Dimension\char`\"{}>
   
   ~~~~</resource>
   
   ~~<resource~id=\char`\"{}11\char`\"{}
   
   ~~~~src=\char`\"{}/res/msu/bauer/bridges/units.sequence\char`\"{}
   
   ~~~~title=\char`\"{}Physical~Units~Refresher\char`\"{}>
   
   ~~~~</resource>
   
   ~~<condition~id=\char`\"{}19\char`\"{}
   
   ~~~~type=\char`\"{}stop\char`\"{}
   
   ~~~~value=\char`\"{}user.assessments{[}this./res/msu/korte/tests/units.problem{]}.status=solved\char`\"{}>
   
   ~~~~</condition>
   
   ~~<link~from=\char`\"{}1\char`\"{}~to=\char`\"{}6\char`\"{}></link>
   
   ~~<link~from=\char`\"{}6\char`\"{}~to=\char`\"{}9\char`\"{}~condition=\char`\"{}19\char`\"{}></link>
   
   ~~<link~from=\char`\"{}6\char`\"{}~to=\char`\"{}11\char`\"{}></link>
   
   ~~<link~from=\char`\"{}11\char`\"{}~to=\char`\"{}6\char`\"{}></link>
   
   ~~</map>
   \end{lyxcode}
   
   \caption{\label{XML}XML for Map in Figure \ref{Map_In_Advanced_Editor}}
   \end{figure}
   
   =end latex
   
   Fig. "XML for Map in Figure" shows the XML representation of the
   resource map shown in Fig. "Example of a Map in the Advanced Editor",
   which is the format in which maps are stored. In the figure, however,
   additional graphical map layout information generated by the Advanced
   Resource Assembly Tool is not displayed. This graphical information is
   optional to re-generate the same graphical layout when the map is
   brought up again in the Resource Assembly Tool, and is not needed for
   any other system functionality.
   
   Maps can be generated by tools other than the Resource Assembly
   Tool. In particular, an author might have some other representation of
   a course sequence, which can be converted into a map using scripts. If
   this map then were to be brought up in the Resource Assembly Tool, the
   Tool would automatically generate a graphical layout for it. Each
   entry of the map (resources, conditions and links) is stored in a
   separate tag.
   
   Resources and conditionsX<conditions> have to have unique ID
   numbers. These numbers are automatically generated by the Resource
   Assembly Tool when the entry is first created, or added to the entries
   when a map generated outside the Resource Assembly Tool is first
   retrieved. They can also be assigned by custom scripts or added in by
   hand.
   
   In the XML example, entry 1 is the start resource of the map. When
   this map is accessed, the source (src) URL of this tag will be the
   first resource rendered. Entry 2 is the finish resource of this
   map. This resource will be the last resource in the sequence of
   resources. Entry 6 is a problem resource with the given URL and title,
   as well as the priority "mandatory". Entry 19 is a condition, which is
   used by the link between entries 6, the problem, and 9, a
   sequence. I<The final syntax for conditions has not yet been
   determined.>
   
   =cut
   
   
   

Removed from v.1.31.2.1  
changed lines
  Added in v.1.101


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>