var currentCollection = 0;
var maxHits = 25;
var lastQuery = "";
var showHighlighted = false;
var showNavTags = false;
var resultLayout = "full";
var formLayout = "simple";
var docOpenMethod = "chloc";

var debug = false;

var collectionCount = 1;

var collectionNames = new Array(1);

  collectionNames[0] = "All Documentation";

var maxHitsValues = new Array(4);
maxHitsValues[0] = 25;
maxHitsValues[1] = 50;
maxHitsValues[2] = 75;
maxHitsValues[3] = 100;

// Tags used to mark highlighted terms
var hlTagBefore = "<b style=\"background-color: #ffff66; color: black\">";
var hlTagAfter = "</b>";
// Tags that represent buttons: "previous term", "next-term"
var buttonPreviousAnchor = "<font size=1>&lt;</font>";
var buttonNextAnchor = "<font size=1>&gt;</font>";
// Open tag for navigation link (anchor ID is inserted between the start and end tag)
var navOpenTagStart = "<a href=\"javascript:parent.jumpToHLAnchor( ";
var navOpenTagEnd = ", parent.qaview );\">";
//var navOpenTagStart = "<a href=\"javascript:window.location.hash='qa_anchor_";
//var navOpenTagEnd = "'\">";
// Close tag for navigation link
var navCloseTag = "</a>";

var lastHighlightedDocIndex = -1;
var currentAnchor = "qa_anchor_1";
var lastHighlightedDoc = "";

var resultsWindow = null;

var qaframeLoaded = false;

var hlWindow = null;
var hlHitLocation = null;
var hlDocBase = "."; // base of a document being highlighted


function performSearch( win, qform, qagent )
{
  if( qagent == null )
    alert( "Search applet is undefined." );
    
  _collectQueryOptions( qform );
  
  if( debug ) 
    alert( "Load collection: " + currentCollection );
  qagent.loadCollection( currentCollection );

  if( debug ) 
    alert( "Set max hits: " + maxHits );
  qagent.setMaxHits( maxHits );
  
  if( debug ) 
    alert( "Query: " + lastQuery );

  if( debug ) 
    alert( "Starting search..." );

  lastHighlightedDocIndex = -1;
  currentAnchor = "qa_anchor_1";
  lastHighlightedDoc = "";

  resultsWindow = win;
  
  var hitCount = qagent.search( lastQuery );
  if( hitCount == -2 )
  {
    // do nothing - callback from Java will be used
  }
  else
  {
    parent.resultsWindow.location.replace( "appletreload.html" );
  }
  
}


function _collectQueryOptions( qform )
{
  currentCollection = _getCollection( qform );
  lastQuery = _getQuery( qform );
  maxHits = _getMaxHits( qform );
  resultLayout = _getResultLayout( qform );
  showHighlighted = _getShowHighlighted( qform );
  showNavTags = _getUseNavigation( qform );
}


function _getCollection( qform )
{
  if( qform.collection != null )
  {
    var i = qform.collection.selectedIndex;
    return i;
  }
  return currentCollection;
}


function _getQuery( qform )
{
  return qform.query.value;
}


function _getMaxHits( qform )
{
  var maxh = maxHits;
  if( qform.maxhits != null )  
  {
    var mh = qform.maxhits.options[ qform.maxhits.selectedIndex ].value;
    maxh = eval( mh );
  }
  return maxh;
}

function _getResultLayout( qform )
{
  var l = resultLayout;
  if( qform.resultLayout != null )  
  {
    l = qform.resultLayout.options[ qform.resultLayout.selectedIndex ].value;
  }
  return l;
}

function _getShowHighlighted( qform )
{
  var hl = showHighlighted;
  if( qform.showHighlighted != null )  
  {
    if( qform.showHighlighted.checked )
      hl = true;
    else
      hl = false;
  }
  return hl;
}


function _getUseNavigation( qform )
{
  var navig = showNavTags;
  if( qform.useNavigationButtons != null )  
  {
    if( qform.useNavigationButtons.checked )
      navig = true;
    else
      navig = false;
  }
  return navig;
}


