/*


 * jQuery Highlight Regex Plugin


 *


 * Based on highlight v3 by Johann Burkard


 * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html


 *


 * (c) 2009-10 Jacob Rothstein


 * MIT license


 */





;(function($) {


    var normalize = function(node) {


        if (!( node && node.childNodes )) return;





        var children = $.makeArray(node.childNodes), prevTextNode = null;


        $.each (children, function(i, child) {


            if (child.nodeType === 3) {


                if (child.nodeValue === "") {


                    node.removeChild(child)


                } else if (prevTextNode !== null) {


                    prevTextNode.nodeValue += child.nodeValue;


                    node.removeChild(child);


                } else { prevTextNode = child; }


            } else {


                prevTextNode = null


                if (child.childNodes) normalize(child)


            }


        })





    }





    $.fn.highlightRegex = function(regex) {


        if (typeof regex === 'undefined' || regex.source === '') {


            $(this).find('span.highlight').each(function() {


                $(this).replaceWith($(this).text());


                normalize ($(this).parent().get(0));


            });


        } else {


            $(this).each(function() {


                var elt = $(this).get(0)





                normalize(elt)





                $.each($.makeArray(elt.childNodes), function(i, searchnode){


                    var spannode, middlebit, middleclone, pos, match, parent;


                    normalize(searchnode)





                    if(searchnode.nodeType == 3) {


                        while (searchnode.data && (pos = searchnode.data.search(regex)) >= 0) {





                            match = searchnode.data.slice(pos).match(regex)[0];





                            if (match.length > 0) {


                                spannode = document.createElement('span');


                                spannode.className = 'highlight';





                                parent      = searchnode.parentNode;


                                middlebit   = searchnode.splitText(pos);


                                searchnode  = middlebit.splitText(match.length);


                                middleclone = middlebit.cloneNode(true);





                                spannode.appendChild(middleclone);


                                parent.replaceChild(spannode, middlebit);





                            } else break;


                        }


                    } else {


                        $(searchnode).highlightRegex(regex);


                    }


                })


                    })


                }


        return $(this);


    }


})(jQuery);
