/*
Original jQuery highlight code:

highlight v3
Highlights arbitrary terms.
<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>
MIT license.
Johann Burkard <http://johannburkard.de> <mailto:jb@eaio.com>

Modified slightly...
*/

jQuery.fn.highlight = function(pat, className) {
 function innerHighlight(node, pat) {
  var skip = 0;
  if (node.nodeType == 3) {
   var pos = node.data.toUpperCase().indexOf(pat);
   if (pos >= 0) {
    var spannode = document.createElement('span');
    spannode.className = className;
    var middlebit = node.splitText(pos);
    var endbit = middlebit.splitText(pat.length);
    var middleclone = middlebit.cloneNode(true);
    spannode.appendChild(middleclone);
    middlebit.parentNode.replaceChild(spannode, middlebit);
    skip = 1;
   }
  }
  else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
   for (var i = 0; i < node.childNodes.length; ++i) {
    i += innerHighlight(node.childNodes[i], pat);
   }
  }
  return skip;
 }
 return this.each(function() {
  innerHighlight(this, pat.toUpperCase());
 });
};



/*
 * 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, className)
{
  // 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(" ");
  }

  for(var i = 0; i < searchArray.length; i++) {
    // STOP LIST //
    var termLC = searchArray[i].toLowerCase();
    if(termLC != "and" && termLC != "of" && termLC != "or"  && termLC != "when"  && termLC != "a" && termLC != "the" && termLC != "not" && termLC.length != 0) {
      $('#documentcontent').highlight(searchArray[i], className);
    }
  }

  return true;
}


/*
 * This function takes a referer/referrer string and parses it
 * to determine if it contains any search terms. If it does, the
 * search terms are passed to the highlightSearchTerms function
 * so they can be highlighted on the current page.
 */
function highlightForrSearchTerms(referrer, pageType) {
  // call the function in the onload event of your <body> tag,
  // like this:
  //   <body onload='highlightForrSearchTerms(document.referrer);'>

  if(!document.getElementById("documentcontent")) {
    return false;
  }

  if(!referrer) {
    return false;
  }

  if(!pageType) {
    pageType = "document";
  }

  var queryPrefix = "ntt";
  if(pageType == "surveyexplorer") {
    queryPrefix = "newsearch";
  }

  var className = "hilite";
  if(readCookie("forrSearchPrefUrl") != null && readCookie("forrSearchPrefUrl").match("highdoc=0")) {
    className = "hiliteoff";
  }

  var queryString = getQueryVariable(referrer.toLowerCase(), queryPrefix);
  if(queryString == "") {
    return false;
  }

  // urldecode string, change pipes and pluses to spaces
  queryString = unescape(queryString);
  queryString = queryString.replace(/\|/gi, " ");
  queryString = queryString.replace(/\+/gi, " ");

  // filter out 'not' phrases
  queryString = queryString.replace(/\s*\bnot\b.*?(\s\band\b|\s\bor\b|$)+/gi, "$1");

  // grab phrases in quotes and highlight them
  var re = new RegExp("\"(.*?)\"");
  while(queryString.match(re)) {
    // send phrase to get highlighted without space at beginning or end
    highlightSearchTerms(RegExp.$1.replace(/^\s*(.*?)\s*$/gi, "$1"), true, className);
    // remove the phrase from the querystring
    queryString = queryString.replace(re, "");
  }

  // remove ':', as it confuses things
  queryString = queryString.replace(/:/gi, "");
  // remove the quotes
  queryString = queryString.replace(/\"/gi, "");
  // remove whitespace at the beginning and end of the string
  queryString = queryString.replace(/^\s*(.*?)\s*$/gi, "$1");

  // if there is anything left to highlight, send it to the highlight function
  if(queryString.length != 0) {
    return highlightSearchTerms(queryString, false, className);
  } else {
    return false;
  }
}


function toggleHighlight() {
  var toggle = document.getElementById("toggle");
  if(toggle.innerHTML == "Turn Off Highlighting") {
    toggle.innerHTML = "Turn On Highlighting";
  } else {
    toggle.innerHTML = "Turn Off Highlighting";
  }

  var spans = document.getElementsByTagName("span");
  for(var i = 0; i < spans.length; i++) {
    if(spans[i].className == "hilite") {
      spans[i].className = "hiliteoff";
    } else {
      if(spans[i].className == "hiliteoff") {
        spans[i].className = "hilite";
      }
    }
  }
}


// basic idea from:
// http://www.zrinity.com/developers/code_samples/code.cfm/CodeID/59/JavaScript/Get_Query_String_variables_in_JavaScript
function getQueryVariable(url, variable) {
  var query = url.substring(url.indexOf("?") + 1);
  var vars = query.split("&");
  for(var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    if(pair[0] == variable) {
      return pair[1];
    }
  }
  return '';
}