function _printSearchResults( doc, qagent )
{
  if( debug ) 
    alert( "In printSearchResults()" );

  if( !qagent.hasCachedResults() )
  {
    // page was reloaded; return to the main page...
    window.open( "searchtips.html", "qaview" );
    return;
  }

  var msgCount = qagent.getSearchMessagesCount();
  var errCount = qagent.getSearchErrorsCount();
  if( msgCount > 0 || errCount > 0 )
  {
    doc.writeln( "<ul>" );
    for( var i = 0; i < errCount; i++ )
      doc.writeln( "<li><b>" + qagent.getSearchError( i ) + "</b>" );
    for( var i = 0; i < msgCount; i++ )
      doc.writeln( "<li>" + qagent.getSearchMessage( i ) );
    doc.writeln( "</ul>" );
    doc.writeln( "<br>" );
  }
  
  var res = qagent.getHitCount();
  var resTotal = qagent.getEstimatedTotalHitCount();

  if( res == 0 )  
  {
    doc.writeln( "<b>Nothing found.</b>" );
    doc.writeln( "<b>Refine your query and try again.</b>" );
  }
  else
  {
    doc.write( "<b>Pages found: ", res );
    if( res != resTotal )
      doc.write( "&nbsp;&nbsp;(estimated total ", resTotal, ")" );
    doc.writeln( "</b>" );

    doc.writeln( "<ol>" );

    // print results
    var i = 0;
    while( res > 0 )
    {
      doc.write( "<li>" );
    
      _printHit( doc, qagent, i );

      doc.writeln( "</li><p>" );

      i++;
      res--;
    }

    doc.writeln( "</ol>" );
  }
}


function _openResultsPage( doc )
{
  doc.open();
  doc.writeln( "<html>" );
  doc.writeln( "  <meta>" );
  doc.writeln( "    <link rel=\"stylesheet\" type=\"text/css\" href=\"search/search.css\" title=\"Style\">" );
  doc.writeln( "  </meta>" );
  doc.writeln( "<body>" );
}


function _closeResultsPage( doc )
{
  doc.write( "<p>&nbsp;</p><p><font size=-1>" );
  // REMOVAL OR MODIFICATION OF THE MESSAGE BELLOW IS IN VIOLATION OF THE LICENSE AGREEMENT - DO NOT TOUCH!
  doc.write( "<i>Search technology by JObjects International (<a href='http://www.jobjects.com' target='_blank'>http://www.jobjects.com</a>)</i>" );
  doc.writeln( "</font>" );

  doc.writeln( "</body></html>" );
  doc.close();
}


// print hit (long format)
function _printHit( doc, qagent, hitIndex )
{
  var loc = qagent.getHitLocation( hitIndex );
  
  var title = qagent.getHitTitle( hitIndex );
  if( title == null )
    title = loc;
  title = "" + title;
  if( title.length == 0 )
    title = loc;

  // create link to file
  doc.writeln( "<b><a href=\"javascript:parent.showDocument( ", hitIndex, ", parent.qaview.document.searchForm, parent.qaview, parent.qawin.document.QuestAgent );\">", title, "</a></b>" );

  doc.writeln( "<br>" );
  
  // print description if available
  var desc = qagent.getHitField( hitIndex, "description" );
  if( desc != null )  {
    var jsdesc = "" + desc;
    if( jsdesc.length > 0 && resultLayout == "full" )
      doc.writeln( jsdesc, "<br>" );
  }

  doc.writeln( "<font color=\"#808080\"> <b>URL:</b> ", loc, "</font>" );

  var len = Math.round( eval( "" + qagent.getHitField( hitIndex, "length" ) ) / 1024 );
  if( len == 0 )
    len = 1;
  doc.writeln( "<font color=\"#808080\"> - <b>Size:</b> ", len, "K bytes </font>" );

  doc.writeln( " <font color=\"#808080\"> - <b>Score:</b> ",
      qagent.getHitRelevance( hitIndex ), "</font>" );
}


