﻿/*

highlight v1

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>

ChangeLog.
 - 2007/04/24 Minoru KINOSHITA
   extend code Highlight() for Japanese. use toUpperCase -> RegExp
   modify code removeHighlight(). 
   

*/
var count=0;
$(function() {
 jQuery.highlight = document.body.createTextRange ? 

/*
Version for IE using TextRanges.
*/
  function(node, te) {
   var r = document.body.createTextRange();
   r.moveToElementText(node);

   for (var i = 0; r.findText(te,0,4); i++) {
    r.pasteHTML('<span class="jq-highlight">' +  r.text + '<\/span>');
    r.collapse(false);
   }
  }

 :

/*
 (Complicated) version for Mozilla and Opera using span tags.
*/
  function(node, te) {
   var pos, skip, spannode, startbit, middlebit, endbit, middleclone,parent;
   skip = 0;
   if (node.nodeType == 3) {
    //pos = node.data.toUpperCase().indexOf(te);
	pos = node.data.search(new RegExp(te, "gm"));
    if (pos >= 0) {
     spannode = document.createElement('span');
     spannode.className = 'jq-highlight';
     middlebit = node.splitText(pos);
     endbit = middlebit.splitText(te.length);
     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)) {
//   else if (node.nodeType == 1 && node.childNodes && !/(script|style|a|h)/i.test(node.tagName)) {
    for (var i = 0; i < node.childNodes.length; ++i) {
     i += $.highlight(node.childNodes[i], te);
    }
   }
   return skip;
  }
 ;
});

jQuery.fn.removeHighlight = function() {
    return this.find("span.jq-highlight").each(function(){
        parentThis = this.parentNode;
        this.parentNode.replaceChild(this.firstChild, this).normalize();
        parentThis.normalize();
    });
};
