/*

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>

*/

jQuery.fn.highlightWords = function(pat, occurances, page) {
    var _occurances = occurances;
    var _highLightCount = 0;
    var savedWords = new Array();



    function innerHighlight(node, pat, page) {
        var skip = 0;
        var pattern = ".,!? ";


        if (node.nodeType == 3) {
            var wordpos = -1;
            if (node.data.toUpperCase().indexOf(pat) >= 0) {
                var endChar = node.data.substr(node.data.toUpperCase().indexOf(pat) + pat.length, 2)
                endChar2 = endChar.substr(0, 1);
                
                if (endChar == "\n" || pattern.indexOf(endChar2) >= 0)
                    wordpos = node.data.toUpperCase().indexOf(pat);
            }

            if (_highLightCount < _occurances && wordpos >= 0) {

                var spannode = document.createElement('span');
                spannode.className = 'highlight';
                var middlebit = node.splitText(wordpos);
                var endbit = middlebit.splitText(pat.length);
                var middleclone = middlebit.cloneNode(true);
                spannode.appendChild(middleclone);
                middlebit.parentNode.replaceChild(spannode, middlebit);

                var presentTip = function(tip) {
                    return "<div class='tooltipHeader'></div><div class='tooltipBody'><div class='innerTooltipBody'><h3>" + tip + "</h3><p>" + savedWords[tip] + "</p></div></div><div class='tooltipFooter'></div>";
                }

                jQuery.ajaxSetup({
                    xhr: function () {
                        //return new window.XMLHttpRequest(); 
                        try {
                            if (window.ActiveXObject)
                                return new window.ActiveXObject("Microsoft.XMLHTTP");
                        } catch (e) { }

                        return new window.XMLHttpRequest();
                    }
                }); 

                $(spannode).tooltip({
                    track: true,
                    delay: 0,
                    showURL: false,
                    fixPNG: false,
                    showBody: " - ",
                    left: -5,
                    bodyHandler: function() {

                        if (!savedWords[pat]) {
                            $.ajax({
                                url: page + "/GetExplanation",
                                type: "POST",
                                async: false,
                                contentType: "application/json; charset=utf-8",
                                data: "{ 'word': '" + pat + "' }",
                                dataType: "json",
                                success: function(msg) {
                                    savedWords[pat] = msg.d;
                                }
                            });
                            return presentTip(pat);

                        }
                        else
                            return presentTip(pat);
                    }
                });

                _highLightCount++;
                skip = 1;
            }
        }
        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, page);

                if (_highLightCount >= _occurances) {
                    return;
                }
            }
        }
        return skip;
    }

    return this.each(function() {
        var words = pat.split(',');
        var test = 0;
        for (var i = 0; i < words.length; i++) {
            _highLightCount = 0;
            innerHighlight(this, words[i].toUpperCase(), page);
        }
    });
};

jQuery.fn.removeHighlight = function() {
 return this.find("span.highlight").each(function() {
  this.parentNode.firstChild.nodeName;
  with (this.parentNode) {
   replaceChild(this.firstChild, this);
   normalize();
  }
 }).end();
};