function _printCollectionChoice( doc )
{
  doc.writeln( "<select name=collection>" );

  for( i = 0; i < collectionNames.length; ++i )
  {
    doc.write( "<option value=", i );
    if( currentCollection == i )
      doc.write( " selected " );
    doc.writeln( ">" + collectionNames[i] );
  }

  doc.writeln( "</select>" );
}


function _printMaxHitsChoice( doc )
{
  doc.writeln( "<select name=maxhits>" );

  for( i = 0; i < maxHitsValues.length; ++i )
  {
    doc.write( "<option value=", maxHitsValues[i] );
    if( maxHits == maxHitsValues[i] )
      doc.write( " selected " );
    doc.writeln( ">" + maxHitsValues[i] );
  }

  doc.writeln( "</select>" );
}


function _printSimpleSearchForm( doc, qagent )
{
  if( debug )
    alert( "In printSimpleSearchForm()" );

  doc.write( "<FORM name=\"searchForm\"" );
  doc.writeln( " onSubmit=\"parent.performSearch( parent.qaview, this, parent.qawin.document.QuestAgent ); return false;\">" );
  
  if( collectionCount > 1 )
  {
    doc.writeln( "Search in: " );
    _printCollectionChoice( doc );
  }
  
  var q = "" + parent.lastQuery;
  if( q.length > 0 )
    q = qagent.replace( parent.lastQuery, "\"", "&quot;" );
  
  doc.writeln( "  Find: <INPUT TYPE=TEXT NAME=query VALUE=\"", q, "\" SIZE=20>" );
  doc.writeln( "  <INPUT TYPE=BUTTON VALUE=\"Go\" onClick=\"parent.performSearch( parent.qaview, this.form, parent.qawin.document.QuestAgent )\">" );

  if( formLayout == "quick" )
  {
    doc.write( "<br><a href=\"javascript:parent.changeFormLayout( 'full', parent.qaview );\">" );
    doc.write( "Show full search form</a>" );
    doc.write( "  | <a href=\"javascript:parent.showTips( parent.qaview );\">Show search tips</a>" );
  }

  doc.writeln( "</FORM>" );
}


function _printFullSearchForm( doc, qagent )
{
  if( debug )
    alert( "In printFullSearchForm()" );

  doc.writeln( "<left>" );
  doc.writeln( "<form onSubmit=\"parent.performSearch( parent.qaview, parent.qawin.document.searchForm, parent.qawin.document.QuestAgent ); return false;\" name=\"searchForm\">" );
//  doc.writeln( "<form onSubmit=\"parent.performSearch( parent.qaview.document, parent.qawin.document.searchForm, parent.qawin.document.QuestAgent ); return false;\" name=\"searchForm\">" );
//  doc.writeln( "<form onSubmit=\"parent.performSearch( parent.qaview.document, this, parent.qawin.document.QuestAgent ); return false;\" name=\"searchForm\">" );

// ADV Search Box
  doc.writeln( " <table border=\"0\" align=\"center\">" );
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td colspan=\"2\" align=\"center\">" );
  doc.writeln( "    <h2>Advanced Search Options</h2>" );
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );

  if( collectionCount == 1 )
  {
    doc.writeln( "<!--" );
  }

// LOOK IN Collection
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\"><b>Look in...</b>" );
  doc.writeln( "   </td>" );
  doc.writeln( "   <td valign=\"top\">" );

  _printCollectionChoice( doc );

  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );

  if( collectionCount == 1 )
  {
    doc.writeln( "-->" );
  }

  var q = "" + parent.lastQuery;
  if( q.length > 0 )
    q = qagent.replace( parent.lastQuery, "\"", "&quot;" );
  
// SEARCH FOR Options
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td colspan=\"2\"><b>Search for...</b>" );  
  doc.writeln( "   </td>" );  
  doc.writeln( "  </tr>" );  
