/*
 * This is the function that actually highlights a text string by adding HTML
 * tags before and after all occurrences of the search term. You can pass your
 * own tags if you'd like, or if the highlightStartTag or highlightEndTag
 * parameters are omitted or are empty strings then the default <font> tags
 * will be used.
 */

// colors that will be used for highlighting
var colors = new Array("ACF","AFC","CFA", "CAF", "FCA", "FAC");
function doHighlight(bodyText, searchTerm, highlightStartTag, highlightEndTag, color) {

   // tags for highlighting
   if ((!highlightStartTag) || (!highlightEndTag)) {
      highlightStartTag = "<span style='background-color: #"+color+"; font-size: 1em; font: inherit;'>";
      highlightEndTag = "</span>";
   }

   // a new text that contains highlight tags
   var newText = "";
   var i = -1;

   // make everything to lowercase so that we can search case-insensitively
   var lcSearchTerm = searchTerm.toLowerCase();
   var lcBodyText = bodyText.toLowerCase();

   // loop though the bodyText until there is nothing left
   while (bodyText.length > 0) {

      // get the index of the next occurence
      i = lcBodyText.indexOf(lcSearchTerm, i+1);

      if (i < 0) {
         newText += bodyText;
         bodyText = "";
      }
      
      else {

         // skip anything inside an HTML tag
         if (bodyText.lastIndexOf(">", i) < bodyText.lastIndexOf("<", i))
            continue;

         // skip anything inside a <script> block
         else if (lcBodyText.lastIndexOf("/script>", i) < lcBodyText.lastIndexOf("<script", i))
            continue;

         else {
            newText += bodyText.substring(0, i) + highlightStartTag + bodyText.substr(i, searchTerm.length) + highlightEndTag;
            bodyText = bodyText.substr(i + searchTerm.length);
            lcBodyText = bodyText.toLowerCase();
            i = -1;
         }
      }
   }

   return newText;
}


/*
 * This is sort of a wrapper function to the doHighlight function. It takes the
 * searchText that you pass, optionally splits it into separate words, and
 * transforms the text on the current web page. Only the "searchText" parameter
 * is required; all other parameters are optional and can be omitted.
 */
function highlightSearchTerms(searchText, treatAsPhrase, warnOnFailure, highlightStartTag, highlightEndTag) {

   // if the treatAsPhrase parameter is true, then we should search for the
   // entire phrase that was entered; otherwise, we will split the search
   // string so that each word is searched for and highlighted individually
   if (treatAsPhrase) {
      searchArray = [searchText];
   } else {
      searchArray = searchText.split(" ");
   }
  
   if (!document.body || typeof(document.body.innerHTML) == "undefined") {
      if (warnOnFailure) {
         alert("Sorry, for some reason the text of this page is unavailable. Searching will not work.");
      }
      return false;
   }
  
   var bodyText = document.body.innerHTML;
   for (var i = 0; i < searchArray.length; i++) {
      if (searchArray[i] != "")
         bodyText = doHighlight(bodyText, searchArray[i], highlightStartTag, highlightEndTag, colors[i%6]);
   }
  
   document.body.innerHTML = bodyText;
   return true;
}
