// Copyright (c) 2000-2001 Quadralay Corporation.  All rights reserved.
//

function  WWHHighlightWords_Object()
{
  this.mWords = null;

  this.fSetWordList = WWHHighlightWords_SetWordList;
  this.fExec        = WWHHighlightWords_Exec;
}

function  WWHHighlightWords_SetWordList(ParamWords)
{
  if (WWHFrame.WWHHelp.mSettings.mbHighlightingEnabled)
  {
    this.mWords = ParamWords;
  }
  else
  {
    this.mWords = null;
  }
}

function  WWHHighlightWords_Exec()
{
  if (this.mWords != null)
  {
    // Only works under IE on Windows
    //
    if ((WWHFrame.WWHBrowserInfo.mBrowser == 2) &&  // Shorthand for IE
        (WWHFrame.WWHBrowserInfo.mPlatform == 1))   // Shorthand for Windows
    {
      var  WordList;
      var  MaxIndex;
      var  Index;
      var  WordExpressions;
      var  LongestWordExpression;
      var  MaxExpressionIndex;
      var  ExpressionIndex;
      var  ExpressionHash = new WWHHighlightWords_ExpressionHash_Object();
      var  ExpressionEntry;
      var  Expression;
      var  NewHighlightedWords = null;
      var  HighlightedWords = new WWHHighlightWords_HighlightedWords_Object();
      var  TextRange;
      var  bMatchFound;
      var  bFirstMatch = true;


      // Access search words
      //
      WordList = this.mWords.split(" ");
      for (MaxIndex = WordList.length, Index = 0 ; Index < MaxIndex ; Index++)
      {
        if (WordList[Index].length > 0)
        {
          // Determine longest sub-expression between '*'
          //
          WordExpressions = WordList[Index].split("*");
          LongestWordExpression = "";
          for (MaxExpressionIndex = WordExpressions.length, ExpressionIndex = 0 ; ExpressionIndex < MaxExpressionIndex ; ExpressionIndex++)
          {
            if (WordExpressions[ExpressionIndex].length > LongestWordExpression.length)
            {
              LongestWordExpression = WordExpressions[ExpressionIndex];
            }
          }

          // Store search expression keyed by longest sub-expression
          //
          ExpressionEntry = ExpressionHash[LongestWordExpression];
          if (typeof ExpressionEntry == "undefined")
          {
            ExpressionEntry = new WWHHighlightWords_ExpressionEntry_Object();
            ExpressionHash[LongestWordExpression] = ExpressionEntry;
          }
          Expression = WWHStringUtilities_WordToRegExpWithSpacePattern(WordList[Index]);
          ExpressionEntry.mExpressions[ExpressionEntry.mExpressions.length] = new RegExp(Expression, "i");
        }
      }

      // Search document based on longest sub-expressions
      //
      for (LongestWordExpression in ExpressionHash)
      {
        NewHighlightedWords = new Array();

        TextRange = WWHFrame.WWHContentFrame.WWHDocumentFrame.document.body.createTextRange();
        TextRange.collapse();
        while (TextRange.findText(LongestWordExpression, 1))
        {
          TextRange.expand("word");
          ExpressionEntry = ExpressionHash[LongestWordExpression];

          // Check word against search expression
          //
          bMatchFound = false;
          MaxExpressionIndex = ExpressionEntry.mExpressions.length;
          ExpressionIndex = 0;
          while (( ! bMatchFound) &&
                 (ExpressionIndex < MaxExpressionIndex))
          {
            if (ExpressionEntry.mExpressions[ExpressionIndex].test(TextRange.htmlText))
            {
              // Highlight text if not processed already
              //
              if (typeof HighlightedWords[TextRange.htmlText] == "undefined")
              {
                NewHighlightedWords[NewHighlightedWords.length] = TextRange.htmlText;

                TextRange.pasteHTML("<span style='background: " + WWHFrame.WWHHelp.mSettings.mHighlightingBackgroundColor + " ; color: " + WWHFrame.WWHHelp.mSettings.mHighlightingForegroundColor + "'>" + TextRange.htmlText + "</span>");

                if (bFirstMatch)
                {
                  TextRange.scrollIntoView();

                  bFirstMatch = false;
                }

                bMatchFound = true;
              }
            }

            ExpressionIndex++;
          }

          TextRange.collapse(false);
        }

        // Add highlighted words to hash
        //
        for (MaxIndex = NewHighlightedWords.length, Index = 0 ; Index < MaxIndex ; Index++)
        {
          HighlightedWords[NewHighlightedWords[Index]] = true;
        }
      }
    }
  }

  // Highlight words only once
  //
  this.mWords = null;
}

function  WWHHighlightWords_ExpressionHash_Object()
{
}

function  WWHHighlightWords_ExpressionEntry_Object()
{
  this.mExpressions = new Array();
}

function  WWHHighlightWords_HighlightedWords_Object()
{
}