// Exact Phrase
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\">&nbsp;&nbsp;&nbsp;<b>exact phrase</b>" );
  doc.writeln( "   </td>" );
  doc.writeln( "   <td valign=\"top\">" );
  doc.writeln( "    <input type=\"text\" name=\"eq\" size=\"25\" value=\"", q, "\">" );
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );
// All of the Words  
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\">&nbsp;&nbsp;&nbsp;<b>all</b> of the words" );
  doc.writeln( "   </td>" );
  doc.writeln( "   <td valign=\"top\">" );
  doc.writeln( "    <input type=\"text\" name=\"aq\" size=\"25\" value=\"", q, "\">" );
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );
// One of the Words    
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\">&nbsp;&nbsp;&nbsp;<b>one</b> of the words" );
  doc.writeln( "   <td valign=\"top\">" );
  doc.writeln( "    <input type=\"text\" name=\"oq\" size=\"25\" value=\"", q, "\">" );
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );
// Without the words  
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\">&nbsp;&nbsp;&nbsp;<b>without</b> the word(s)" );
  doc.writeln( "   <td valign=\"top\">" );
  doc.writeln( "    <input type=\"text\" name=\"ntq\" size=\"25\" value=\"", q, "\">" );
  doc.writeln( "   </td>" );
  doc.writeln( "   </tr>" );
// Near the words  
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\">&nbsp;&nbsp;&nbsp;<b>near</b> the word(s)" );
  doc.writeln( "   <td valign=\"top\">" );
  doc.writeln( "    <input type=\"text\" name=\"nrq\" size=\"25\" value=\"", q, "\">" );
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );
  
// NUMBER OF RESULTS
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\"><b>Number of results</b>" );
  doc.writeln( "   </td>" );
  doc.writeln( "   <td valign=\"top\">" );

  _printMaxHitsChoice( doc );

  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );
  
// RESULTS PAGE FORMAT
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td valign=\"top\"><b>Show...</b>" );
  doc.writeln( "   </td>" );
  doc.writeln( "   <td valign=\"top\">" );
  doc.writeln( "    <select name=\"resultLayout\">" );
  doc.write( "    <option value=\"full\" " );
  
  if( resultLayout == "full" )
    doc.write( " selected " );
  doc.writeln( ">Full descriptions</option>" );
  doc.write( "          <option value=\"short\" " );
  
  if( resultLayout == "short" )
    doc.write( " selected " );
  doc.writeln( ">Title only</option>" );
  doc.writeln( "    </select>" );
  
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );

// FIND BUTTON
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td>&nbsp;" );
  doc.writeln( "   </td>" );
  doc.writeln( "   <td align=\"right\">" );
  doc.writeln( "    <input type=\"button\" name=\"submit\" value=\"  Find  \"" );
  doc.writeln( "    onClick=\"parent.performSearch( parent.qaview, this.form, parent.qawin.document.QuestAgent )\" >" );
  //doc.writeln( "    onClick=\"parent.performSearch( parent.qaview.document, this.form, parent.qawin.document.QuestAgent )\" >" );
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );
  
 // Copyright Notice 
  doc.writeln( "  <tr>" );
  doc.writeln( "   <td colspan=\"2\" >" );
  doc.writeln( "    <p>&nbsp;</p>" );
  doc.writeln( "    <p><font size=\"-1\">" );
 // REMOVAL OR MODIFICATION OF THE MESSAGE BELLOW IS IN VIOLATION OF THE LICENSE AGREEMENT - DO NOT TOUCH!
  doc.writeln( "    <i>Search technology by JObjects International (<a href='http://www.jobjects.com' target='_blank'>http://www.jobjects.com</a>)</i>" );
  doc.writeln( "   </td>" );
  doc.writeln( "  </tr>" );
  doc.writeln( " </table>" );

  //doc.write( "  <font size=\"-1\">" );
  //doc.write( "<br>" );
  //doc.write( "<a href=\"javascript:parent.changeFormLayout( 'quick', parent.qaview );\">" );
  //doc.write( "Show quick search form</a>" );
  //doc.write( "  | <a href=\"javascript:parent.showTips( parent.qaview );\">Show search tips</a>" );
  //doc.writeln( "  </font>" );

  doc.writeln( "</form>" );
  doc.writeln( " </left>" );
}


