(function() {

    var LiveTracker = window.LiveTracker;

    LiveTracker.Tooltip = function() {

        var

        /* НАЧАЛО НАСТРОЕК */

        attr_name = "tooltip", // наименование создаваемого tooltip'ого атрибута
        blank_text = "(ссылка откроется в новом окне)", // текст для ссылок с target="_blank"
        newline_entity = "~", // укажите пустую строку (""), если не хотите использовать в tooltip'ах многострочность; ежели хотите, то укажите тот символ или символы, которые будут заменяться на перевод строки
        max_width = 0, // максимальная ширина tooltip'а в пикселах; обнулите это значение, если ширина должна быть нелимитирована

        /* КОНЕЦ НАСТРОЕК */

        t = document.createElement("DIV"),
        g = false;

        return {

            m : function(e) {
                if (g) {
                    var oCanvas = document.getElementsByTagName(
                        (document.compatMode && document.compatMode == "CSS1Compat") ? "HTML" : "BODY"
                    )[0];

                    var x = window.event ? event.clientX + oCanvas.scrollLeft : e.pageX;
                    var y = window.event ? event.clientY + oCanvas.scrollTop : e.pageY;
                    LiveTracker.Tooltip.a(x, y);
                }
            },

            d: function() {
                t.setAttribute("id", "tooltip");

                document.body.appendChild(t);
                var a = document.all ? document.all : document.getElementsByTagName("*");
                var aLength = a.length;

                for (var i = 0; i < aLength; i++) {
                    if (!a[i]) continue;

                    var tooltip_title = a[i].getAttribute("title"); // returns form object if IE & name="title"; then IE crashes; so...
                    if (tooltip_title && typeof tooltip_title != "string") tooltip_title = "";
                    var tooltip_alt = a[i].getAttribute("alt");
                    var tooltip_blank = a[i].getAttribute("target") && a[i].getAttribute("target") == "_blank" && blank_text;

                    if (tooltip_title || tooltip_blank) {
                        a[i].setAttribute(attr_name, tooltip_blank ? (tooltip_title ? tooltip_title + " " + blank_text : blank_text) : tooltip_title);

                        if (a[i].getAttribute(attr_name)) {
                            a[i].removeAttribute("title");
                            if (tooltip_alt && a[i].complete) a[i].removeAttribute("alt");

                            this.l(a[i], "mouseover", LiveTracker.Tooltip.s);
                            this.l(a[i], "mouseout", LiveTracker.Tooltip.h);
                        }
                    } else if (tooltip_alt && a[i].complete) {
                        a[i].setAttribute(attr_name, tooltip_alt);

                        if (a[i].getAttribute(attr_name)) {
                            a[i].removeAttribute("alt");

                            this.l(a[i], "mouseover", LiveTracker.Tooltip.s);
                            this.l(a[i], "mouseout", LiveTracker.Tooltip.h);
                        }
                    }
                }

                document.onmousemove = LiveTracker.Tooltip.m;
                window.onscroll = LiveTracker.Tooltip.h;
                LiveTracker.Tooltip.a(-99, -99);
            },

            s: function(e){
                var d = window.event ? window.event.srcElement : e.target;
                if (!d.getAttribute(attr_name)) return;
                s = d.getAttribute(attr_name);

                if (newline_entity) {
                    s = s.replace(/\&/g,"&amp;");
                    s = s.replace(/\</g,"&lt;");
                    s = s.replace(/\>/g,"&gt;");
                    s = s.replace(eval("/" + newline_entity + "/g"), "<br />");
                    t.innerHTML = s;
                } else {
                    if (t.firstChild) t.removeChild(t.firstChild);
                    t.appendChild(document.createTextNode(s));
                    //t.innerText = s;
                }

                t.style.visibility = 'visible';
                g = true;
            },

            h: function(e){
                t.style.visibility = "hidden";
                if (!newline_entity && t.firstChild) t.removeChild(t.firstChild);
                g = false;
                LiveTracker.Tooltip.a(-99, -99);
            },

            l : function(o, e, a){
                if (o.addEventListener) o.addEventListener(e, a, false); // was true--Opera 7b workaround!
                else if (o.attachEvent) o.attachEvent("on" + e, a);
                else return null;
            },

            a : function(x, y){
                var oCanvas = document.getElementsByTagName(
                    (document.compatMode && document.compatMode == "CSS1Compat") ? "HTML" : "BODY"
                )[0];

                var w_width = oCanvas.clientWidth ? oCanvas.clientWidth + oCanvas.scrollLeft : window.innerWidth + window.pageXOffset;
                var w_height = window.innerHeight ? window.innerHeight + window.pageYOffset : oCanvas.clientHeight + oCanvas.scrollTop; // should be vice verca since Opera 7 is crazy!

                t.style.width = ((max_width) && (t.offsetWidth > max_width)) ? max_width + "px" : "auto";

                var t_width = t.offsetWidth;
                var t_height = t.offsetHeight;

                t.style.left = x + 6 + "px";
                t.style.top = y + 16 + "px";

                if (x + t_width > w_width-8) t.style.left = w_width - t_width + "px";
                if (y + t_height > w_height-8) t.style.top = w_height - t_height + "px";
            },

            initialize : function() {
                window.onerror = null;
                this.d();
            }

        };

    }();

})();