function highlightReferrerLinks() {
  if(document.referrer) {
    /* page has a referrer */

    highlightSearchReferrerParameters();

    var referrerTopic = getTopicId(document.referrer);
    var hyperlinkIndex;
    var pageHyperlinks = document.getElementsByTagName("a");
    for(hyperlinkIndex = 0; hyperlinkIndex < pageHyperlinks.length; hyperlinkIndex++) {
      var pageHyperlink = pageHyperlinks[hyperlinkIndex];
      if(pageHyperlink.className == "topic-ref") {
        stdOut("<b>" + pageHyperlink.name + "</b><br />");
        var linkTopic = getTopicId(pageHyperlink.attributes["href"].value);
        if(linkTopic == referrerTopic) {
          stdOut("Hyperlink number " + (hyperlinkIndex + 1) + ". found it!<br />");
          pageHyperlink.className = "referrer";
        }
        else {
          stdOut("Hyperlink number " + (hyperlinkIndex + 1) + ". " + linkTopic + " != " + referrerTopic + "<br />");
        }
      }
    }
  }
  else {
    stdOut("no referrer");
  }
}

function getTopicId(url) {
  url = "/" + url;
  var fileComponentIndex = url.lastIndexOf("/");
  var fileComponent = url.substr(fileComponentIndex);
  var extensionIndex = fileComponent.lastIndexOf(".html");
  var topicId = fileComponent.substr(0, extensionIndex);
  return topicId;
}
	
function removeProtocolAndDomain(url) {
  return url.replace(window.location.protocol + "//","").replace(window.location.hostname,"");
}

function stdOut(message) {
  var consoleElement = document.getElementById("console");
  if(consoleElement) {
    consoleElement.innerHTML += message;
  }
  return;
}


function highlightSearchReferrerParameters() {
    var refURL = document.referrer.toString();

    if (refURL.indexOf("?") > 0)  {

        var arrParams = refURL.split("?");
        var arrURLParams = arrParams[1].split("&");

        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i=0; i < arrURLParams.length; i++) {
            var splitParam =  arrURLParams[i].split("=");
            if (splitParam[0] == "text" || splitParam[0] == "name" || splitParam[0] == "figure" || splitParam[0] == "verse") {
                //alert(splitParam[1]);
                splitAndHighlight(splitParam[1], "+");
            } else if (splitParam[0] == "queryString")  {
                //queryString=body:(%22maori%20AND%20people%22)&startIndex=25&pageLength=25
                splitParam[1].match(/body:\(([^\)]+)\)/);
                splitAndHighlight(RegExp.$1, "%20");

                splitParam[1].match(/figure:\(([^\)]+)\)/);
                splitAndHighlight(RegExp.$1, "%20");

                splitParam[1].match(/verse:\(([^\)]+)\)/);
                splitAndHighlight(RegExp.$1, "%20");

                splitParam[1].match(/name:\(([^\)]+)\)/);
                splitAndHighlight(RegExp.$1, "%20");

            }
        }
    }

    return "";
}

function splitAndHighlight(terms, separator)  {

    // remove double and single quotes (%22 and %27)
    var arrTerms = terms.toLowerCase().replace(/\%2(2|7)/g, "").split(separator);
    var stopWords = new Array("and", "or", "not", "the", "a", "an", "in", "on", "for", "by", "with", "from", "of");
    var i;
    var j;
    var term;
    term_loop:
    for (i = 0; i < arrTerms.length; i++) {
        term = arrTerms[i];
        for (j = 0; j < stopWords.length; j++) {
            if (stopWords[j] == term) {
                continue term_loop;
            }
        }
        highlightTermInPage(term, document);
    }
}

function highlightTermInPage(term, container) {

    // term is lower case

    if (term == "")  {
        return;
    }

    for(var i=0; i < container.childNodes.length; i++) {
        var node = container.childNodes[i];
        if (node.nodeType == 3)  {
            var data = node.data;
            var dataLowerCase = data.toLowerCase();
            if (dataLowerCase.search("\\b" + term + "\\b") != -1)  {
                var newNode = document.createElement('span');
                node.parentNode.replaceChild(newNode,node);
                var result;
                while((result = dataLowerCase.search("\\b" + term + "\\b")) != -1)  {
                    newNode.appendChild(document.createTextNode(data.substr(0,result)));
                    newNode.appendChild(createHighlightedTerm(document.createTextNode(data.substr(result,term.length))));
                    data = data.substr(result + term.length);
                    dataLowerCase = dataLowerCase.substr(result + term.length);
                }
                newNode.appendChild(document.createTextNode(data));
            }
        }  else  {
            highlightTermInPage(term, node);
        }
    }
}

function createHighlightedTerm(attachToNode)  {
    var node = document.createElement('span');
    node.className = "referrer";
    node.appendChild(attachToNode);
    return node;
}
