Diff for /loncom/interface/lonsearchcat.pm between versions 1.123 and 1.125

version 1.123, 2002/06/19 20:39:11 version 1.125, 2002/06/20 19:43:50
Line 121  button that closes the search window Line 121  button that closes the search window
   
 button to take the selecte results and go to group sorting  button to take the selecte results and go to group sorting
   
 =item $hidden  
   
 holds 'hidden' html forms  
   
 =item $scrout  
   
 string that holds portions of the screen output  
   
 =item $yourself  
   
 allows for quickly limiting to oneself  
   
 =item %hash     =item %hash   
   
 The ubiquitous database hash  The ubiquitous database hash
Line 157  my %hitcount;    # stores number of hits Line 145  my %hitcount;    # stores number of hits
 # -- dynamically rendered interface components  # -- dynamically rendered interface components
 my $closebutton;  # button that closes the search window  my $closebutton;  # button that closes the search window
 my $importbutton; # button to take the selected results and go to group sorting  my $importbutton; # button to take the selected results and go to group sorting
 my $hidden;       # Holds 'hidden' html forms  
   
 # -- miscellaneous variables  # -- miscellaneous variables
 my $scrout;   # string that holds portions of the screen output  
 my $yourself; # allows for quickly limiting to oneself  my $yourself; # allows for quickly limiting to oneself
 my %hash;     # database hash  my %hash;     # database hash
   
