Diff for /rat/lonratedt.pm between versions 1.36 and 1.71

version 1.36, 2002/09/04 16:54:44 version 1.71, 2005/06/08 18:49:38
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;
   
   =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::lonratsrv;
 use Apache::lonsequence;  use Apache::lonsequence;
 use Apache::loncommon;  use Apache::loncommon;
   use Apache::lonlocal;
 use File::Copy;  use File::Copy;
   
 use vars qw(@order @resources);  use vars qw(@order @resources @resparms @zombies);
   
   
 # Mapread read maps into global arrays @links and @resources, determines status  # Mapread read maps into global arrays @links and @resources, determines status
Line 54  sub mapread { Line 187  sub mapread {
     undef @links;      undef @links;
     undef @resources;      undef @resources;
     undef @order;      undef @order;
       undef @resparms;
       undef @zombies;
   
     @resources=('');      @resources=('');
     @order=();      @order=();
       @resparms=();
       @zombies=();
   
     my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');      my ($outtext,$errtext)=&Apache::lonratsrv::loadmap($fn,'');
     if ($errtext) { return ($errtext,2); }      if ($errtext) { return ($errtext,2); }
Line 64  sub mapread { Line 202  sub mapread {
     foreach (split(/\<\&\>/,$outtext)) {      foreach (split(/\<\&\>/,$outtext)) {
  my ($command,$number,$content)=split(/\<\:\>/,$_);   my ($command,$number,$content)=split(/\<\:\>/,$_);
         if ($command eq 'objcont') {          if ($command eq 'objcont') {
     $resources[$number]=$content;      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') {          if ($command eq 'objlinks') {
             $links[$number]=$content;              $links[$number]=$content;
         }          }
         if ($command eq 'objparms') {          if ($command eq 'objparms') {
     return('Map has resource parameters. Use advanced editor.',1);      if ($resparms[$number]) {
    $resparms[$number].='&&&'.$content;
       } else {
    $resparms[$number]=$content;
       }
         }          }
     }      }
 # ------------------------------------------------------- Is this a linear map?  # ------------------------------------------------------- Is this a linear map?
Line 84  sub mapread { Line 232  sub mapread {
     my ($start,$end,$cond)=split(/\:/,$_);      my ($start,$end,$cond)=split(/\:/,$_);
             if ((defined($starters[$start])) || (defined($endings[$end]))) {               if ((defined($starters[$start])) || (defined($endings[$end]))) { 
  return   return
                  ('Map has branchings. Use advanced editor.',1);                   (&mt('Map has branchings. Use advanced editor.'),1);
             }              }
     $starters[$start]=1;      $starters[$start]=1;
     $endings[$end]=1;      $endings[$end]=1;
     if ($cond) {      if ($cond) {
  return   return
                  ('Map has conditions. Use advanced editor.',1);                   (&mt('Map has conditions. Use advanced editor.'),1);
             }              }
  }   }
   
Line 99  sub mapread { Line 247  sub mapread {
         if (defined($resources[$i])) {          if (defined($resources[$i])) {
     unless (($starters[$i]) || ($endings[$i])) {      unless (($starters[$i]) || ($endings[$i])) {
                 return                  return
  ('Map has unconnected resources. Use advanced editor.',1);   (&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  # -------------------------------------------------- This is a linear map, sort
   
     my $startidx=0;      my $startidx=0;
Line 152  sub attemptread { Line 305  sub attemptread {
     foreach (split(/\<\&\>/,$outtext)) {      foreach (split(/\<\&\>/,$outtext)) {
  my ($command,$number,$content)=split(/\<\:\>/,$_);   my ($command,$number,$content)=split(/\<\:\>/,$_);
         if ($command eq 'objcont') {          if ($command eq 'objcont') {
     $theseres[$number]=$content;      my ($title,$src,$ext,$type)=split(/\:/,$content);
       unless ($type eq 'zombie') {
    $theseres[$number]=$content;
       }
         }          }
         if ($command eq 'objlinks') {          if ($command eq 'objlinks') {
             $links[$number]=$content;              $links[$number]=$content;
Line 249  sub attemptread { Line 405  sub attemptread {
 # --------------------------------------------------------- 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">';
     if ($env{'environment.remote'} eq 'off') {
         $frameset = '<frameset rows="1,250,*" border="0">';
     }
   $r->print(<<ENDDOCUMENT);    $r->print(<<ENDDOCUMENT);
   
 <html>  <html>
Line 257  sub ratedt { Line 417  sub ratedt {
     var flag=0;      var flag=0;
 </script>  </script>
 </head>  </head>
 <frameset rows="1,50,*" border=0>  $frameset
 <frame name=server src="$url/loadonly/ratserver" noresize noscroll>  <frame name=server src="$url/loadonly/ratserver" noresize noscroll>
 <frame name=code src="/adm/rat/code.html">  <frame name=code src="$url/loadonly/adveditmenu">
 <frame name=mapout src="/adm/rat/map.html">  <frame name=mapout src="/adm/rat/map.html">
 </frameset>  </frameset>
 </html>  </html>
Line 273  sub buttons { Line 433  sub buttons {
     my $adv=shift;      my $adv=shift;
     my $output='<form method=post>';           my $output='<form method=post>';     
     if ($adv==1) {      if ($adv==1) {
  $output.='<input type=submit name=forceadv value="Edit">';   $output.='<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="Simple Edit">';             $output.='<input type=submit name=forcesmp value="'.&mt('Simple Edit').'">'.
       &Apache::loncommon::help_open_topic('Sequence_Simple_Editor_Creation');
         }          }
  $output.='<input type=submit name=forceadv value="Advanced Edit">';   $output.='<input type=submit name=forceadv value="'.&mt('Advanced Edit').'">'.
       &Apache::loncommon::help_open_topic('Sequence_Advanced_Editor_Creation');
     }      }
     return $output.'</form><hr>';      return $output.'</form><hr>';
 }  }
   
   # ------------------------------------- Revive zombie idx or get unused number
   
   sub getresidx {
       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]);
       $zombies[$idx]=$name.':'.$url.':'.$ext.':zombie';
   }
   
 # ----------------------------------------------------------- Paste into target  # ----------------------------------------------------------- Paste into target
 # modifies @order, @resources  # modifies @order, @resources
   
Line 295  sub pastetarget { Line 482  sub pastetarget {
             $name=&Apache::lonnet::unescape($name);              $name=&Apache::lonnet::unescape($name);
             $url=&Apache::lonnet::unescape($url);              $url=&Apache::lonnet::unescape($url);
             if ($url) {              if ($url) {
        my $idx=$#resources+1;         my $idx=&getresidx($url);
                $insertorder[$#insertorder+1]=$idx;                 $insertorder[$#insertorder+1]=$idx;
                my $ext='false';                 my $ext='false';
                if ($url=~/^http\:\/\//) { $ext='true'; }                 if ($url=~/^http\:\/\//) { $ext='true'; }
                $url=~s/\:/\&colon;/g;                 $url=~s/\:/\&colon;/g;
                  $name=~s/\:/\&colon;/g;
                $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res';                 $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res';
    }     }
         }          }
Line 312  sub pastetarget { Line 500  sub pastetarget {
 # modifies @resources  # modifies @resources
   
 sub startfinish {  sub startfinish {
   # Remove all start and finish
     foreach (@order) {      foreach (@order) {
  my ($name,$url,$ext)=split(/\:/,$resources[$_]);   my ($name,$url,$ext)=split(/\:/,$resources[$_]);
         if ($url=~/http\&colon\:\/\//) { $ext='true'; }          if ($url=~/http\&colon\:\/\//) { $ext='true'; }
         $resources[$_]=$name.':'.$url.':'.$ext.':normal:res';          $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]]);     my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]);
    $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res';     $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res';
   # Make sure this has at least start and finish
    if ($#order==0) {     if ($#order==0) {
        $resources[$#resources+1]='::false';         $resources[&getresidx()]='::false';
        $order[1]=$#resources;         $order[1]=$#resources;
    }     }
    my ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]);  # Make the last one a finish resource
      ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]);
    $resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res';     $resources[$order[$#order]]=$name.':'.$url.':'.$ext.':finish:res';
 }  }
   
Line 348  sub storemap { Line 557  sub storemap {
         if (defined($resources[$order[$i]])) {          if (defined($resources[$order[$i]])) {
     $output.='<&>objcont<:>'.$order[$i].'<:>'.$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($order[$i+1])) {
     if (defined($resources[$order[$i+1]])) {      if (defined($resources[$order[$i+1]])) {
                $output.='<&>objlinks<:>'.$k.'<:>'.                 $output.='<&>objlinks<:>'.$k.'<:>'.
Line 356  sub storemap { Line 572  sub storemap {
             }              }
         }          }
     }      }
       for (my $i=0; $i<=$#zombies; $i++) {
           if (defined($zombies[$i])) {
       $output.='<&>objcont<:>'.$i.'<:>'.$zombies[$i];
           }
       }
     $output=~s/http\&colon\;\/\///g;      $output=~s/http\&colon\;\/\///g;
     $ENV{'form.output'}=$output;      $env{'form.output'}=$output;
     return       return 
      &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,''));       &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);
   }
   
   # ----------------------------------------------------------------- Edit script
 sub editscript {  sub editscript {
     my $mode=shift;      my $mode=shift;
       my $resurl=&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 408  function idxopen(mode) { Line 682  function idxopen(mode) {
    var options="scrollbars=1,resizable=1,menubar=0";     var options="scrollbars=1,resizable=1,menubar=0";
    idxmode=mode;     idxmode=mode;
    idxflag=1;     idxflag=1;
    idx=open("/res/?launch=1&mode=$mode&catalogmode="+mode,"idxout",options);     idx=open("$resurl/?launch=1&mode=$mode&catalogmode="+mode,"idxout",options);
    idx.focus();     idx.focus();
 }  }
   
Line 447  function idxcheck(mode) { Line 721  function idxcheck(mode) {
   
     var editbrowser;      var editbrowser;
     function openbrowser(formname,elementname,only,omit) {      function openbrowser(formname,elementname,only,omit) {
         var url = '/res/?';          var url = '$resurl/?';
         if (editbrowser == null) {          if (editbrowser == null) {
             url += 'launch=1&';              url += 'launch=1&';
         }          }
Line 476  sub smpedt { Line 750  sub smpedt {
    my $buttons=&buttons(2);     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'}) {
        $targetmsg='<b>Saving ...</b><br>';  
        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),'');                             &mapread(&Apache::lonnet::filelocation('',$url),'');
          unless ($fatal) {
      $targetmsg='<b>'.&mt('Saved.').'</b><br />';
          } else {
      $targetmsg='<b>'.&mt('An error occured while saving.').'</b><br />';
          }
    }     }
    if ($ENV{'form.revert'}) {     if ($env{'form.revert'}) {
        $targetmsg='<b>Reverting ...</b><br>';         $targetmsg='<b>'.&mt('Reverted.').'</b><br />';
        unlink($tmpfn);         unlink($tmpfn);
        my ($errtext,$fatal)=         my ($errtext,$fatal)=
                            &mapread(&Apache::lonnet::filelocation('',$url),'');                             &mapread(&Apache::lonnet::filelocation('',$url),'');
    }     }
    if (-e $tmpfn) {     if (-e $tmpfn) {
       $targetmsg=        $targetmsg=
         '<b><font color="red">You are working with an unsaved version of your map.</font></b><br>';          '<b><font color="red">'.&mt('You are working with an unsaved version of your map.').'</font></b><br>';
       my ($errtext,$fatal)=&mapread($tmpfn,'');        my ($errtext,$fatal)=&mapread($tmpfn,'');
    }     }
 # ---------------------------------------------------------- Process form input  # ---------------------------------------------------------- Process form input
   
    my @importselect=();     my @importselect=&Apache::loncommon::get_env_multiple('form.importsel');
    my @targetselect=();     my @targetselect=&Apache::loncommon::get_env_multiple('form.target');
    undef @importselect;  
    undef @targetselect;  
    if (defined($ENV{'form.importsel'})) {  
        if (ref($ENV{'form.importsel'})) {  
    @importselect=sort(@{$ENV{'form.importsel'}});  
        } else {  
            @importselect=($ENV{'form.importsel'});  
        }  
    }  
    if (defined($ENV{'form.target'})) {  
        if (ref($ENV{'form.target'})) {  
    @targetselect=sort(@{$ENV{'form.target'}});  
        } else {  
            @targetselect=($ENV{'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 540  sub smpedt { Line 802  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 552  sub smpedt { Line 814  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 568  sub smpedt { Line 830  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 588  sub smpedt { Line 850  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.='&'.&Apache::lonnet::escape($name).'='.
Line 606  sub smpedt { Line 868  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=$#order+1;
        }         }
        &pastetarget($lastsel,split(/\&/,$ENV{'form.importdetail'}));         &pastetarget($lastsel,split(/\&/,$env{'form.importdetail'}));
        &storemap(&Apache::lonnet::filelocation('',$url));         &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 652  sub smpedt { Line 914  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<=$#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]=$order[$i]; 
          } else {
      &makezombie($order[$i]);
          }
            }             }
            @order=@neworder;             @order=@neworder;
            &storemap(&Apache::lonnet::filelocation('',$url));                   &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];
Line 674  sub smpedt { Line 940  sub smpedt {
            $lastsel=$#order+1;             $lastsel=$#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);         &pastetarget($lastsel,@newsequence);
        &storemap(&Apache::lonnet::filelocation('',$url));         &storemap(&Apache::lonnet::filelocation('',$url));
 # ------------------------------------------------   # -------------------------------------------------------------------- Move up 
      } elsif ($env{'form.moveup'}) {
          foreach (sort @targetselect) {
              if ($_-1>0) {
                 my $movethis=$order[$_-1];
                 $order[$_-1]=$order[$_-2];
                 $order[$_-2]=$movethis;
     }
          }
          &storemap(&Apache::lonnet::filelocation('',$url));
   # ------------------------------------------------------------------ Move down
      } elsif ($env{'form.movedown'}) {
          foreach (reverse sort @targetselect) {
              if ($_-1<$#order) {
                 my $movethis=$order[$_-1];
                 $order[$_-1]=$order[$_];
                 $order[$_]=$movethis;
      }
          }
          &storemap(&Apache::lonnet::filelocation('',$url));
   # --------------------------------------------------------------------- Rename
      } elsif ($env{'form.renameres'}) {
          my $residx=$Apache::lonratedt::order[$env{'form.renameidx'}-1];
          my ($name,@resrest)=split(/\:/,$Apache::lonratedt::resources[$residx]);
          $name=$env{'form.renametitle'};
          $name=~s/\:/\&colon\;/g;
          $Apache::lonratedt::resources[$residx]=$name.':'.join(':',@resrest);
          &storemap(&Apache::lonnet::filelocation('',$url));
    }     }
 # ------------------------------------------------------------ Assemble windows  # ------------------------------------------------------------ Assemble windows
         
Line 688  sub smpedt { Line 981  sub smpedt {
    $importdetail='&'.$importdetail;     $importdetail='&'.$importdetail;
    $importdetail=~s/^\&+/\&/;     $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 ($_) { 
Line 701  sub smpedt { Line 994  sub smpedt {
    } 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(/\:/,$resources[$_]);
        unless ($name) {  $name=(split(/\//,$url))[-1]; }         unless ($name) {  $name=(split(/\//,$url))[-1]; }
Line 710  sub smpedt { Line 1004  sub smpedt {
        $targetdetail.='&'.&Apache::lonnet::escape($name).'='.         $targetdetail.='&'.&Apache::lonnet::escape($name).'='.
                   &Apache::lonnet::escape($url);                    &Apache::lonnet::escape($url);
        $idx++;         $idx++;
          $name=~s/\&colon;/\:/g;
        '<option value="'.$idx.'">'.$name.'</option>';         '<option value="'.$idx.'">'.$name.'</option>';
    } @order);     } @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,1);     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(
         'sa' => 'Save',
         'nt' => 'New Title',
         'se' => 'Search',
         'im' => 'Import',
         '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',
         );
    $r->print(<<ENDSMPHEAD);     $r->print(<<ENDSMPHEAD);
 <html>  <html>
 <head>  <head>
Line 741  sub smpedt { Line 1058  sub smpedt {
                 [document.forms.simpleedit.importsel.selectedIndex]);                  [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]);
          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);
          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>                   </head>                 
 $bodytag  $bodytag
 $buttons  $buttons
 <font color=red>$errtext</font>  <font color=red>$errtext</font>
 <h1>$url</h1>  
 <form name=simpleedit method=post>  <form name=simpleedit method=post>
 <input type=hidden name=forcesmp value=1>  <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="Search">  <input type=button onClick="javascript:groupsearch()" value="$lt{'se'}">
 <input type=button onClick="javascript:groupimport();" value="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  $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  <hr>$targetmsg
 <input type=submit name="revert" value="Revert to Last Saved">  <input type=submit name="revert" value="$lt{'rv'}">
 <input type=submit name="save" value="Save">  <input type=submit name="save" value="$lt{'sa'}">
 <input type=button onClick="javascript:viewtarget()" value="View">  <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>
Line 784  $importwindow Line 1127  $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>  <hr>
 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>
Line 825  sub viewmap { Line 1168  sub viewmap {
     my ($r,$url,$adv,$errtext)=@_;      my ($r,$url,$adv,$errtext)=@_;
     $r->print('<html>'.      $r->print('<html>'.
      &Apache::loncommon::bodytag('Edit Content of a Map').       &Apache::loncommon::bodytag('Edit Content of a Map').
      &buttons($adv));        &Apache::loncommon::help_open_menu('','','','',6,'RAT').
         &buttons($adv));
     if ($errtext) {      if ($errtext) {
  $r->print($errtext.'<hr>');   $r->print($errtext.'<hr />');
     }      }
     my $idx=0;      my $idx=0;
     $r->print('<h1>'.$url.'</h1>');      $r->print('<h1>'.$url.'</h1>');
       if ($adv) {
    $r->print('<p><b><font color="red">'.&mt('Map contents are not shown in order.').'</font></b></p><br />');
       }
       $r->print( '<table border="0" cellspacing="2" cellpadding="4">'.
                  '<tr bgcolor="#DDDDDD"><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>'.
                  '</tr>');
       my @backgroundColors = ("#FFFFFF", "#F6F6F6");
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {      foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
  if (defined($_)) {   if (defined($_)) {
             $idx++;              $idx++;
     my ($title,$url)=split(/\:/,$_);      my ($title,$url,$cond)=split(/\:/,$_);
       if ($cond eq 'cond') { next; }
             $title=~s/\&colon\;/\:/g;              $title=~s/\&colon\;/\:/g;
             $url=~s/\&colon\;/\:/g;              $url=~s/\&colon\;/\:/g;
             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 = &Apache::lonratsrv::qtescape($url);
               my $resfilepath = $Apache::lonnet::perlvar{'lonDocRoot'}.$resurl;
               my $filename; 
               if ($resurl =~ m#/([^/]+)$#) {
                   $filename = $1;
               }
               my $cstrurl = $resurl;
               $cstrurl =~ s#^/res/[^/]+/([^/]+)/#/priv/$1/#;
               my $bgcol = $idx%2; 
               $r->print('<tr bgcolor='.$backgroundColors[$bgcol].'><td>'.
                         '<img src="'.&Apache::loncommon::icon($resfilepath).
                         '" /></td><td>'.&Apache::lonratsrv::qtescape($title).
                         '</td><td>'.$filename.'</td><td>');
               if ($url) {
    $r->print('<a href="'.$resurl.'">'.&mt('Resource space').'</a>');
               }
               $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>');
             }              }
             $r->print(&Apache::lonratsrv::qtescape($title));              $r->print('</td></tr>'."\n");
             if ($url) { $r->print('</a>'); }  
     $r->print('<br>');  
         }          }
     }      }
       $r->print('</table>');
     $r->print('</body></html>');      $r->print('</body></html>');
 }  }
   
Line 854  sub viewmap { Line 1227  sub viewmap {
   
 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 871  sub handler { Line 1250  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 890  sub handler { Line 1269  sub handler {
   
 # ----------------------------------- 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);

Removed from v.1.36  
changed lines
  Added in v.1.71


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