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

version 1.18, 2002/05/15 20:24:32 version 1.36, 2002/09/04 16:54:44
Line 36  use strict; Line 36  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::loncommon;
   use File::Copy;
   
 my @order=();  use vars qw(@order @resources);
 my @resources=();  
   
   
 # Mapread read maps into global arrays @links and @resources, determines status  # Mapread read maps into global arrays @links and @resources, determines status
Line 52  sub mapread { Line 54  sub mapread {
     undef @links;      undef @links;
     undef @resources;      undef @resources;
     undef @order;      undef @order;
       @resources=('');
       @order=();
   
     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 65  sub mapread { Line 69  sub mapread {
         if ($command eq 'objlinks') {          if ($command eq 'objlinks') {
             $links[$number]=$content;              $links[$number]=$content;
         }          }
           if ($command eq 'objparms') {
       return('Map has resource parameters. Use advanced editor.',1);
           }
     }      }
 # ------------------------------------------------------- Is this a linear map?  # ------------------------------------------------------- Is this a linear map?
     my @starters=();      my @starters=();
Line 88  sub mapread { Line 95  sub mapread {
  }   }
   
     }      }
     for (my $i=0; $i<=$#resources; $i++) {      for (my $i=1; $i<=$#resources; $i++) {
         if (defined($resources[$i])) {          if (defined($resources[$i])) {
     unless (($starters[$i]) || ($endings[$i])) {      unless (($starters[$i]) || ($endings[$i])) {
                 return                  return
Line 127  sub mapread { Line 134  sub mapread {
 }  }
   
 # ---------------------------------------------- Read a map as well as possible  # ---------------------------------------------- Read a map as well as possible
   # Also used by the sequence handler
   # Call lonsequence::attemptread to read from resource space
   #
 sub attemptread {  sub attemptread {
     my $fn=shift;      my $fn=shift;
   
Line 274  sub buttons { Line 283  sub buttons {
     return $output.'</form><hr>';      return $output.'</form><hr>';
 }  }
   
   # ----------------------------------------------------------- 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=$#resources+1;
                  $insertorder[$#insertorder+1]=$idx;
                  my $ext='false';
                  if ($url=~/^http\:\/\//) { $ext='true'; }
                  $url=~s/\:/\&colon;/g;
                  $resources[$idx]=$name.':'.$url.':'.$ext.':normal:res';
      }
           }
       }
       my @oldorder=splice(@order,$after);
       @order=(@order,@insertorder,@oldorder);
   }
   
   # ------------------------------------------------ Get start and finish correct
   # modifies @resources
   
   sub startfinish {
       foreach (@order) {
    my ($name,$url,$ext)=split(/\:/,$resources[$_]);
           if ($url=~/http\&colon\:\/\//) { $ext='true'; }
           $resources[$_]=$name.':'.$url.':'.$ext.':normal:res';
       }
      my ($name,$url,$ext)=split(/\:/,$resources[$order[0]]);
      $resources[$order[0]]=$name.':'.$url.':'.$ext.':start:res';
      if ($#order==0) {
          $resources[$#resources+1]='::false';
          $order[1]=$#resources;
      }
      my ($name,$url,$ext)=split(/\:/,$resources[$order[$#order]]);
      $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($order[$i+1])) {
       if (defined($resources[$order[$i+1]])) {
                  $output.='<&>objlinks<:>'.$k.'<:>'.
      $order[$i].':'.$order[$i+1].':0';
          $k++;
               }
           }
       }
       $output=~s/http\&colon\;\/\///g;
       $ENV{'form.output'}=$output;
       return 
        &Apache::lonratsrv::loadmap($fn,&Apache::lonratsrv::savemap($fn,''));
   }
   
   sub editscript {
       my $mode=shift;
       return(<<ENDSCRIPT);
   var srch;
   var srchflag=-1; // 1 means currently open
                    // 0 means closed (but has been open)
                    // -1 means never yet opened/defined
   var srchmode='';
   
   var idx;
   var idxflag=-1; // 1 means currently open
                    // 0 means closed (but has been open)
                    // -1 means never yet opened/defined
   var idxmode='';
   
   // ------------------------------------------------------ Clears indexer window
   function idxclear() {
     idx.document.clear();
   }
   
   // ------------------------------------------------------- Clears search window
   function srchclear() {
     srch.document.clear();
   }
   
   // ------------------------------------------------------ Closes indexer window
   function idxclose() {
     if (idx && !idx.closed) {
       idxflag=0;
       idx.close();
     }
   }
   
   // ------------------------------------------------------- Closes search window
   function srchclose() {
     if (srch && !srch.closed) {
       srchflag=0;
       srch.close();
     }
   }
   
   // -------------------------------------------------------- Open indexer window
   function idxopen(mode) {
      var options="scrollbars=1,resizable=1,menubar=0";
      idxmode=mode;
      idxflag=1;
      idx=open("/res/?launch=1&mode=$mode&catalogmode="+mode,"idxout",options);
      idx.focus();
   }
   
   // --------------------------------------------------------- Open search window
   function srchopen(mode) {
      var options="scrollbars=1,resizable=1,menubar=0";
      srchmode=mode;
      srchflag=1;
      srch=open("/adm/searchcat?launch=1&mode=$mode&catalogmode="+mode,"srchout",options);
      srch.focus();
   }
   // ----------------------------------------------------- launch indexer browser
   function groupsearch() {
      srchcheck('groupsearch');
   }
   
   function groupimport() {
      idxcheck('groupimport');
   }
   // ------------------------------------------------------- Do srch status check
   function srchcheck(mode) {
      if (!srch || srch.closed || srchmode!=mode) {
         srchopen(mode);
      }
      srch.focus();
   }
   
   // -------------------------------------------------------- Do idx status check
   function idxcheck(mode) {
      if (!idx || idx.closed || idxmode!=mode) {
         idxopen(mode);
      }
      idx.focus();
   }
   
   
       var editbrowser;
       function openbrowser(formname,elementname,only,omit) {
           var url = '/res/?';
           if (editbrowser == null) {
               url += 'launch=1&';
           }
           url += 'catalogmode=interactive&';
           url += 'mode=edit&';
           url += 'form=' + formname + '&';
           if (only != null) {
               url += 'only=' + only + '&';
           } 
           if (omit != null) {
               url += 'omit=' + omit + '&';
           }
           url += 'element=' + elementname + '';
           var title = 'Browser';
           var options = 'scrollbars=1,resizable=1,menubar=0';
           options += ',width=700,height=600';
           editbrowser = open(url,title,options,'1');
           editbrowser.focus();
       }
   ENDSCRIPT
   }
   # ------------------------------------------------------- Simple edit processor
   
 sub smpedt {  sub smpedt {
    my ($r,$errtext)=@_;     my ($r,$url,$errtext)=@_;
    my $buttons=&buttons(2);     my $buttons=&buttons(2);
      my $tmpfn=&Apache::lonnet::filelocation('',$url).'.tmp';
      my $targetmsg='';
      if ($ENV{'form.save'}) {
          $targetmsg='<b>Saving ...</b><br>';
          copy($tmpfn,&Apache::lonnet::filelocation('',$url));
          unlink($tmpfn);
          my ($errtext,$fatal)=
                              &mapread(&Apache::lonnet::filelocation('',$url),'');
      }
      if ($ENV{'form.revert'}) {
          $targetmsg='<b>Reverting ...</b><br>';
          unlink($tmpfn);
          my ($errtext,$fatal)=
                              &mapread(&Apache::lonnet::filelocation('',$url),'');
      }
      if (-e $tmpfn) {
         $targetmsg=
           '<b><font color="red">You are working with an unsaved version of your map.</font></b><br>';
         my ($errtext,$fatal)=&mapread($tmpfn,'');
      }
 # ---------------------------------------------------------- Process form input  # ---------------------------------------------------------- Process form input
   
    my @importselect=();     my @importselect=();
    my @targetselect=();     my @targetselect=();
    undef @importselect;     undef @importselect;
    undef @targetselect;     undef @targetselect;
    if (defined($ENV{'form.import'})) {     if (defined($ENV{'form.importsel'})) {
        if (ref($ENV{'form.import'})) {         if (ref($ENV{'form.importsel'})) {
    @importselect=sort($ENV->{'form.import'});     @importselect=sort(@{$ENV{'form.importsel'}});
        } else {         } else {
            @importselect=($ENV{'form.import'});             @importselect=($ENV{'form.importsel'});
        }         }
    }     }
    if (defined($ENV{'form.target'})) {     if (defined($ENV{'form.target'})) {
        if (ref($ENV{'form.target'})) {         if (ref($ENV{'form.target'})) {
    @targetselect=sort($ENV->{'form.target'});     @targetselect=sort(@{$ENV{'form.target'}});
        } else {         } else {
            @targetselect=($ENV{'form.target'});             @targetselect=($ENV{'form.target'});
        }         }
Line 372  sub smpedt { Line 588  sub smpedt {
        }         }
   
        foreach (         foreach (
     &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 389  sub smpedt { Line 605  sub smpedt {
        $importdetail=~s/\&+/\&/g;         $importdetail=~s/\&+/\&/g;
        $importdetail=~s/^\&//;         $importdetail=~s/^\&//;
   
 # ------------------------------------  # ------------------------------------------------ Groupimport/search to target
    }     } elsif ($ENV{'form.importdetail'}) {
          my $lastsel;
          if (defined($targetselect[-1])) {
      $lastsel=$targetselect[-1];
          } else {
              $lastsel=$#order+1;
          }
          &pastetarget($lastsel,split(/\&/,$ENV{'form.importdetail'}));
          &storemap(&Apache::lonnet::filelocation('',$url));
   # ------------------------------------------------------------------------- Cut
      } elsif (($ENV{'form.cut'}) || ($ENV{'form.copy'})) {
          $importdetail='';
          my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
   
 # ------------------------------------------------------------ Assemble windows         my $lastsel;
   
          if (defined($importselect[-1])) {
      $lastsel=$importselect[-1];
          } else {
              $lastsel=$#curimport;
          }
   
          for (my $i=0;$i<=$lastsel;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
      }
          }
   
          foreach (@targetselect) {
      my ($name,$url)=split(/\:/,$resources[$order[$_-1]]);
              if ($url) {
                 $importdetail.='&'.&Apache::lonnet::escape($name).'='.
            &Apache::lonnet::escape($url);
     }
          }
   
          for (my $i=$lastsel+1;$i<=$#curimport;$i++) {
              my ($name,$url)=split(/\=/,$curimport[$i]);
              if ($url) {
                 $importdetail.='&'.$name.'='.$url;
     }
          }
          $importdetail=~s/\&+/\&/g;
          $importdetail=~s/^\&//;
   
          if ($ENV{'form.cut'}) {
              my @neworder=();
              for (my $i=0;$i<=$#order;$i++) {
                  my $include=1;
                  foreach (@targetselect) {
      if ($_-1==$i) { $include=0; }
                  }
                  if ($include) { $neworder[$#neworder+1]=$order[$i]; }
              }
              @order=@neworder;
              &storemap(&Apache::lonnet::filelocation('',$url));      
          }
   
   # ----------------------------------------------------------------------- Paste
      } elsif ($ENV{'form.paste'}) {
          my $lastsel;
          if (defined($targetselect[-1])) {
      $lastsel=$targetselect[-1];
          } else {
              $lastsel=$#order+1;
          }
          my @newsequence;
          my @curimport=split(/\&/,$ENV{'form.curimpdetail'});
          foreach (@importselect) {
             $newsequence[$#newsequence+1]=$curimport[$_];
          }
          &pastetarget($lastsel,@newsequence);
          &storemap(&Apache::lonnet::filelocation('',$url));
   # ------------------------------------------------ 
      }
   # ------------------------------------------------------------ Assemble windows
      
    my $idx=-1;     my $idx=-1;
    my $importwindow=join("\n",map {     $importdetail='&'.$importdetail;
      $importdetail=~s/^\&+/\&/;
      my $importwindow=
          '<option value="-1"> ---- Import and Paste Area ---- </option>'.
        join("\n",map {
        $idx++;         $idx++;
        if ($_) {          if ($_) { 
           my ($name,$url)=split(/\=/,$_);            my ($name,$url)=split(/\=/,$_);
Line 407  sub smpedt { Line 701  sub smpedt {
    } split(/\&/,$importdetail));     } split(/\&/,$importdetail));
   
    $idx=0;     $idx=0;
    my $targetwindow=join("\n",map {      my $targetwindow=       
          '<option value="0"> ------- Target Edit Map ------- </option>'.
        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]; }
        unless ($name) { $name='EMPTY'; }         unless ($name) { $name='EMPTY'; }
        $targetdetail.='&'.&Apache::lonnet::escape($name).'='.         $targetdetail.='&'.&Apache::lonnet::escape($name).'='.
                   &Apache::lonnet::escape($url);                    &Apache::lonnet::escape($url);
        $idx++;         $idx++;
        '<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 $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);
    $r->print(<<ENDSMPHEAD);     $r->print(<<ENDSMPHEAD);
 <html>  <html>
 <head>  <head>
 <script>  <script>
 var srch;  
 var srchflag=-1; // 1 means currently open  
                  // 0 means closed (but has been open)  
                  // -1 means never yet opened/defined  
 var srchmode='';  
   
 var idx;  
 var idxflag=-1; // 1 means currently open  
                  // 0 means closed (but has been open)  
                  // -1 means never yet opened/defined  
 var idxmode='';  
   
 // ------------------------------------------------------ Clears indexer window  
 function idxclear() {  
   idx.document.clear();  
 }  
   
 // ------------------------------------------------------- Clears search window     $editscript
 function srchclear() {  
   srch.document.clear();  
 }  
   
 // ------------------------------------------------------ Closes indexer window     function openview(entry) {
 function idxclose() {         var url=unescape((entry.split('='))[1]);
   if (idx && !idx.closed) {         var parts=new Array;
     idxflag=0;         parts=url.split('&colon;');
     idx.close();         url=parts.join(':');
   }         if (url) { open(url,'cat'); }
 }  
   
 // ------------------------------------------------------- Closes search window  
 function srchclose() {  
   if (srch && !srch.closed) {  
     srchflag=0;  
     srch.close();  
   }  
 }  
   
 // -------------------------------------------------------- Open indexer window  
 function idxopen(mode) {  
    var options="scrollbars=1,resizable=1,menubar=0";  
    idxmode=mode;  
    idxflag=1;  
    idx=open("/res/?launch=1&mode=simple&catalogmode="+mode,"idxout",options);  
    idx.focus();  
 }  
   
 // --------------------------------------------------------- Open search window  
 function srchopen(mode) {  
    var options="scrollbars=1,resizable=1,menubar=0";  
    srchmode=mode;  
    srchflag=1;  
    srch=open("/adm/searchcat?launch=1&mode=simple&catalogmode="+mode,"srchout",options);  
    srch.focus();  
 }  
 // ----------------------------------------------------- launch indexer browser  
 function groupsearch() {  
    srchcheck('groupsearch');  
 }  
   
 function groupimport() {  
    idxcheck('groupimport');  
 }  
 // ------------------------------------------------------- Do srch status check  
 function srchcheck(mode) {  
    if (!srch || srch.closed || srchmode!=mode) {  
       srchopen(mode);  
    }     }
    srch.focus();  
 }  
   
 // -------------------------------------------------------- Do idx status check     function viewtarget() {
 function idxcheck(mode) {         openview((document.forms.simpleedit.targetdetail.value.split('&'))
    if (!idx || idx.closed || idxmode!=mode) {                  [document.forms.simpleedit.target.selectedIndex]);
       idxopen(mode);  
    }     }
    idx.focus();  
 }  
   
      function viewimport() {
          openview((document.forms.simpleedit.curimpdetail.value.split('&'))
                   [document.forms.simpleedit.importsel.selectedIndex]);
      }
   
     var editbrowser;  
     function openbrowser(formname,elementname,only,omit) {  
         var url = '/res/?';  
         if (editbrowser == null) {  
             url += 'launch=1&';  
         }  
         url += 'catalogmode=interactive&';  
         url += 'mode=edit&';  
         url += 'form=' + formname + '&';  
         if (only != null) {  
             url += 'only=' + only + '&';  
         }   
         if (omit != null) {  
             url += 'omit=' + omit + '&';  
         }  
         url += 'element=' + elementname + '';  
         var title = 'Browser';  
         var options = 'scrollbars=1,resizable=1,menubar=0';  
         options += ',width=700,height=600';  
         editbrowser = open(url,title,options,'1');  
         editbrowser.focus();  
     }  
 </script>  </script>
 </head>                   </head>                 
 <body bgcolor='#FFFFFF'>  $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>
 <table>  <table>
Line 536  $buttons Line 754  $buttons
 <th>&nbsp;</th>  <th>&nbsp;</th>
 <th width="40%">Target</th></tr>  <th width="40%">Target</th></tr>
 <tr><td bgcolor="#FFFFCC">  <tr><td bgcolor="#FFFFCC">
 <input type=button onClick="javascript:groupsearch()" value="Group Search">  <input type=button onClick="javascript:groupsearch()" value="Search">
 <input type=button onClick="javascript:groupimport();" value="Group Import">  <input type=button onClick="javascript:groupimport();" value="Import">
 after selected  after selected
 <hr>  <hr>
 <input type=text size=20 name=importmap>  <input type=text size=20 name=importmap>
Line 555  value="Browse"><input type=submit name=l Line 773  value="Browse"><input type=submit name=l
 <input type=button onClick=  <input type=button onClick=
 "javascript:impfortarget.value=1;groupimport();" value="Group Import">  "javascript:impfortarget.value=1;groupimport();" value="Group Import">
 after selected  after selected
 <hr><input type=button onClick="javascript:viewtarget()" value="View">  <hr>$targetmsg
   <input type=submit name="revert" value="Revert to Last Saved">
   <input type=submit name="save" value="Save">
   <input type=button onClick="javascript:viewtarget()" value="View">
 </td></tr>  </td></tr>
   
 <tr><td bgcolor="#FFFFCC"><select name="import" multiple>  <tr><td bgcolor="#FFFFCC"><select name="importsel" size=10 multiple>
 $importwindow  $importwindow
 </select>  </select>
 </td>  </td>
Line 566  $importwindow Line 787  $importwindow
 Cut selected<br>  Cut selected<br>
 <input type=submit name=cut value='<<<'><p>  <input type=submit name=cut value='<<<'><p>
 <hr>  <hr>
   Copy selected<br>
   <input type=submit name=copy value='<--'><p>
   <hr>
 Paste after selected<br>  Paste after selected<br>
 <input type=submit name=paste value='>>>'>  <input type=submit name=paste value='-->'>
 </td>  </td>
 <td bgcolor="#FFFFCC"><select name="target" multiple>  <td bgcolor="#FFFFCC"><select name="target" size=10 multiple>
 $targetwindow  $targetwindow
 </select>  </select>
 </table>  </table>
Line 599  ENDNODIR Line 823  ENDNODIR
   
 sub viewmap {  sub viewmap {
     my ($r,$url,$adv,$errtext)=@_;      my ($r,$url,$adv,$errtext)=@_;
     $r->print('<html><body bgcolor="#FFFFFF">'.&buttons($adv));      $r->print('<html>'.
        &Apache::loncommon::bodytag('Edit Content of a Map').
        &buttons($adv));
     if ($errtext) {      if ($errtext) {
  $r->print($errtext.'<hr>');   $r->print($errtext.'<hr>');
     }      }
       my $idx=0;
       $r->print('<h1>'.$url.'</h1>');
     foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {      foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) {
  if (defined($_)) {   if (defined($_)) {
               $idx++;
     my ($title,$url)=split(/\:/,$_);      my ($title,$url)=split(/\:/,$_);
             $title=~s/\&colon\;/\:/g;              $title=~s/\&colon\;/\:/g;
             $url=~s/\&colon\;/\:/g;              $url=~s/\&colon\;/\:/g;
Line 615  sub viewmap { Line 844  sub viewmap {
             }              }
             $r->print(&Apache::lonratsrv::qtescape($title));              $r->print(&Apache::lonratsrv::qtescape($title));
             if ($url) { $r->print('</a>'); }              if ($url) { $r->print('</a>'); }
             $r->print('<br>');      $r->print('<br>');
         }          }
     }      }
     $r->print('</body></html>');      $r->print('</body></html>');
Line 664  sub handler { Line 893  sub handler {
   if ($ENV{'form.forceadv'}) {    if ($ENV{'form.forceadv'}) {
       &ratedt($r,$url);        &ratedt($r,$url);
   } elsif ($ENV{'form.forcesmp'}) {    } elsif ($ENV{'form.forcesmp'}) {
       &smpedt($r,$errtext);        &smpedt($r,$url,$errtext);
   } else {    } else {
       &viewmap($r,$url,$adv,$errtext);        &viewmap($r,$url,$adv,$errtext);
   }    }

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


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.