Line 199  BEGIN { Line 185  BEGIN {
   
 =item &handler() - main handler invoked by httpd child  =item &handler() - main handler invoked by httpd child
   
   =item Variables
   
   =over 4
   
   =item $hidden
   
   holds 'hidden' html forms
   
   =item $scrout
   
   string that holds portions of the screen output
   
   =back 
   
 =cut  =cut
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 # ----------------------------- Handling routine called via Apache and mod_perl  
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
     untie %hash;      untie %hash;
Line 217  sub handler { Line 216  sub handler {
             "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";              "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
              ['catalogmode','launch','acts','mode','form','element']);               ['catalogmode','launch','acts','mode','form','element',
                 'reqinterface']);
       ##
       ## Clear out old values from database
       ##
     if ($ENV{'form.launch'} eq '1') {      if ($ENV{'form.launch'} eq '1') {
  if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {   if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
     &start_fresh_session();      &start_fresh_session();
Line 229  sub handler { Line 231  sub handler {
     return OK;      return OK;
  }   }
     }      }
       ##
 # --------------------------- Produce some output, so people know it is working      ## Produce some output, so people know it is working
       ##
     $r->print("\n");      $r->print("\n");
     $r->rflush;      $r->rflush;
       ##
 # ----------------------------------- configure dynamic components of interface      ## Configure dynamic components of interface
       ##
       my $hidden;       # Holds 'hidden' html forms
     if ($ENV{'form.catalogmode'} eq 'interactive') {      if ($ENV{'form.catalogmode'} eq 'interactive') {
  $hidden="<input type='hidden' name='catalogmode' value='interactive'>".   $hidden="<input type='hidden' name='catalogmode' value='interactive'>".
     "\n";      "\n";
         $closebutton="<input type='button' name='close' value='CLOSE' ".          $closebutton="<input type='button' name='close' value='CLOSE' ".
     "onClick='self.close()'>"."\n";      "onClick='self.close()'>"."\n";
     }      } elsif ($ENV{'form.catalogmode'} eq 'groupsearch') {
     elsif ($ENV{'form.catalogmode'} eq 'groupsearch') {  
  $hidden=<<END;   $hidden=<<END;
 <input type='hidden' name='catalogmode' value='groupsearch'>  <input type='hidden' name='catalogmode' value='groupsearch'>
 END  END
Line 261  END Line 263  END
 <input type='hidden' name='element' value='$ENV{'form.element'}'>  <input type='hidden' name='element' value='$ENV{'form.element'}'>
 <input type='hidden' name='date' value='2'>  <input type='hidden' name='date' value='2'>
 END  END
 # ------------------------------------------------------ Determine current user      ##
     $yourself=$ENV{'user.name'}.'@'.$ENV{'user.domain'};      ##  What are we doing?
       ##
 # --- Now, depending on the interface actions, do one of three things here:  
 # --- 1. a basic search  
 # --- 2. an advanced search  
 # --- 3. output a search interface  
   
 # ----------------------------------- See if a search invocation should be done  
     if ($ENV{'form.basicsubmit'} eq 'SEARCH') {      if ($ENV{'form.basicsubmit'} eq 'SEARCH') {
  untie %hash; return &basicsearch($r,\%ENV);          # Perform basic search and give results
    return &basicsearch($r,\%ENV,$hidden);
       } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
           # Perform advanced search and give results
    return &advancedsearch($r,\%ENV,$hidden);
       } elsif ($ENV{'form.reqinterface'} eq 'advanced') {
           # Output the advanced interface
           $r->print(&advanced_search_form($closebutton,$hidden));
           return OK;
       } else { 
           # Output normal search interface
           $r->print(&basic_search_form($closebutton,$hidden));
     }      }
     elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {      return OK;
  untie %hash; return &advancedsearch($r,\%ENV);  } 
   
   ######################################################################
   ######################################################################
   
   =pod 
   
   =item &basic_search_form() 
   
   Returns a scalar which holds html for the basic search form.
   
   =cut
   
   ######################################################################
   ######################################################################
   
   sub basic_search_form{
       my ($closebutton,$hidden) = @_;
       my $scrout=<<"ENDDOCUMENT";
   <html>
   <head>
   <title>The LearningOnline Network with CAPA</title>
   <script type="text/javascript">
       function openhelp(val) {
    openhelpwin=open('/adm/help/searchcat.html','helpscreen',
        'scrollbars=1,width=600,height=300');
    openhelpwin.focus();
     }      }
   </script>
   </head>
   <body bgcolor="#FFFFFF">
   <img align='right' src='/adm/lonIcons/lonlogos.gif' />
   <h1>Search Catalog</h1>
   <form method="post" action="/adm/searchcat">
   $hidden
   <h3>Basic Search</h3>
   <p>
   Enter terms or phrases separated by AND, OR, or NOT then press SEARCH below.
   </p>
   <p>
   <table>
   <tr><td>
   ENDDOCUMENT
       $scrout.='&nbsp;'.&simpletextfield('basicexp',$ENV{'form.basicexp'},40).
           '&nbsp;';
   #    $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'});
   #    $scrout.='<font color="#800000">Search historic archives</font>';
       $scrout.=<<ENDDOCUMENT;
   </td><td><a href="/adm/searchcat?reqinterface=advanced">Advanced Search</a></td></tr></table>
   </p>
   <p>
   &nbsp;<input type="submit" name="basicsubmit" value='SEARCH' />&nbsp;
   $closebutton
   <!-- basic view selection -->
   <select name='basicviewselect'>
   <option value='Detailed Citation View' selected="true">
   Detailed Citation View</option>
   <option value='Summary View'>Summary View</option>
   <option value='Fielded Format'>Fielded Format</option>
   <option value='XML/SGML'>XML/SGML</option>
   </select>
   <!-- end of basic view selection -->
   <input type="button" value="HELP" onClick="openhelp()" />
   </p>
   </form>
   </body>
   </html>
   ENDDOCUMENT
       return $scrout;
   }
   ######################################################################
   ######################################################################
   
   =pod 
   
   =item &advanced_search_form() 
   
   Returns a scalar which holds html for the advanced search form.
   
   =cut
   
 # ----------------------------- Else, begin building search interface to output  ######################################################################
     $scrout=''; # building a part of screen output  ######################################################################
   
   sub advanced_search_form{
       my ($closebutton,$hidden) = @_;
       my $scrout=<<"ENDHEADER";
   <html>
   <head>
   <title>The LearningOnline Network with CAPA</title>
   <script type="text/javascript">
       function openhelp(val) {
    openhelpwin=open('/adm/help/searchcat.html','helpscreen',
        'scrollbars=1,width=600,height=300');
    openhelpwin.focus();
       }
   </script>
   </head>
   <body bgcolor="#FFFFFF">
   <img align='right' src='/adm/lonIcons/lonlogos.gif' />
   <h1>Search Catalog</h1>
   <form method="post" action="/adm/searchcat">
   $hidden
   <hr />
   <h3>Advanced Search</h3>
   ENDHEADER
     $scrout.=&searchphrasefield('Limit by title','title',      $scrout.=&searchphrasefield('Limit by title','title',
  $ENV{'form.title'});   $ENV{'form.title'});
   
     $scrout.=&searchphrasefield('Limit by author','author',      $scrout.=&searchphrasefield('Limit by author','author',
  $ENV{'form.author'});   $ENV{'form.author'});
   
     $scrout.=&searchphrasefield('Limit by subject','subject',      $scrout.=&searchphrasefield('Limit by subject','subject',
  $ENV{'form.subject'});   $ENV{'form.subject'});
   
     $scrout.=&searchphrasefield('Limit by keywords','keywords',      $scrout.=&searchphrasefield('Limit by keywords','keywords',
  $ENV{'form.keywords'});   $ENV{'form.keywords'});
   
     $scrout.=&searchphrasefield('Limit by URL','url',      $scrout.=&searchphrasefield('Limit by URL','url',
  $ENV{'form.url'});   $ENV{'form.url'});
   
 #    $scrout.=&searchphrasefield('Limit by version','version',  #    $scrout.=&searchphrasefield('Limit by version','version',
 # $ENV{'form.version'});  # $ENV{'form.version'});
   
     $scrout.=&searchphrasefield('Limit by notes','notes',      $scrout.=&searchphrasefield('Limit by notes','notes',
  $ENV{'form.notes'});   $ENV{'form.notes'});
   
     $scrout.=&searchphrasefield('Limit by abstract','abstract',      $scrout.=&searchphrasefield('Limit by abstract','abstract',
  $ENV{'form.abstract'});   $ENV{'form.abstract'});
   
     $ENV{'form.mime'}='any' unless length($ENV{'form.mime'});      $ENV{'form.mime'}='any' unless length($ENV{'form.mime'});
     $scrout.=&selectbox('Limit by MIME type','mime',      $scrout.=&selectbox('Limit by MIME type','mime',
  $ENV{'form.mime'},   $ENV{'form.mime'},
  'any','Any type',   'any','Any type',
  \&{Apache::loncommon::filedescriptionex},   \&{Apache::loncommon::filedescriptionex},
  (&Apache::loncommon::fileextensions));   (&Apache::loncommon::fileextensions));
   
     $ENV{'form.language'}='any' unless length($ENV{'form.language'});      $ENV{'form.language'}='any' unless length($ENV{'form.language'});
   
     $scrout.=&selectbox('Limit by language','language',      $scrout.=&selectbox('Limit by language','language',
  $ENV{'form.language'},'any','Any Language',   $ENV{'form.language'},'any','Any Language',
  \&{Apache::loncommon::languagedescription},   \&{Apache::loncommon::languagedescription},
  (&Apache::loncommon::languageids),   (&Apache::loncommon::languageids),
  );   );
   
 # ------------------------------------------------ Compute date selection boxes  # ------------------------------------------------ Compute date selection boxes
     $scrout.=<<CREATIONDATESTART;      $scrout.=<<CREATIONDATESTART;
 <p>  <p>
Line 331  CREATIONDATESTART Line 428  CREATIONDATESTART
  $ENV{'form.creationdatestart_day'},   $ENV{'form.creationdatestart_day'},
  $ENV{'form.creationdatestart_year'},   $ENV{'form.creationdatestart_year'},
  );   );
     $scrout.=<<CREATIONDATEEND;      $scrout.="and:\n";
 and:  
 CREATIONDATEEND  
     $scrout.=&dateboxes('creationdateend',12,31,2051,      $scrout.=&dateboxes('creationdateend',12,31,2051,
  $ENV{'form.creationdateend_month'},   $ENV{'form.creationdateend_month'},
  $ENV{'form.creationdateend_day'},   $ENV{'form.creationdateend_day'},
  $ENV{'form.creationdateend_year'},   $ENV{'form.creationdateend_year'},
  );   );
     $scrout.="</p>";      $scrout.="</p>";
   
     $scrout.=<<LASTREVISIONDATESTART;      $scrout.=<<LASTREVISIONDATESTART;
 <p>  <p>
 <font color="#800000" face="helvetica"><b>LIMIT BY LAST REVISION DATE RANGE:  <font color="#800000" face="helvetica"><b>LIMIT BY LAST REVISION DATE RANGE:
Line 361  LASTREVISIONDATEEND Line 455  LASTREVISIONDATEEND
  $ENV{'form.lastrevisiondateend_year'},   $ENV{'form.lastrevisiondateend_year'},
  );   );
     $scrout.='</p>';      $scrout.='</p>';
   
     $scrout.=&searchphrasefield('Limit by publisher/owner','owner',      $scrout.=&searchphrasefield('Limit by publisher/owner','owner',
  $ENV{'form.owner'});   $ENV{'form.owner'});
   
     $ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'});      $ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'});
     $scrout.=&selectbox('Limit by copyright/distribution','copyright',      $scrout.=&selectbox('Limit by copyright/distribution','copyright',
  $ENV{'form.copyright'},   $ENV{'form.copyright'},
Line 372  LASTREVISIONDATEEND Line 464  LASTREVISIONDATEEND
  \&{Apache::loncommon::copyrightdescription},   \&{Apache::loncommon::copyrightdescription},
  (&Apache::loncommon::copyrightids),   (&Apache::loncommon::copyrightids),
  );   );
   
 # ------------------------------------------- Compute customized metadata field  # ------------------------------------------- Compute customized metadata field
     $scrout.=<<CUSTOMMETADATA;      $scrout.=<<CUSTOMMETADATA;
 <p>  <p>
