/**
Vertigo Tip by www.vertigo-project.com
Requires jQuery
*/
(function($) {
    function vtip() {
        var Anchor = {
            LEFT: 1,
            RIGHT: 2,
            BOTTOM: 3
        };

        var persistentHover = false;

        $(".vtip,.vtipMore").unbind().hover(show, hide)
            .filter(".vtipMore")
                .focus(show)
                .blur(hide);

        function show(e) {
            var elem = $(this),
                title = elem.data("prevTitle") || elem.attr("title") || '',
                more = elem.hasClass("vtipMore"),
                targetId = elem.attr("data-target");

            var target = elem;
            if (targetId) {
                target = $("#" + targetId);
            }

            var anchor = Anchor.LEFT;

            if (more) {
                if (e.type == "focus") {
                    anchor = Anchor.BOTTOM;

                    persistentHover = true;
                // hover
                } else {
                    if (persistentHover) {
                        return;
                    }

                    anchor = Anchor.RIGHT;
                }
            } else if (persistentHover) {
                return;
            }

            $("#vtip").remove();
            // Save the title attribute and clear it out, so the browser wouldn't display its own hover.
            elem.data("prevTitle", title);
            elem.attr("title", "");

            var cont = $('<div id="vtip" style="visibility:hidden;">' + title + '</div>');
            $('body').append(cont);

            var offset = calcOffset(target, cont, anchor, 2);

            cont.css({
                left: offset.left + "px",
                top: offset.top + "px",
                visibility: "visible"
            }).fadeIn("fast");
        }

        function calcOffset(elem, vtip, anchor, padding) {
            var offset = elem.offset(),
                vtipWidth = vtip.outerWidth(),
                vtipHeight = vtip.outerHeight(), 
                left, top;

            switch (anchor) {
            case Anchor.LEFT:
                left = offset.left - vtipWidth - padding;
                top = offset.top;

                break;
            case Anchor.RIGHT:
                left = offset.left + elem.outerWidth() + padding;
                top = offset.top;

                var viewportWidth = $(window).width(), 
                    offsetRight = left + vtipWidth;
                
                
                if (offsetRight > viewportWidth) {
                    left -= offsetRight - viewportWidth;
                }

                break;
            case Anchor.BOTTOM:
                left = offset.left;
                top = offset.top + elem.outerHeight() + padding;
                break;
            }

            if (anchor == Anchor.LEFT || anchor == Anchor.RIGHT) {
                var viewportHeight = $(window).height() + $(window).scrollTop(),
                    offsetBottom = top + vtipHeight;

                if (offsetBottom > viewportHeight) {
                    top -= offsetBottom - viewportHeight;
                }
            }

            return { left: left, top: top };
        }

        function hide(e) {
            var elem = $(this),
                more = elem.hasClass("vtipMore");

            if (more && e.type == "blur") {
                persistentHover = false;

            } else if (persistentHover) {
                return;
                
            }

            // restore title
            var prevTitle = elem.data("prevTitle");
            if (prevTitle) {
                elem.attr("title", prevTitle);
                elem.data("prevTitle", null);
            }

            $("#vtip").fadeOut("fast", function() {
                $(this).remove();
            });
        }
    }

    $(vtip);
})(jQuery);
