// Highlights Google search terms. By John Haggerty (Slime).
// http://www.slimeland.com/
// Created April 30, 2003

// To use: define a "search-term" class with CSS, include this script, and put onload="CheckSearchTerms()" in your body tag.
// returns true if it finds any search terms.

// this function needs to be called, preferably during the onload event
function CheckSearchTerms()
{
	// if the referrer is google, highlight relevant search terms
	var found_any;
	var referrer, startat, endat;
	var search_term_strings = new Array(), search_terms = new Array(), search_term;
	try { // avoid error messages for bad browsers
		referrer = document.referrer;
		//referrer = 'http://www.google.com/search?hl=en&ie=UTF-8&oe=UTF-8&q=slime+update';
		if (referrer && (referrer.indexOf('&Terms=') != -1 || referrer.indexOf('?Terms=') == 28))
		{
			// determine search terms
			startat = referrer.indexOf('&Terms=')+7;
			if (startat == 2) startat = 31;
			endat = referrer.indexOf('&',startat);
			if (endat == -1) endat = referrer.length;
			search_term_strings = referrer.substring(startat,endat).split('+');
			for (var a=0; a < search_term_strings.length; a++) {
				search_terms[a] = new Object();
				search_term = unescape(search_term_strings[a]).match(/[a-zA-Z0-9_&']/g).join('').toLowerCase();
				if (search_term.substr(0,1) == "'") search_term = search_term.substr(1);
				if (search_term.substr(search_term.length-1,1) == "'") search_term = search_term.substr(0,search_term.length-1);
				search_terms[a].regexp =  new RegExp('\\b' + search_term + '\\b','i');
				search_terms[a].length = search_term.length;
			}
			
			// highlight search terms in document
			var body;
			for (var a=0; a < document.documentElement.childNodes.length; a++) {
				if (document.documentElement.childNodes[a].tagName && document.documentElement.childNodes[a].tagName.toLowerCase() == 'body') {
					body = document.documentElement.childNodes[a];
					break;
				}
			}
			return HighlightSearchTerms(body, document.documentElement, search_terms)[1];
		}
	}
	catch(err){}
	return false;
}

function HighlightSearchTerms(element, parentelement, search_terms)
{
	var termpos, whichterm, winningterm, thistermpos, childelement, nextelement, newspan;
	var returnvalue, foundany = false;
	if (element.nodeType == 3) // text node?
	{
		do {
			winningterm = 0;
			termpos = -1;
			// find next term in this text node
			for (whichterm = 0; whichterm < search_terms.length; whichterm++)
			{
				thistermpos = element.data.replace(/[\x20\xA0]/g,' ').search(search_terms[whichterm].regexp);
				if (thistermpos != -1 && (termpos == -1 || thistermpos < termpos))
				{
					termpos = thistermpos;
					winningterm = whichterm;
				}
			}
			if (termpos != -1)
			{
				// replace term with the same term surrounded in a span tag
				whichterm = winningterm;
				foundany = true;
				if (termpos > 0)
					element = element.splitText(termpos);
				nextelement = element.splitText(search_terms[whichterm].length);
				newspan = document.createElement('span');
				newspan.appendChild(element.cloneNode(true));
				newspan.className = 'search-term';
				parentelement.replaceChild(newspan, element);
				element = nextelement;
			}
		} while (termpos != -1 && element.data);
		return [element,foundany];
	}
	else
	{
		childelement = element.firstChild;
		while (childelement)
		{
			returnvalue = HighlightSearchTerms(childelement, element, search_terms);
			foundany = foundany || returnvalue[1];
			childelement = returnvalue[0].nextSibling;
		}
		return [element,foundany];
	}
}