Line 383  For resource-specific metadata, enter in Line 474  For resource-specific metadata, enter in
 <b>Example:</b> grandmother=75 OR grandfather=85  <b>Example:</b> grandmother=75 OR grandfather=85
 <br />  <br />
 CUSTOMMETADATA  CUSTOMMETADATA
 $scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'});      $scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'});
 $scrout.=' <i>initial users of this system do not need to worry about this option</i>';  
   
     $scrout.=<<CUSTOMSHOW;      $scrout.=<<CUSTOMSHOW;
 <p>  <p>
 <font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b>  <font color="#800000" face="helvetica"><b>SHOW SPECIAL METADATA FIELDS:</b>
Line 394  Enter in a space-separated list of speci Line 483  Enter in a space-separated list of speci
 in a fielded listing for each record result.  in a fielded listing for each record result.
 <br />  <br />
 CUSTOMSHOW  CUSTOMSHOW
 $scrout.=&simpletextfield('customshow',$ENV{'form.customshow'});      $scrout.=&simpletextfield('customshow',$ENV{'form.customshow'});
 $scrout.=' <i>initial users of this system do not need to worry about this option</i>';      $scrout.=<<ENDDOCUMENT;
   
 # ---------------------------------------------------------------- Print screen  
     $r->print(<<ENDDOCUMENT);  
 <html>  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 <script type="text/javascript">  
     function openhelp(val) {  
  openhelpwin=open('/adm/help/searchcat.html','helpscreen',  
      'scrollbars=1,width=600,height=300');  
  openhelpwin.focus();  
     }  
 </script>  
 </head>  
 <body bgcolor="#FFFFFF">  
 <img align='right' src='/adm/lonIcons/lonlogos.gif' />  
 <h1>Search Catalog</h1>  
 <form method="post" action="/adm/searchcat">  
 $hidden  
 <hr />  
 <h3>Basic Search</h3>  
 <p>  
 Enter terms or phrases separated by search operators  
 such as AND, OR, or NOT then press SEARCH below.  Terms should be specific  
 to the title, author, subject, notes, or abstract information associated  
 with a resource.  
 <br />  
 ENDDOCUMENT  
     $r->print(&simpletextfield('basicexp',$ENV{'form.basicexp'}));  
     $r->print(' ');  
     $r->print(&simplecheckbox('titleonly',$ENV{'form.titleonly'}));  
     $r->print('<font color="#800000">Title only</font> ');  
 #    $r->print(&simplecheckbox('allversions',$ENV{'form.allversions'}));  
 # <font color="#800000">Search historic archives</font>  
     $r->print(<<ENDDOCUMENT);  
 <br />  
 <input type="submit" name="basicsubmit" value='SEARCH' />  
 <input type="reset" name="reset" value='RESET' />  
 $closebutton  
 <!-- basic view selection -->  
 <select name='basicviewselect'>  
 <option value='Detailed Citation View' selected="true">  
 Detailed Citation View</option>  
 <option value='Summary View'>Summary View</option>  
 <option value='Fielded Format'>Fielded Format</option>  
 <option value='XML/SGML'>XML/SGML</option>  
 </select>  
 <!-- end of basic view selection -->  
 <input type="button" value="HELP" onClick="openhelp()" />  
 </p>  
 <hr />  
 <h3>Advanced Search</h3>  
 $scrout  
 <p>  <p>
 <input type="submit" name="advancedsubmit" value='SEARCH' />  <input type="submit" name="advancedsubmit" value='SEARCH' />
 <input type="reset" name="reset" value='RESET' />  <input type="reset" name="reset" value='RESET' />
