Diff for /rat/lonratedt.pm between versions 1.74 and 1.105.2.5

version 1.74, 2005/06/10 21:45:46 version 1.105.2.5, 2013/06/05 14:50:15
Line 29 Line 29
   
 package Apache::lonratedt;  package Apache::lonratedt;
   
 =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  
   
 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::loncommon;  
 use Apache::lonlocal;  use Apache::lonlocal;
   use LONCAPA::map();
 use File::Copy;  use File::Copy;
   use LONCAPA;
 use vars qw(@order @resources @resparms @zombies);  use HTML::Entities();
   
   
 # 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;  
     undef @resparms;  
     undef @zombies;  
   
     @resources=('');  
     @order=();  
     @resparms=();  
     @zombies=();  
   
     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') {  
     my ($title,$src,$ext,$type)=split(/\:/,$content);  
     if ($ext eq 'cond') { next; }  
     if ($type ne 'zombie') {  
  $resources[$number]=$content;  
     } else {  
  $zombies[$number]=$content;  
     }  
         }  
         if ($command eq 'objlinks') {  
             $links[$number]=$content;  
         }  
         if ($command eq 'objparms') {  
     if ($resparms[$number]) {  
  $resparms[$number].='&&&'.$content;  
     } else {  
  $resparms[$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  
                  (&mt('Map has branchings. Use advanced editor.'),1);  
             }  
     $starters[$start]=1;  
     $endings[$end]=1;  
     if ($cond) {  
  return  
                  (&mt('Map has conditions. Use advanced editor.'),1);  
             }  
  }  
   
     }  
     for (my $i=1; $i<=$#resources; $i++) {  
         if (defined($resources[$i])) {  
     unless (($starters[$i]) || ($endings[$i])) {  
                 return  
  (&mt('Map has unconnected resources. Use advanced editor.'),1);  
             }  
         }  
     }  
 # ---------------------------------------------- Did we just read an empty map?  
     if ($#resources<1) {  
         undef $resources[0];  
  $resources[1]=':::start';  
         $resources[2]=':::finish';  
     }  
 # -------------------------------------------------- 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;  
 }  
   
 # ---------------------------------------------- Read a map as well as possible  
 # Also used by the sequence handler  
 # Call lonsequence::attemptread to read from resource space  
 #  
 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') {  
     my ($title,$src,$ext,$type)=split(/\:/,$content);  
     unless ($type eq 'zombie') {  
  $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  # --------------------------------------------------------- Build up RAT screen
 sub ratedt {  sub ratedt {
   my ($r,$url)=@_;    my ($r,$url)=@_;
   my $frameset = '<frameset rows="1,70,*" border="0">';    my %layout = ('border' => "0");
   if ($env{'environment.remote'} eq 'off') {    if ($env{'environment.remote'} eq 'off') {
       $frameset = '<frameset rows="1,250,*" border="0">';        $layout{'rows'} = "1,250,*";
     } else {
         $layout{'rows'} = "1,70,*";
   }    }
   $r->print(<<ENDDOCUMENT);    my $js ='
   <script type="text/javascript">
 <html>  
 <head>  
 <script language="JavaScript">  
     var flag=0;      var flag=0;
 </script>  </script>';
 </head>  
 $frameset  
 <frame name=server src="$url/loadonly/ratserver" noresize noscroll>  
 <frame name=code src="$url/loadonly/adveditmenu">  
 <frame name=mapout src="/adm/rat/map.html">  
 </frameset>  
 </html>  
   
     my $start_page = 
         &Apache::loncommon::start_page('Edit Sequence',$js,
        {'frameset'    => 1,
         'add_entries' => \%layout});
   
     my $end_page = 
         &Apache::loncommon::end_page({'frameset' => 1});
   
     $r->print(<<ENDDOCUMENT);
   $start_page
   <frame name="server" src="$url/loadonly/ratserver" noresize="noresize"
          noscroll="noscroll" />
   <frame name="code" src="$url/loadonly/adveditmenu" />
   <frame name="mapout" src="/adm/rat/map.html" />
   $end_page
 ENDDOCUMENT  ENDDOCUMENT
 }  }
   
Line 431  ENDDOCUMENT Line 76  ENDDOCUMENT
   
 sub buttons {  sub buttons {
     my $adv=shift;      my $adv=shift;
     my $output='<form method=post>';           my $output='<form method="post" action="">';     
     if ($adv==1) {      if ($adv==1) {
  $output.='<input type=submit name=forceadv value="'.&mt('Edit').'">'.          $output.=
     &Apache::loncommon::help_open_topic('Sequence_Advanced_Editor_Creation');;              '<input type="submit" name="forceadv"'
              .' value="'.&mt('Edit').'" />'
              .&Apache::loncommon::help_open_topic(
                   'Sequence_Advanced_Editor_Creation');
     } else {      } else {
         unless ($adv==2) {          unless ($adv==2) {
            $output.='<input type=submit name=forcesmp value="'.&mt('Simple Edit').'">'.             $output.=
     &Apache::loncommon::help_open_topic('Sequence_Simple_Editor_Creation');                 '<input type="submit" name="forcesmp"'
         }                .' value="'.&mt('Simple Edit').'" />'
  $output.='<input type=submit name=forceadv value="'.&mt('Advanced Edit').'">'.                .&Apache::loncommon::help_open_topic(
     &Apache::loncommon::help_open_topic('Sequence_Advanced_Editor_Creation');                     'Sequence_Simple_Editor_Creation')
     }                .' ';
     return $output.'</form><hr>';          }
 }          $output.=
               '<input type="submit" name="forceadv"'
 # ------------------------------------- Revive zombie idx or get unused number             .' value="'.&mt('Advanced Edit').'" />'
              .&Apache::loncommon::help_open_topic(
 sub getresidx {                  'Sequence_Advanced_Editor_Creation');
     my $url=shift;  
     my $max=1+($#resources>$#zombies?$#resources:$#zombies);  
     unless ($url) { return $max; }  
     for (my $i=0; $i<=$#zombies; $i++) {  
  my ($title,$src,$ext,$type)=split(/\:/,$zombies[$i]);  
  if ($src eq $url) {  
     undef $zombies[$i];  
     return $i;  
  }  
     }  
     return $max;  
 }  
   
 # --------------------------------------------------------------- Make a zombie  
   
 sub makezombie {  
     my $idx=shift;  
     my ($name,$url,$ext)=split(/\:/,$resources[$idx]);  
     my $now=time;  
     $zombies[$idx]=$name.  
  ' [('.$now.','.$env{'user.name'}.','.$env{'user.domain'}.')]:'.  
  $url.':'.$ext.':zombie';  
 }  
   
 # ----------------------------------------------------------- Paste into target  
 # modifies @order, @resources  
   
 sub pastetarget {  
     my ($after,@which)=@_;  
     my @insertorder=();  
     foreach (@which) {  
         if (defined($_)) {  
     my ($name,$url)=split(/\=/,$_);  
             $name=&Apache::lonnet::unescape($name);  
             $url=&Apache::lonnet::unescape($url);  
             if ($url) {  
        my $idx=&getresidx($url);  
                $insertorder[$#insertorder+1]=$idx;  
                my $ext='false';  
                if ($url=~/^http\:\/\//) { $ext='true'; }  
                $url=~s/\:/\&colon;/g;  
                $name=~s/\:/\&colon;/g;  
                $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res';  
    }  
         }  
     }  
     my @oldorder=splice(@order,$after);  
     @order=(@order,@insertorder,@oldorder);  
 }  
   
 # ------------------------------------------------ Get start and finish correct  
 # modifies @resources  
   
 sub startfinish {  
 # Remove all start and finish  
     foreach (@order) {  
  my ($name,$url,$ext)=split(/\:/,$resources[$_]);  
         if ($url=~/http\&colon\:\/\//) { $ext='true'; }  
         $resources[$_]=$name.':'.$url.':'.$ext.':normal:res';  
     }  
 # Garbage collection  
     my $stillchange=1;  
      while (($#order>1) && ($stillchange)) {  
        $stillchange=0;  
        for (my $i=0;$i<=$#order;$i++) {  
    my ($name,$url,$ext)=split(/\:/,$resources[$order[$i]]);  
           unless ($url) {  
 # Take out empty resource  
               for (my $j=$i+1;$j<=$#order;$j++) {  
                   $order[$j-1]=$order[$j];  
       }  
               $#order--;  
       $stillchange=1;  
               last;  
           }  
        }  
     }  
 # Put in a start resource  
    my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]);  
    $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res';  
 # Make sure this has at least start and finish  
    if ($#order==0) {  
        $resources[&getresidx()]='::false';  
        $order[1]=$#resources;  
    }  
 # Make the last one a finish resource  
    ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]);  
    $resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res';  
 }  
   
 # ------------------------------------------------------------------- Store map  
   
 sub storemap {  
     my $realfn=shift;  
     my $fn=$realfn;  
 # unless this is forced to work from the original file, use a temporary file  
 # instead  
     unless (shift) {  
        $fn=$realfn.'.tmp';  
        unless (-e $fn) {  
   copy($realfn,$fn);  
        }  
     }  
 # store data either into tmp or real file  
     &startfinish();  
     my $output='graphdef<:>no';  
     my $k=1;  
     for (my $i=0; $i<=$#order; $i++) {  
         if (defined($resources[$order[$i]])) {  
     $output.='<&>objcont<:>'.$order[$i].'<:>'.$resources[$order[$i]];  
         }  
  if (defined($resparms[$order[$i]])) {  
     foreach (split('&&&',$resparms[$order[$i]])) {  
  if ($_) {  
     $output.='<&>objparms<:>'.$order[$i].'<:>'.$_;  
  }  
     }  
  }  
         if (defined($order[$i+1])) {  
     if (defined($resources[$order[$i+1]])) {  
                $output.='<&>objlinks<:>'.$k.'<:>'.  
    $order[$i].':'.$order[$i+1].':0';  
        $k++;  
             }  
         }  
     }  
     for (my $i=0; $i<=$#zombies; $i++) {  
         if (defined($zombies[$i])) {  
     $output.='<&>objcont<:>'.$i.'<:>'.$zombies[$i];  
         }  
     }  
     $output=~s/http\&colon\;\/\///g;  
     $env{'form.output'}=$output;  
     return   
      &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,''));  
 }  
   
 # ------------------------------------------ Store and get parameters in global  
   
 sub storeparameter {  
     my ($to,$name,$value,$ptype)=@_;  
     my $newentry='';  
     my $nametype='';  
     foreach (split('&&&',$resparms[$to])) {  
  my ($thistype,$thisname,$thisvalue)=split('___',$_);  
  if ($thisname) {  
     unless ($thisname eq $name) {  
  $newentry.=$_.'&&&';  
     } else {  
  $nametype=$thistype;  
     }  
  }  
     }  
     unless ($ptype) { $ptype=$nametype; }  
     unless ($ptype) { $ptype='string'; }  
     $newentry.=$ptype.'___'.$name.'___'.$value;  
     $resparms[$to]=$newentry;  
 }  
   
 sub delparameter {  
     my ($to,$name)=@_;  
     my $newentry='';  
     my $nametype='';  
     foreach (split('&&&',$resparms[$to])) {  
  my ($thistype,$thisname,$thisvalue)=split('___',$_);  
  if ($thisname) {  
     unless ($thisname eq $name) {  
  $newentry.=$_.'&&&';  
     }  
  }  
     }  
     $resparms[$to]=$newentry;  
 }  
   
 sub getparameter {  
     my ($to,$name)=@_;  
     my $value=undef;  
     my $ptype=undef;  
     foreach (split('&&&',$resparms[$to])) {  
  my ($thistype,$thisname,$thisvalue)=split('___',$_);  
  if ($thisname eq $name) {  
     $value=$thisvalue;  
     $ptype=$thistype;  
  }  
     }      }
     return ($value,$ptype);      return $output.'</form>';
 }  }
   
 # ----------------------------------------------------------------- Edit script  # ----------------------------------------------------------------- Edit script
 sub editscript {  sub editscript {
     my $mode=shift;      my $mode=shift;
     my $resurl=&Apache::loncommon::lastresurl();      my $resurl=
    &Apache::loncommon::escape_single(&Apache::loncommon::lastresurl());
     return(<<ENDSCRIPT);      return(<<ENDSCRIPT);
 var srch;  var srch;
 var srchflag=-1; // 1 means currently open  var srchflag=-1; // 1 means currently open
Line 682  function srchclose() { Line 147  function srchclose() {
   
 // -------------------------------------------------------- Open indexer window  // -------------------------------------------------------- Open indexer window
 function idxopen(mode) {  function idxopen(mode) {
    var options="scrollbars=1,resizable=1,menubar=0";     var options="scrollbars=1,resizable=1,menubar=0,location=1,toolbar=1";
    idxmode=mode;     idxmode=mode;
    idxflag=1;     idxflag=1;
    idx=open("$resurl/?launch=1&mode=$mode&catalogmode="+mode,"idxout",options);     idx=open('$resurl/?inhibitmenu=yes&launch=1&mode=$mode&catalogmode='+mode,'idxout',options);
    idx.focus();     idx.focus();
 }  }
   
Line 693  function idxopen(mode) { Line 158  function idxopen(mode) {
 function groupopen(url,recover) {  function groupopen(url,recover) {
    var options="scrollbars=1,resizable=1,menubar=0";     var options="scrollbars=1,resizable=1,menubar=0";
    idxflag=1;     idxflag=1;
    idx=open("/adm/groupsort?mode=$mode&recover="+recover+"&readfile="+url,"idxout",options);     idx=open("/adm/groupsort?inhibitmenu=yes&mode=$mode&recover="+recover+"&readfile="+url,"idxout",options);
    idx.focus();     idx.focus();
 }  }
   
Line 702  function srchopen(mode) { Line 167  function srchopen(mode) {
    var options="scrollbars=1,resizable=1,menubar=0";     var options="scrollbars=1,resizable=1,menubar=0";
    srchmode=mode;     srchmode=mode;
    srchflag=1;     srchflag=1;
    srch=open("/adm/searchcat?launch=1&mode=$mode&catalogmode="+mode,"srchout",options);     srch=open("/adm/searchcat?inhibitmenu=yes&launch=1&mode=$mode&catalogmode="+mode,"srchout",options);
    srch.focus();     srch.focus();
 }  }
 // ----------------------------------------------------- launch indexer browser  // ----------------------------------------------------- launch indexer browser
 function groupsearch() {  function groupsearch() {
    srchcheck('groupsearch');     srchcheck('import');
 }  }
   
 function groupimport() {  function groupimport() {
    idxcheck('groupimport');     idxcheck('import');
 }  }
   
 // ------------------------------------------------------- Do srch status check  // ------------------------------------------------------- Do srch status check
Line 737  function idxcheck(mode) { Line 202  function idxcheck(mode) {
         if (editbrowser == null) {          if (editbrowser == null) {
             url += 'launch=1&';              url += 'launch=1&';
         }          }
           url += 'inhibitmenu=yes&';
         url += 'catalogmode=interactive&';          url += 'catalogmode=interactive&';
         url += 'mode=edit&';          url += 'mode=edit&';
         url += 'form=' + formname + '&';          url += 'form=' + formname + '&';
Line 748  function idxcheck(mode) { Line 214  function idxcheck(mode) {
         }          }
         url += 'element=' + elementname + '';          url += 'element=' + elementname + '';
         var title = 'Browser';          var title = 'Browser';
         var options = 'scrollbars=1,resizable=1,menubar=0';          var options = 'scrollbars=1,resizable=1,menubar=0,toolbar=1,location=1';
         options += ',width=700,height=600';          options += ',width=700,height=600';
         editbrowser = open(url,title,options,'1');          editbrowser = open(url,title,options,'1');
         editbrowser.focus();          editbrowser.focus();
Line 759  ENDSCRIPT Line 225  ENDSCRIPT
   
 sub smpedt {  sub smpedt {
    my ($r,$url,$errtext)=@_;     my ($r,$url,$errtext)=@_;
    my $buttons=&buttons(2);  
    my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';     my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';
    my $targetmsg='';     my $targetmsg='';
    if ($env{'form.save'}) {     if ($env{'form.save'}) {
        copy($tmpfn,&Apache::lonnet::filelocation('',$url));         copy($tmpfn,&Apache::lonnet::filelocation('',$url));
        unlink($tmpfn);         unlink($tmpfn);
        my ($errtext,$fatal)=         my ($errtext,$fatal)=
                            &mapread(&Apache::lonnet::filelocation('',$url),'');     &LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$url),'');
        unless ($fatal) {         unless ($fatal) {
    $targetmsg='<b>'.&mt('Saved.').'</b><br />';     $targetmsg='<b>'.&mt('Saved.').'</b><br />';
        } else {         } else {
    $targetmsg='<b>'.&mt('An error occured while saving.').'</b><br />';     $targetmsg='<b>'.&mt('An error occurred while saving.').'</b><br />';
        }         }
    }     }
    if ($env{'form.revert'}) {     if ($env{'form.revert'}) {
        $targetmsg='<b>'.&mt('Reverted.').'</b><br />';         $targetmsg='<b>'.&mt('Reverted.').'</b><br />';
        unlink($tmpfn);         unlink($tmpfn);
        my ($errtext,$fatal)=         my ($errtext,$fatal)=
                            &mapread(&Apache::lonnet::filelocation('',$url),'');     &LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$url),'');
    }     }
    if (-e $tmpfn) {     if (-e $tmpfn) {
       $targetmsg=        $targetmsg=
         '<b><font color="red">'.&mt('You are working with an unsaved version of your map.').'</font></b><br>';          '<span class="LC_warning">'.&mt('You are working with an unsaved version of your map.').'</span><br />';
       my ($errtext,$fatal)=&mapread($tmpfn,'');        my ($errtext,$fatal)=&LONCAPA::map::mapread($tmpfn,'');
    }     }
 # ---------------------------------------------------------- Process form input  # ---------------------------------------------------------- Process form input
   
Line 865  sub smpedt { Line 330  sub smpedt {
     &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 885  sub smpedt { Line 350  sub smpedt {
        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='';
Line 910  sub smpedt { Line 375  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 928  sub smpedt { Line 393  sub smpedt {
   
        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) {                  if ($include) { 
    $neworder[$#neworder+1]=$order[$i];      $neworder[$#neworder+1]=$LONCAPA::map::order[$i]; 
        } else {         } else {
    &makezombie($order[$i]);     &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
Line 949  sub smpedt { Line 414  sub smpedt {
        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   # -------------------------------------------------------------------- Move up 
    } elsif ($env{'form.moveup'}) {     } elsif ($env{'form.moveup'}) {
        foreach (sort @targetselect) {         foreach (sort @targetselect) {
            if ($_-1>0) {             if ($_-1>0) {
               my $movethis=$order[$_-1];                my $movethis=$LONCAPA::map::order[$_-1];
               $order[$_-1]=$order[$_-2];                $LONCAPA::map::order[$_-1]=$LONCAPA::map::order[$_-2];
               $order[$_-2]=$movethis;                $LONCAPA::map::order[$_-2]=$movethis;
   }    }
        }         }
        &storemap(&Apache::lonnet::filelocation('',$url));         &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
 # ------------------------------------------------------------------ Move down  # ------------------------------------------------------------------ Move down
    } elsif ($env{'form.movedown'}) {     } elsif ($env{'form.movedown'}) {
        foreach (reverse sort @targetselect) {         foreach (reverse sort @targetselect) {
            if ($_-1<$#order) {             if ($_-1<$#LONCAPA::map::order) {
               my $movethis=$order[$_-1];                my $movethis=$LONCAPA::map::order[$_-1];
               $order[$_-1]=$order[$_];                $LONCAPA::map::order[$_-1]=$LONCAPA::map::order[$_];
               $order[$_]=$movethis;                $LONCAPA::map::order[$_]=$movethis;
    }     }
        }         }
        &storemap(&Apache::lonnet::filelocation('',$url));         &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
 # --------------------------------------------------------------------- Rename  # --------------------------------------------------------------------- Rename
    } elsif ($env{'form.renameres'}) {     } elsif ($env{'form.renameres'}) {
        my $residx=$Apache::lonratedt::order[$env{'form.renameidx'}-1];         my $residx=$LONCAPA::map::order[$env{'form.renameidx'}-1];
        my ($name,@resrest)=split(/\:/,$Apache::lonratedt::resources[$residx]);         my ($name,@resrest)=split(/\:/,$LONCAPA::map::resources[$residx]);
        $name=$env{'form.renametitle'};         $name=$env{'form.renametitle'};
        $name=~s/\:/\&colon\;/g;         $name=~s/\:/\&colon\;/g;
        $Apache::lonratedt::resources[$residx]=$name.':'.join(':',@resrest);         $LONCAPA::map::resources[$residx]=$name.':'.join(':',@resrest);
        &storemap(&Apache::lonnet::filelocation('',$url));         &LONCAPA::map::storemap(&Apache::lonnet::filelocation('',$url));
    }     }
 # ------------------------------------------------------------ Assemble windows  # ------------------------------------------------------------ Assemble windows
         
Line 1000  sub smpedt { Line 465  sub smpedt {
           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));
Line 1010  sub smpedt { Line 475  sub smpedt {
    my $targetwindow=            my $targetwindow=       
        '<option value="0"> ------- '.&mt('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=~s/\&colon;/\:/g;         $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
    my $editscript=&editscript('simple');     my $editscript=&editscript('simple');
    my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,  
  ($env{'environment.remote'} ne 'off')).  
        &Apache::loncommon::help_open_menu('','Sequence_Simple_Editor_Creation','Sequence_Simple_Editor_Creation','',6,'RAT');  
    my %lt=&Apache::lonlocal::texthash(     my %lt=&Apache::lonlocal::texthash(
       'sa' => 'Save',        'sa' => 'Save',
       'nt' => 'New Title',        'nt' => 'New Title',
       'se' => 'Search',        'se' => 'Search',
       'im' => 'Import',        'im' => 'Import',
                                         'wl' => 'Import from Stored Links',
       'vi' => 'View',        'vi' => 'View',
       'lm' => 'Load Map',        'lm' => 'Load Map',
       'ds' => 'Discard Selected',        'ds' => 'Discard Selected',
Line 1046  sub smpedt { Line 512  sub smpedt {
                                       'pas' => 'Paste after selected',                                        'pas' => 'Paste after selected',
                                       'reco' => 'Recover Deleted'                                        'reco' => 'Recover Deleted'
       );        );
    $r->print(<<ENDSMPHEAD);     my $js=<<ENDJS;
 <html>  <script type="text/javascript">
 <head>  
 <script>  
   
    $editscript     $editscript
   
    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'); }
    }     }
   
Line 1076  sub smpedt { Line 538  sub smpedt {
        var entry=(document.forms.simpleedit.targetdetail.value.split('&'))         var entry=(document.forms.simpleedit.targetdetail.value.split('&'))
                 [selidx];                  [selidx];
        var oldname=unescape((entry.split('='))[0]);         var oldname=unescape((entry.split('='))[0]);
        var nameparts=oldname.split('&colon;');  
        oldname=unescape(nameparts.join(':'));  
        nameparts=oldname.split('&#34;');  
        oldname=unescape(nameparts.join('"'));  
        nameparts=oldname.split('&#39;');  
        oldname=unescape(nameparts.join("'"));  
        newtitle=prompt('$lt{'nt'}',oldname);         newtitle=prompt('$lt{'nt'}',oldname);
        if (newtitle) {         if (newtitle) {
            document.forms.simpleedit.renameres.value=1;             document.forms.simpleedit.renameres.value=1;
Line 1092  sub smpedt { Line 548  sub smpedt {
    }     }
   
 </script>  </script>
 </head>                   ENDJS
 $bodytag  
 $buttons      &Apache::lonhtmlcommon::clear_breadcrumbs();
 <font color=red>$errtext</font>      &Apache::lonhtmlcommon::add_breadcrumb({
 <form name=simpleedit method=post>          text  => 'Authoring Space',
 <input type=hidden name=forcesmp value=1>          href  => &Apache::loncommon::authorspace($url),
 <input type=hidden name=renameres value=0>          faq   => 6,
 <input type=hidden name=renametitle value=''>          bug   => 'RAT',
 <input type=hidden name=renameidx value=0>          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('Authoring 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" action="">
   <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%">$lt{'ta'}</th>      <tr><th width="40%">$lt{'ta'}</th>
 <th>&nbsp;</th>  <th>&nbsp;</th>
 <th width="40%">File: $url</th></tr>  <th width="40%">File: $url</th></tr>
 <tr><td bgcolor="#FFFFCC">  <tr><td bgcolor="#FFFFCC">
 <input type=button onClick="javascript:groupsearch()" value="$lt{'se'}">  <input type="button" onclick="javascript:groupsearch()" value="$lt{'se'}" />
 <input type=button onClick="javascript:groupimport();" value="$lt{'im'}">  <input type="button" onclick="javascript:groupimport();" value="$lt{'im'}" />
 $lt{'as'}  $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="Select Map"><input type=submit name=loadmap value="$lt{'lm'}"><hr>  value="Select Map" /><input type="submit" name="loadmap" value="$lt{'lm'}" /><hr />
 <input type=submit name="discard" value="$lt{'ds'}">  <input type="submit" name="discard" value="$lt{'ds'}" />
 <input type=submit name="clear" value="$lt{'ca'}">  <input type="submit" name="clear" value="$lt{'ca'}" />
 <input type=button onClick="javascript:viewimport()" value="$lt{'vi'}">  <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="$lt{'se'}">  "javascript:impfortarget.value=1;groupsearch()" value="$lt{'se'}" />
 <input type=button onClick=  <input type="button" onclick=
 "javascript:impfortarget.value=1;groupimport();" value="$lt{'im'}">  "javascript:impfortarget.value=1;groupimport();" value="$lt{'im'}" />
 <input type=button onClick=  <input type="button" onclick=
 "javascript:impfortarget.value=1;javascript:groupopen('$url',1);" value="$lt{'reco'}">  "javascript:impfortarget.value=1;open_StoredLinks_Import('simple');" value="$lt{'wl'}" />
   <input type="button" onclick=
   "javascript:impfortarget.value=1;groupopen('$url',1);" value="$lt{'reco'}" />
 $lt{'as'}  $lt{'as'}
 <hr>  <hr />
 <input type=submit name="moveup" value="$lt{'mu'}">  <input type="submit" name="moveup" value="$lt{'mu'}" />
 <input type=submit name="movedown" value="$lt{'md'}">  <input type="submit" name="movedown" value="$lt{'md'}" />
 <input type=button onClick="javascript:renametarget()" value="$lt{'re'}">  <input type="button" onclick="javascript:renametarget()" value="$lt{'re'}" />
 <hr>$targetmsg  <hr />$targetmsg
 <input type=submit name="revert" value="$lt{'rv'}">  <input type="submit" name="revert" value="$lt{'rv'}" />
 <input type=submit name="save" value="$lt{'sa'}">  <input type="submit" name="save" value="$lt{'sa'}" />
 <input type=button onClick="javascript:viewtarget()" value="$lt{'vi'}">  <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">
 $lt{'cs'}<br>  $lt{'cs'}<br />
 <input type=submit name=cut value='<<<'><p>  <input type="submit" name="cut" value="<<<" /><p>
 <hr>  <hr />
 $lt{'ps'}<br>  $lt{'ps'}<br />
 <input type=submit name=copy value='<--'><p>  <input type="submit" name="copy" value="<--" /><p>
 <hr>  <h /r>
 $lt{'pas'}<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//;     my $londocroot = $r->dir_config('lonDocRoot');
    $r->print(<<ENDNODIR);     my ($path) = ($dir =~ m{^\Q$londocroot\E?(/priv/[^/]+/[^/]+/)});
 <html>     $dir=~s{^\Q$londocroot/priv/\E[^/]+/[^/]+}{};
 <body bgcolor='#FFFFFF'>     my $brcrum = [{'href' => &Apache::loncommon::authorspace($path),
 <h1>No such directory: $dir</h1>                    'text' => 'Authoring Space'}];
 </body>  #                 {'href' => '',
 </html>  #                  'text' => 'No such directory'}];
 ENDNODIR     $r->print(&Apache::loncommon::start_page('Authoring Space',
                                               undef,
                                               {'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>'.  
      &Apache::loncommon::bodytag('Edit Content of a Map').      &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::loncommon::help_open_menu('','','','',6,'RAT').      &Apache::lonhtmlcommon::add_breadcrumb({
       &buttons($adv));          text  => 'Authoring Space',
           href  => &Apache::loncommon::authorspace($url),
           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;
     $r->print('<h1>'.$url.'</h1>');      $r->print('<p><span class="LC_filename">'.$url.'</span></p>');
     if ($adv) {      if ($adv) {
  $r->print('<p><b><font color="red">'.&mt('Map contents are not shown in order.').'</font></b></p><br />');   $r->print('<p class="LC_warning">'
     }                   .&mt('Map contents are not shown in order.')
     $r->print( '<table border="0" cellspacing="2" cellpadding="4">'.                   .'</p><br />'
                '<tr bgcolor="#DDDDDD"><th>'.&mt('Type').'</th>'.          );
                '<th>'.&mt('Title in map').'</th>'.      }
                '<th>'.&mt('Filename of resource').'</th>'.      $r->print(&Apache::loncommon::start_data_table()
                '<th>'.&mt('Link to published resource').'</th>'.               .&Apache::loncommon::start_data_table_header_row()
                '<th>'.&mt('Link to resource in Construction Space').'</th>'.               .'<th>'.&mt('Type').'</th>'
                '</tr>');               .'<th>'.&mt('Title in map').'</th>'
     my @backgroundColors = ("#FFFFFF", "#F6F6F6");               .'<th>'.&mt('Filename of resource').'</th>'
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {               .'<th>'.&mt('Link to published resource').'</th>'
                .'<th>'.&mt('Link to resource in Authoring 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,$cond)=split(/\:/,$_);      my ($title,$url,$cond)=split(/\:/,$_);
     if ($cond eq 'cond') { next; }      if ($cond eq 'cond') { next; }
             $title=~s/\&colon\;/\:/g;              $title= &LONCAPA::map::qtescape($title);
             $url=~s/\&colon\;/\:/g;              $url  = &LONCAPA::map::qtescape($url);
             unless ($title) { $title=(split(/\//,$url))[-1] };              unless ($title) { $title=(split(/\//,$url))[-1] };
             unless ($title) { $title='<i>'.&mt('Empty').'</i>'; }              unless ($title) { $title='<i>'.&mt('Empty').'</i>'; }
             my $resurl = &Apache::lonratsrv::qtescape($url);              my $resurl = $url;
             my $resfilepath = $Apache::lonnet::perlvar{'lonDocRoot'}.$resurl;              my $resfilepath = $Apache::lonnet::perlvar{'lonDocRoot'}.$resurl;
             my $filename;               my $filename; 
             if ($resurl =~ m#/([^/]+)$#) {              if ($resurl =~ m#/([^/]+)$#) {
                 $filename = $1;                  $filename = $1;
             }              }
             my $cstrurl = $resurl;              my $cstrurl = $resurl;
             $cstrurl =~ s#^/res/[^/]+/([^/]+)/#/priv/$1/#;              $cstrurl =~ s{^/res/}{/priv/};
             my $bgcol = $idx%2;               $r->print(&Apache::loncommon::start_data_table_row()
             $r->print('<tr bgcolor='.$backgroundColors[$bgcol].'><td>'.                       .'<td>'
                       '<img src="'.&Apache::loncommon::icon($resfilepath).                       .'<img src="'.&Apache::loncommon::icon($resfilepath).'" alt="" />'
                       '" /></td><td>'.&Apache::lonratsrv::qtescape($title).                       .'</td>'
                       '</td><td>'.$filename.'</td><td>');                       .'<td>'
                        .&HTML::Entities::encode(&LONCAPA::map::qtescape($title))
                        .'</td>'
                        .'<td>'.$filename.'</td>'
                        .'<td>'
               );
             if ($url) {              if ($url) {
  $r->print('<a href="'.$resurl.'">'.&mt('Resource space').'</a>');   $r->print('<a href="'.$resurl.'">'.&mt('Resource space').'</a>');
               } else {
                   $r->print('&nbsp;');
             }              }
             $r->print('</td><td>');              $r->print('</td><td>');
             if ($url) {              if ($url) {
                $r->print('<a href="'.$cstrurl.'">'.                 $r->print('<a href="'.$cstrurl.'">'.
                          &mt('Construction space').'</a>');                           &mt('Authoring space').'</a>');
               } else {
                   $r->print('&nbsp;');
             }              }
             $r->print('</td></tr>'."\n");              $r->print('</td>'
                        .&Apache::loncommon::end_data_table_row()
               );
         }          }
     }      }
     $r->print('</table>');      $r->print(&Apache::loncommon::end_data_table());
     $r->print('</body></html>');      $r->print(&Apache::loncommon::end_page());
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
Line 1278  sub handler { Line 803  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; }
   
Line 1299  __END__ Line 824  __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.74  
changed lines
  Added in v.1.105.2.5


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