function printResultsPage( doc, qagent )
{
  _openResultsPage( doc );

  if( formLayout == "full" )  {
    _printFullSearchForm( doc, qagent );
    doc.writeln( "<p>" );
  }
  else if( formLayout == "quick" )  {
    _printSimpleSearchForm( doc, qagent );
    doc.writeln( "<p>" );
  }
  else if( formLayout == "simple" )  {
    _printSimpleSearchForm( doc, qagent );
    doc.writeln( "<p>" );
  }
  else if( formLayout == "default" )  {
    _printFullSearchForm( doc, qagent );
    formLayout = "quick"; // switch to quick search form
    doc.writeln( "<p>" );
  }

  if( qagent.hasCachedResults() )
  {
    _printSearchResults( doc, qagent );
  }

  _closeResultsPage( doc );
}


function showDocument( hitIndex, qform, win, qagent )
{
  if( debug )
    alert( "In showDocument()" );

  var loc = qagent.getHitLocation( hitIndex );

  if( debug )
    alert( "Show hit " + hitIndex + ": " + loc );
    
  _collectQueryOptions( qform );
  
  var canHL = canHighlight( loc );

  if( showHighlighted && canHL )  
  {
    qagent.setHighlightingTags( hlTagBefore, hlTagAfter );
    qagent.setNavigationButtons( buttonPreviousAnchor, buttonNextAnchor );
    qagent.setNavigationLinkScheme( navOpenTagStart, navOpenTagEnd, navCloseTag );
    
    hlDocBase = qagent.getDocumentBase( loc );
    if( debug )
      alert( "Base of highlighted document: " + hlDocBase );
          
    hlWindow = win;
    hlHitLocation = loc;
    lastHighlightedDocIndex = hitIndex;
    
    if( browser.isNS )
    {
      if( debug )
        alert( "Highlight using callback" );
      // result will be delivered to callback function
      qagent.highlightDocumentCB( hitIndex, showNavTags, "OnHighlightingDone" );
      // callback required with NS 6/7 [for Unix] running from a web site
    }
    else
    {
      if( debug )
        alert( "Highlight directly (without using callback)" );
      // we don't use callbacks with IE (IE crashes on second highlighted doc)
      var page = qagent.highlightDocument( hitIndex, showNavTags );
      handleHighlightedDocument( page );
    }
  }
  else
  {
    showDocumentNoHL( loc, win );
  }
}


function handleHighlightedDocument( hlPage )
{
  if( hlPage.indexOf( "qagent_hl_msg:" ) == 0 ) // is returned content error message?
  {
    var message = hlPage.substring( 14 );
    alert( message );
    showDocumentNoHL( hlHitLocation, hlWindow );
    return;
  }
  
  lastHighlightedDoc = "<base href=\"" + hlDocBase + "\">" + hlPage;
  currentAnchor = "qa_anchor_1";
  
  showDocumentHL( hlHitLocation, hlWindow );
}


function canHighlight( loc )
{
  var loc2 = "" + loc.toLowerCase();
  var canHL = false;
  
  if( loc2.indexOf( "http:" ) == 0 )
  {
    canHL = false;
  }
  else if( ( loc2.indexOf( ".htm" ) + 4 ) == loc2.length )
  {
    canHL = true;
  }
  else if( ( loc2.indexOf( ".html" ) + 5 ) == loc2.length )
  {
    canHL = true;
  }

  if( canHL && loc2.indexOf( "../" ) != -1 )
  {
    alert( "Highlighting is not available. In order to use highlighting deploy search interface directly to the document root or to its upper-level directory." );
    canHL = false;
  }

  return canHL;
}


function changeFormLayout( layout, win )
{
  formLayout = layout;
  
  win.location.replace( 'appletreload.html' );
}