Line 468  Detailed Citation View</option> Line 504  Detailed Citation View</option>
 </body>  </body>
 </html>  </html>
 ENDDOCUMENT  ENDDOCUMENT
     return OK;      return $scrout;
 }   }
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
Line 488  a 'hidden' html input tag. Line 524  a 'hidden' html input tag.
   
 sub make_persistent {  sub make_persistent {
     my $persistent='';      my $persistent='';
       
     foreach (keys %ENV) {      foreach (keys %ENV) {
  if (/^form\./ && !/submit/) {   if (/^form\./ && !/submit/) {
     my $name=$_;      my $name=$_;
Line 496  sub make_persistent { Line 531  sub make_persistent {
     $ENV{$key}=~s/\'//g; # do not mess with html field syntax      $ENV{$key}=~s/\'//g; # do not mess with html field syntax
     $name=~s/^form\.//;      $name=~s/^form\.//;
     $persistent.=<<END;      $persistent.=<<END;
 <input type='hidden' name='$name' value='$ENV{$key}' />  <input type="hidden" name="$name" value="$ENV{$key}" />
 END  END
         }          }
     }      }
Line 646  sub selectbox { Line 681  sub selectbox {
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub advancedsearch {  sub advancedsearch {
     my ($r,$envhash)=@_;      my ($r,$envhash,$hidden)=@_;
     my %ENV=%{$envhash};      my %ENV=%{$envhash};
     my $fillflag=0;      my $fillflag=0;
     # Clean up fields for safety      # Clean up fields for safety
Line 749  sub advancedsearch { Line 784  sub advancedsearch {
     $reply=&Apache::lonnet::metadata_query($query,      $reply=&Apache::lonnet::metadata_query($query,
    $customquery,$customshow);     $customquery,$customshow);
  }   }
  &output_results('Advanced',$r,$envhash,$customquery,$reply);   &output_results('Advanced',$r,$envhash,$customquery,$reply,$hidden);
     }      }
     elsif ($customquery) {      elsif ($customquery) {
  my $reply; # reply hash reference   my $reply; # reply hash reference
  $reply=&Apache::lonnet::metadata_query('',   $reply=&Apache::lonnet::metadata_query('',
        $customquery,$customshow);         $customquery,$customshow);
  &output_results('Advanced',$r,$envhash,$customquery,$reply);   &output_results('Advanced',$r,$envhash,$customquery,$reply,$hidden);
     }      }
     # should not get to this point      # should not get to this point
     return 'Error.  Should not have gone to this point.';      return 'Error.  Should not have gone to this point.';
Line 773  sub advancedsearch { Line 808  sub advancedsearch {
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub basicsearch {  sub basicsearch {
     my ($r,$envhash)=@_;      my ($r,$envhash,$hidden)=@_;
     my %ENV=%{$envhash};      my %ENV=%{$envhash};
     # Clean up fields for safety      # Clean up fields for safety
     for my $field ('basicexp') {      for my $field ('basicexp') {
Line 795  sub basicsearch { Line 830  sub basicsearch {
     # Build SQL query string based on form page      # Build SQL query string based on form page
     my $query='';      my $query='';
     my $concatarg=join(',"    ",',      my $concatarg=join(',"    ",',
        ('title', 'author', 'subject', 'notes', 'abstract'));         ('title', 'author', 'subject', 'notes', 'abstract',
                           'keywords'));
     $concatarg='title' if $ENV{'form.titleonly'};      $concatarg='title' if $ENV{'form.titleonly'};
   
     $query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'});      $query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'});
Line 805  sub basicsearch { Line 841  sub basicsearch {
   
     # Output search results      # Output search results
   
     &output_results('Basic',$r,$envhash,$query,$reply);      &output_results('Basic',$r,$envhash,$query,$reply,$hidden);
   
     return OK;      return OK;
 }  }
Line 988  contacted, etc.) Line 1024  contacted, etc.)
 ######################################################################  ######################################################################
 sub output_results {  sub output_results {
     my $fnum; # search result counter      my $fnum; # search result counter
     my ($mode,$r,$envhash,$query,$replyref)=@_;      my ($mode,$r,$envhash,$query,$replyref,$hidden)=@_;
     my %ENV=%{$envhash};      my %ENV=%{$envhash};
     my %rhash=%{$replyref};      my %rhash=%{$replyref};
     my $compiledresult='';      my $compiledresult='';
     my $timeremain=300;      my $timeremain=300; # (seconds)
     my $elapsetime=0;      my $elapsetime=0;
     my $resultflag=0;      my $resultflag=0;
     my $tflag=1;      my $tflag=1;
       #
     # make query information persistent to allow for subsequent revision      # make query information persistent to allow for subsequent revision
     my $persistent=&make_persistent();      my $persistent=&make_persistent();
       # spit out the generic header
     # output beginning of search page      $r->print(&search_results_header());
  $r->print(<<BEGINNING);  
 <html>  
 <head>  
 <title>The LearningOnline Network with CAPA</title>  
 BEGINNING  
   
     # conditional output of script functions dependent on the mode in  
     # which the search was invoked  
     if ($ENV{'form.catalogmode'} eq 'interactive'){  
  if (! exists($ENV{'form.mode'}) || $ENV{'form.mode'} ne 'edit') {  
             $r->print(<<SCRIPT)   
 <script type="text/javascript">  
     function select_data(title,url) {  
  changeTitle(title);  
  changeURL(url);  
  self.close();  
     }  
     function changeTitle(val) {  
  if (opener.inf.document.forms.resinfo.elements.t) {  
     opener.inf.document.forms.resinfo.elements.t.value=val;  
  }  
     }  
     function changeURL(val) {  
  if (opener.inf.document.forms.resinfo.elements.u) {  
     opener.inf.document.forms.resinfo.elements.u.value=val;  
  }  
     }  
 </script>  
 SCRIPT  
         } elsif ($ENV{'form.mode'} eq 'edit') {  
             my $form = $ENV{'form.form'};  
             my $element = $ENV{'form.element'};  
             $r->print(<<SCRIPT)   
 <script type="text/javascript">  
 function select_data(title,url) {  
     changeURL(url);  
     self.close();  
 }  
 function changeTitle(val) {  
 }  
 function changeURL(val) {  
     if (window.opener.document) {  
         window.opener.document.forms["$form"].elements["$element"].value=val;  
     } else {  
  var url = 'forms[\"$form\"].elements[\"$element\"].value';  
         alert("Unable to transfer data to "+url);  
     }  
 }  
 </script>  
 SCRIPT  
         }  
     }  
     $r->print(<<SCRIPT) if $ENV{'form.catalogmode'} eq 'groupsearch';  
 <script type="text/javascript">  
     function select_data(title,url) {  
 // alert('DEBUG: Should be storing '+title+' and '+url);  
     }  
     function queue(val) {  
  if (eval("document.forms.results.returnvalues["+val+"].checked")) {  
     document.forms.results.acts.value+='1a'+val+'b';  
  }  
  else {  
     document.forms.results.acts.value+='0a'+val+'b';  
  }  
     }  
     function select_group() {  
  window.location=  
     "/adm/groupsort?mode=$ENV{'form.mode'}&catalogmode=groupsearch&acts="+  
     document.forms.results.acts.value;  
     }  
 </script>  
 SCRIPT  
     $r->print(<<SCRIPT);  
 <script type="text/javascript">  
     function displayinfo(val) {  
  popwin.document.forms.popremain.sdetails.value=val;  
     }  
     function openhelp(val) {  
  openhelpwin=open('/adm/help/searchcat.html','helpscreen',  
      'scrollbars=1,width=400,height=300');  
  openhelpwin.focus();  
     }  
     function abortsearch(val) {  
  popwin.close();  
     }  
 </script>  
 SCRIPT  
     $r->rflush();      $r->rflush();
   
     # begin showing the cataloged results      # begin showing the cataloged results
     $r->print(<<CATALOGBEGIN);      $r->print(<<CATALOGBEGIN);
 </head>  </head>
Line 1109  $persistent Line 1057  $persistent
 <hr />  <hr />
 <h3>Search Query</h3>  <h3>Search Query</h3>
 CATALOGCONTROLS  CATALOGCONTROLS
       #
       # Remind them what they searched for
       #
     if ($mode eq 'Basic') {      if ($mode eq 'Basic') {
  $r->print(<<RESULTS);   $r->print('<p><b>Basic search:</b> '.$ENV{'form.basicexp'}.'</p>');
 <p>      } elsif ($mode eq 'Advanced') {
 <b>Basic search:</b> $ENV{'form.basicexp'}   $r->print('<p><b>Advanced search</b> '.$query.'</p>');
 </p>  
 RESULTS  
     }  
     elsif ($mode eq 'Advanced') {  
  $r->print(<<RESULTS);  
 <p>  
 <b>Advanced search</b>  
 $query  
 </p>  
 RESULTS  
     }      }
     $r->print('<h3>Search Results</h3>');      $r->print('<h3>Search Results</h3>');
     $r->rflush();      $r->rflush();
     my $servernum=(keys %rhash)+0;      #
       # make the pop-up window for status
     # define server grid (shows status of multiple machines)      #
     my $hcinit;      $r->print(&make_popwin(%rhash));
     my $grid="'<br />'+";  
     $grid.="\n";  
     my $sn=1;  
     for my $sk (sort keys %rhash) {  
  # '<a href="  
  $grid.="'<a href=\"";  
  # javascript:displayinfo('+  
  $grid.="javascript:opener.displayinfo('+";  
  # "'"+'key  
  $grid.="\"'\"+'";  
  $grid.=$sk;  
  my $hc;  
  if ($rhash{$sk} eq 'con_lost') {  
     $hc="BAD CONNECTION, CONTACT SYSTEM ADMINISTRATOR ";  
  }  
  else {  
     $hc="'+\"'\"+\"+hc['$sk']+\"+\"'\"+'";  
     $hcinit.="hc[\"$sk\"]=\"not yet connected...\";";  
  }  
  $grid.=" hitcount=".$hc;  
  $grid.=" domain=".$hostdomains{$sk};  
  $grid.=" IP=".$hostips{$sk};  
  # '+"'"+'">'+  
  $grid.="'+\"'\"+')\">'+";  
  $grid.="\n";  
  $grid.="'<img border=\"0\" name=\"img".$sn."\"".  
     " src=\"/adm/lonIcons/srvnull.gif\" alt=\"".$sk."\" /></a>'+\n";  
  $grid.="'<br />'+\n" unless $sn%10;  
         $sn++;  
     }  
     $r->print(<<ENDPOP);  
 <script type="text/javascript">  
     popwin=open('','popwin','scrollbars=1,width=400,height=220');  
     popwin.focus();  
     popwin.document.writeln('<'+'html>');  
     popwin.document.writeln('<'+'head>');  
     popwin.document.writeln('<'+'script>');  
     popwin.document.writeln('hc=new Array();$hcinit');  
     popwin.document.writeln('<'+'/script>');  
     popwin.document.writeln('<'+'/head>'+  
         '<'+'body bgcolor="#FFFFFF">'+  
  '<'+'image name="whirly" align="right" src="/adm/lonIcons/'+  
  'lonanim.gif" '+  
  'alt="animated logo" />'+  
  '<'+'h3>Search Results Progress<'+'/h3>'+  
         '<'+'form name="popremain">'+  
         '<'+'tt>'+  
  '<'+'br clear="all"/><i>PLEASE BE PATIENT</i>'+  
  '<'+'br />SCANNING $servernum SERVERS'+  
  '<'+'br clear="all" />Number of record hits found '+  
  '<'+'input type="text" size="10" name="numhits"'+  
  ' value="0" />'+  
  '<'+'br clear="all" />Time elapsed '+  
  '<'+'input type="text" size="10" name="elapsetime"'+  
  ' value="0" />'+  
  '<'+'br />'+  
  'SERVER GRID (click on any cell for details)'+  
         $grid  
         '<'+'br />'+  
  'Server details '+  
  '<'+'input type="text" size="35" name="sdetails"'+  
  ' value="" />'+  
  '<'+'br />'+  
  ' <'+'input type="button" name="button"'+  
  ' value="close this window" '+  
  ' onClick="javascript:opener.abortsearch()" />'+  
  ' <'+'input type="button" name="button"'+  
  ' value="help" onClick="javascript:opener.openhelp()" />'+  
  '<'+'/tt>'+  
         '<'+'/form>'+  
         '<'+'/body><'+'/html>');  
     popwin.document.close();  
 </script>  
 ENDPOP  
     $r->rflush();      $r->rflush();
       ##
       ## Prepare for the main loop below
       ##
     my $servercount=0;      my $servercount=0;
     my $hitcountsum=0;      my $hitcountsum=0;
     my $bloop=$servernum;      my $servernum=(keys %rhash);
     my %orkey;      my $serversleft=$servernum;
   BLOOP: while(1) {      ##
       my $sn=0;      ## Run until we run out of time or we run out of servers
       last BLOOP unless $bloop;      ##
       last BLOOP unless $timeremain;      while($serversleft && $timeremain) {
     RLOOP: foreach my $rkey (sort keys %rhash) {        ##
  $sn++;        ## %rhash has servers deleted from it as results come in 
  next RLOOP if $orkey{$rkey};        ## (within the foreach loop below).
         ##
         foreach my $rkey (sort keys %rhash) {
  $servercount++;   $servercount++;
  $tflag=1;   $tflag=1;
  $compiledresult='';   $compiledresult='';
  my $hostname=$rkey;   my $hostname=$rkey;
  my $reply=$rhash{$rkey};   my $reply=$rhash{$rkey};
  my @results;   my @results;
   
  my $replyfile='';  
   
  if ($reply eq 'con_lost') {   if ($reply eq 'con_lost') {
     &popwin_imgupdate($r,$sn,"srvbad.gif");      &popwin_imgupdate($r,$rkey,"srvbad.gif");
     $bloop--;      $serversleft--;
     $orkey{$rkey}=1;              delete $rhash{$rkey};
  }   } else {
  else {              # must do since 'use strict' checks for tainting
     $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting      $reply=~/^([\.\w]+)$/; 
     $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1;      my $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1;
     $reply=~/(.*?)\_/;      $reply=~/(.*?)\_/;
     {      {
  my $temp=0;   my $temp=0;
       WLOOP: while (1) {        WLOOP: while (1) {
   if (-e $replyfile && $tflag) {    if (-e $replyfile && $tflag) {
       &popwin_imgupdate($r,$sn,"srvhalf.gif");        &popwin_imgupdate($r,$rkey,"srvhalf.gif");
       &popwin_js($r,'popwin.hc["'.$rkey.'"]='.        &popwin_js($r,'popwin.hc["'.$rkey.'"]='.
  '"still transferring..."'.';');   '"still transferring..."'.';');
       $tflag=0;        $tflag=0;
   }    }
   if (-e "$replyfile.end") {    if (-e "$replyfile.end") {
       $bloop--;        $serversleft--;
       $orkey{$rkey}=1;                        delete $rhash{$rkey};
       if (-s $replyfile) {        if (-s $replyfile) {
   &popwin_imgupdate($r,$sn,"srvgood.gif");    &popwin_imgupdate($r,$rkey,"srvgood.gif");
   my $fh=Apache::File->new($replyfile) or     my $fh=Apache::File->new($replyfile) or 
       ($r->print('ERROR: file '.        ($r->print('ERROR: file '.
  $replyfile.' cannot be opened') and   $replyfile.' cannot be opened') and
Line 1262  ENDPOP Line 1130  ENDPOP
     'numhits.value='.$hitcountsum.';');      'numhits.value='.$hitcountsum.';');
       }        }
       else {        else {
   &popwin_imgupdate($r,$sn,"srvempty.gif");    &popwin_imgupdate($r,$rkey,"srvempty.gif");
   &popwin_js($r,'popwin.hc["'.$rkey.'"]=0;');    &popwin_js($r,'popwin.hc["'.$rkey.'"]=0;');
       }        }
       last WLOOP;        last WLOOP;
   }    } # end of if ( -e "$replyfile.end")
   if ($temp>1) {  
       sleep 1;  
       $timeremain--;  
       $elapsetime++;  
       last WLOOP;  
   }  
   last WLOOP unless $timeremain;    last WLOOP unless $timeremain;
   sleep 1;    sleep 1;    # wait for daemons to write files?
   $timeremain--;    $timeremain--;
   $elapsetime++;    $elapsetime++;
     last WLOOP if ($temp>1);
   &popwin_js($r,"popwin.document.popremain.".    &popwin_js($r,"popwin.document.popremain.".
        "elapsetime.value=$elapsetime;");         "elapsetime.value=$elapsetime;");
   $temp++;    $temp++;
Line 1284  ENDPOP Line 1147  ENDPOP
     }      }
     &popwin_js($r,'popwin.document.whirly.'.      &popwin_js($r,'popwin.document.whirly.'.
        'src="/adm/lonIcons/lonanimend.gif";');         'src="/adm/lonIcons/lonanimend.gif";');
  }   } # end of if ($reply eq 'con_lost') else statement
  my $customshow='';   my $customshow='';
  my $extrashow='';   my $extrashow='';
  my @customfields;   my @customfields;
Line 1326  ENDPOP Line 1189  ENDPOP
  my ($title,$author,$subject,$url,$keywords,$version,   my ($title,$author,$subject,$url,$keywords,$version,
     $notes,$abstract,$mime,$lang,      $notes,$abstract,$mime,$lang,
     $creationdate,$lastrevisiondate,$owner,$copyright)=@fields;      $creationdate,$lastrevisiondate,$owner,$copyright)=@fields;
                   unless ($title =~ /^\s*$/ ) { $title='<i>Untitled</i>'; }
                 unless ($title) { $title='<i>Untitled</i>'; }  
  unless ($ENV{'user.adv'}) {   unless ($ENV{'user.adv'}) {
     $keywords='<i>- not displayed -</i>';      $keywords='<i>- not displayed -</i>';
     $fields[4]=$keywords;      $fields[4]=$keywords;
Line 1448  RESULTS Line 1310  RESULTS
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
   
   =pod
   
   =item &search_results_header
   
   =cut
   
   ######################################################################
   ######################################################################
   sub search_results_header {
       my $result = '';
       # output beginning of search page
       $result.=<<BEGINNING;
   <html>
   <head>
   <title>The LearningOnline Network with CAPA</title>
   BEGINNING
       # conditional output of script functions dependent on the mode in
       # which the search was invoked
       if ($ENV{'form.catalogmode'} eq 'interactive'){
    if (! exists($ENV{'form.mode'}) || $ENV{'form.mode'} ne 'edit') {
               $result.=<<SCRIPT;
   <script type="text/javascript">
       function select_data(title,url) {
    changeTitle(title);
    changeURL(url);
    self.close();
       }
       function changeTitle(val) {
    if (opener.inf.document.forms.resinfo.elements.t) {
       opener.inf.document.forms.resinfo.elements.t.value=val;
    }
       }
       function changeURL(val) {
    if (opener.inf.document.forms.resinfo.elements.u) {
       opener.inf.document.forms.resinfo.elements.u.value=val;
    }
       }
   </script>
   SCRIPT
           } elsif ($ENV{'form.mode'} eq 'edit') {
               my $form = $ENV{'form.form'};
               my $element = $ENV{'form.element'};
               $result.=<<SCRIPT;
   <script type="text/javascript">
   function select_data(title,url) {
       changeURL(url);
       self.close();
   }
   function changeTitle(val) {
   }
   function changeURL(val) {
       if (window.opener.document) {
           window.opener.document.forms["$form"].elements["$element"].value=val;
       } else {
    var url = 'forms[\"$form\"].elements[\"$element\"].value';
           alert("Unable to transfer data to "+url);
       }
   }
   </script>
   SCRIPT
           }
       }
       $result.=<<SCRIPT if $ENV{'form.catalogmode'} eq 'groupsearch';
   <script type="text/javascript">
       function select_data(title,url) {
   // alert('DEBUG: Should be storing '+title+' and '+url);
       }
       function queue(val) {
    if (eval("document.forms.results.returnvalues["+val+"].checked")) {
       document.forms.results.acts.value+='1a'+val+'b';
    }
    else {
       document.forms.results.acts.value+='0a'+val+'b';
    }
       }
       function select_group() {
    window.location=
       "/adm/groupsort?mode=$ENV{'form.mode'}&catalogmode=groupsearch&acts="+
       document.forms.results.acts.value;
       }
   </script>
   SCRIPT
       $result.=<<SCRIPT;
   <script type="text/javascript">
       function displayinfo(val) {
    popwin.document.forms.popremain.sdetails.value=val;
       }
       function openhelp(val) {
    openhelpwin=open('/adm/help/searchcat.html','helpscreen',
        'scrollbars=1,width=400,height=300');
    openhelpwin.focus();
       }
       function abortsearch(val) {
    popwin.close();
       }
   </script>
   SCRIPT
       return $result;
   }
   
   ######################################################################
   ######################################################################
   
   =pod
   
   =item &make_popwin()
   
   Returns html with javascript in it to open up the status window.
   
   =cut
   
   ######################################################################
   ######################################################################
   sub make_popwin {
       my %rhash = @_;
       my $servernum=(keys %rhash);
       my $hcinit;
       my $grid="'<br />'+\n";
       # $sn is the server number, used ONLY to make sure we have
       # rows of 10 each.  No longer used to index images.
       my $sn=1;
       foreach my $sk (sort keys %rhash) {
    # '<a href="
    $grid.="'<a href=\"";
    # javascript:displayinfo('+
    $grid.="javascript:opener.displayinfo('+";
    # "'"+'key
    $grid.="\"'\"+'";
    $grid.=$sk;
    my $hc;
    if ($rhash{$sk} eq 'con_lost') {
       $hc="BAD CONNECTION, CONTACT SYSTEM ADMINISTRATOR ";
    }
    else {
       $hc="'+\"'\"+\"+hc['$sk']+\"+\"'\"+'";
       $hcinit.="hc[\"$sk\"]=\"not yet connected...\";";
    }
    $grid.=" hitcount=".$hc;
    $grid.=" domain=".$hostdomains{$sk};
    $grid.=" IP=".$hostips{$sk};
    # '+"'"+'">'+
    $grid.="'+\"'\"+')\">'+";
    $grid.="\n";
    $grid.="'<img border=\"0\" name=\"img_".$hostdomains{$sk}.'_'.$sk."\"".
       " src=\"/adm/lonIcons/srvnull.gif\" alt=\"".$sk."\" /></a>'+\n";
    $grid.="'<br />'+\n" unless $sn%10;
           $sn++;
       }
       my $result.=<<ENDPOP;
   <script type="text/javascript">
       popwin=open('','popwin','scrollbars=1,width=400,height=220');
       popwin.focus();
       popwin.document.writeln('<'+'html>');
       popwin.document.writeln('<'+'head>');
       popwin.document.writeln('<'+'script>');
       popwin.document.writeln('hc=new Array();$hcinit');
       popwin.document.writeln('<'+'/script>');
       popwin.document.writeln('<'+'/head>'+
           '<'+'body bgcolor="#FFFFFF">'+
    '<'+'image name="whirly" align="right" src="/adm/lonIcons/'+
    'lonanim.gif" '+
    'alt="animated logo" />'+
    '<'+'h3>Search Results Progress<'+'/h3>'+
           '<'+'form name="popremain">'+
           '<'+'tt>'+
    '<'+'br clear="all"/><i>PLEASE BE PATIENT</i>'+
    '<'+'br />SCANNING $servernum SERVERS'+
    '<'+'br clear="all" />Number of record hits found '+
    '<'+'input type="text" size="10" name="numhits"'+
    ' value="0" />'+
    '<'+'br clear="all" />Time elapsed '+
    '<'+'input type="text" size="10" name="elapsetime"'+
    ' value="0" />'+
    '<'+'br />'+
    'SERVER GRID (click on any cell for details)'+
           $grid
           '<'+'br />'+
    'Server details '+
    '<'+'input type="text" size="35" name="sdetails"'+
    ' value="" />'+
    '<'+'br />'+
    ' <'+'input type="button" name="button"'+
    ' value="close this window" '+
    ' onClick="javascript:opener.abortsearch()" />'+
    ' <'+'input type="button" name="button"'+
    ' value="help" onClick="javascript:opener.openhelp()" />'+
    '<'+'/tt>'+
           '<'+'/form>'+
           '<'+'/body><'+'/html>');
       popwin.document.close();
   </script>
   ENDPOP
       return $result;
   }
   
   ######################################################################
   ######################################################################
   
 =pod   =pod 
   
 =item Metadata Viewing Functions  =item Metadata Viewing Functions
Line 1791  END Line 1851  END
   
 =item &popwin_imgupdate()  =item &popwin_imgupdate()
   
   Send a given image (and its location) out to the browser.  Takes as 
   input $r, loncapa server id, and an icon URL.
   
 =cut  =cut
   
 ######################################################################  ######################################################################
 ######################################################################  ######################################################################
 sub popwin_imgupdate {  sub popwin_imgupdate {
     my ($r,$imgnum,$icon) = @_;      my ($r,$server,$icon) = @_;
     &popwin_js($r,'popwin.document.img'.$imgnum.'.'.      &popwin_js($r,'popwin.document.img_'.$hostdomains{$server}.'_'.$server.'.'.
        'src="/adm/lonIcons/'.$icon.'";');         'src="/adm/lonIcons/'.$icon.'";');
 }      }    
   

Removed from v.1.123  
changed lines
  Added in v.1.125


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