/*

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>

*/
if (typeof Array.prototype.indexOf == "undefined")
{
  Array.prototype.indexOf = function(elt)
  {
    var len = this.length;
    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from) : Math.floor(from);
    if (from < 0)
      from += len;
    for (; from < len; from++)
    {
      if (from in this && this[from] === elt)
				return from;
    }
    return -1;
  };
}
jQuery.fn.extend({
	ssHighlightClasses : [ "highlight" ],
	highlight : function(pat, sClass) {
	 sClass = sClass ? sClass : ssHighlightClasses[0];
	 function innerHighlight(node, pat, sClass) {
		sClass = sClass ? sClass : jQuery.fn.ssHighlightClasses[0];
	  var skip = 0;
	  if (node.nodeType == 3) {
	   var pos = node.data.toUpperCase().indexOf(pat);
	   if (pos >= 0) {
	    var spannode = document.createElement("span");
	    spannode.className = sClass;
	    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;
	   }
	   if (jQuery.fn.ssHighlightClasses.indexOf(sClass) < 0)
	  	jQuery.fn.ssHighlightClasses[jQuery.fn.ssHighlightClasses.length] = sClass;
	  }
	  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, sClass);
	   }
	  }
	  return skip;
	 }
	 return this.each(function() {
	  innerHighlight(this, pat.toUpperCase(), sClass);
	 });
	},
	removeHighlight : function() {
	 for (var i = 0; i < jQuery.fn.ssHighlightClasses.length; ++i) {
		this.find("span." + jQuery.fn.ssHighlightClasses[i]).each(function() {
	   this.parentNode.firstChild.nodeName;
	   with (this.parentNode) {
 	    replaceChild(this.firstChild, this);
	    normalize();
	   }
		}).end();
	 }
	 jQuery.fn.ssHighlightClasses.length = 1;
	 return this;
	}
});