function showDocumentHL( loc, win )
{
      win.location = "applethlreload.html#" + currentAnchor;
    
  /*
  // show highlighted document
  var doc = win.document;
  doc.open();
  doc.write( "<base href=\"" + docBase + "\">" );
  doc.write( hlPage );
  doc.close();
  */
}


function showDocumentNoHL( loc, win )
{
      win.location = loc;
  }


function printLastHighlightedPage( doc )
{
  doc.open();
  doc.write( lastHighlightedDoc );
  doc.close();
}


function jumpToHLAnchor( anch, win )
{
  //win.location.replace( "#qa_anchor_" + anch );
  win.location.hash = "#qa_anchor_" + anch;
}


function showTips( win )
{
  //win.location.replace( 'searchtips.html' );
  win.location = "searchtips.html";
}


// Used by CA01H
function onShowResourceHandler( loc, hitIndex, newWin )
{
  if( debug )
    alert( "Show hit " + hitIndex + ": " + loc );

  var qagent = document.QuestAgent;
  
  var canHL = canHighlight( loc );

  if( canHL )  
  {
    qagent.setHighlightingTags( hlTagBefore, hlTagAfter );
    qagent.setNavigationButtons( buttonPreviousAnchor, buttonNextAnchor );
    qagent.setNavigationLinkScheme( navOpenTagStart, navOpenTagEnd, navCloseTag );
    
    var hlPage = "" + qagent.highlightDocument( hitIndex, showNavTags );
  
    if( hlPage.indexOf( "qagent_hl_msg:" ) == 0 ) // error message returned?
    {
      var message = hlPage.substring( 14 );
      alert( message );
      return;
    }
    
    var docBase = qagent.getDocumentBase( loc );

    if( debug )
      alert( "Base of highlighted document: " + docBase );
          
    lastHighlightedDoc = "<base href=\"" + docBase + "\">" + hlPage;
    lastHighlightedDocIndex = hitIndex;
    currentAnchor = "qa_anchor_1";
    
    var f = open( "applethlreload.html#qa_anchor_1", "_blank" );
    f.focus();
  }
  else
  {
    var f = open( loc, "_blank" );
    f.focus();
  }
  
}

function BrowserDetect() 
{
   var ua = navigator.userAgent.toLowerCase(); 

   // browser name
   this.isGecko     = (ua.indexOf('gecko') != -1 && ua.indexOf('safari') == -1);
   this.isMozilla   = (this.isGecko && ua.indexOf('gecko/') + 14 == ua.length);
   this.isNS        = ( (this.isGecko) ? (ua.indexOf('netscape') != -1) : ( (ua.indexOf('mozilla') != -1) && (ua.indexOf('spoofer') == -1) && (ua.indexOf('compatible') == -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) && (ua.indexOf('hotjava') == -1) ) );
   this.isIE        = ( (ua.indexOf('msie') != -1) && (ua.indexOf('opera') == -1) && (ua.indexOf('webtv') == -1) ); 
   this.isSafari    = (ua.indexOf('safari') != - 1);
   this.isOpera     = (ua.indexOf('opera') != -1); 
   this.isKonqueror = (ua.indexOf('konqueror') != -1 && !this.isSafari); 
   this.isIcab      = (ua.indexOf('icab') != -1); 
   this.isAol       = (ua.indexOf('aol') != -1); 
   
   // platform
   this.isWin   = (ua.indexOf('win') != -1);
   this.isWin32 = (this.isWin && ( ua.indexOf('95') != -1 || ua.indexOf('98') != -1 || ua.indexOf('nt') != -1 || ua.indexOf('win32') != -1 || ua.indexOf('32bit') != -1 || ua.indexOf('xp') != -1) );
   this.isMac   = (ua.indexOf('mac') != -1);
   this.isUnix  = (ua.indexOf('unix') != -1 || ua.indexOf('sunos') != -1 || ua.indexOf('bsd') != -1 || ua.indexOf('x11') != -1)
   this.isLinux = (ua.indexOf('linux') != -1);
}
var browser = new BrowserDetect();

