(function($) {

$.extend({
	highlight: {
		defaults : {
			cssClass: 'highlight'
		},
	
		setCssClass: function(cssClass){
			this.defaults.cssClass = cssClass;
		},
	
		highlightText: function(elem, string) {
			var doHighlight = function (elem, position, string) {
				var spannode = document.createElement('span');
				spannode.className = $.highlight.defaults.cssClass;
				
				var middlebit = elem.splitText(position);
				var endbit = middlebit.splitText(string.length);
				var middleclone = middlebit.cloneNode(true);
				
				spannode.appendChild(middleclone);
				middlebit.parentNode.replaceChild(spannode, middlebit);
			}
			
			if (elem.nodeType == 3) {
				var position = elem.data.toUpperCase().indexOf(string);
				if (position >= 0) {
					doHighlight(elem, position, string);
					return 1;
				}
					
				return 0;
			}
			else if (elem.nodeType == 1 && elem.childNodes && !(/(script|style)/i.test(elem.tagName))) {
				for (var i = 0; i < elem.childNodes.length; ++i) {
					i += this.highlightText(elem.childNodes[i], string);
				}
			}
			
			return 0;
		},
		
		removeHighlight: function() {
			return $("span." + this.defaults.cssClass).each(function() {
				with (this.parentNode) {
					replaceChild(this.firstChild, this);
					normalize();
				}
			});
		}
	}
});

$.fn.highlight = function(strings){
	return this.each(function() {
		if (typeof strings == 'string') {
			$.highlight.highlightText(this, strings.toUpperCase());	
		}
		else {
			for (var i = 0; i < strings.length; i++) {
				$.highlight.highlightText(this, strings[i].toUpperCase());
			}
		}
	 });
};

})(jQuery);
