(function(jQuery) {

    jQuery.fn.easyTooltip = function(options) {

        var options = $.extend({
            xLeftOffset: 4,
            xRightOffset: 8,
            yOffset: -10
        }, options);

        this.each(function() {
            var elem = this;

            var title = $(this).attr('title');
            if (title) {
                $(elem).data('title', title);
                $(elem).removeAttr('title');

                var tooltip = $('<div>').attr('id', "easyTooltip")
                                        .html(title);

                var updatePosition = function(e) {
                    tooltip.css("top", (e.pageY - options.yOffset) + "px")
                           .css("left", e.pageX < 300
                                        ? (e.pageX + options.xRightOffset) + "px"
                                        : (e.pageX - tooltip.width() - options.xRightOffset) + "px");
                    tooltip.html($(elem).data('title'));
                }

                var timedTooltipRemove;
                var timedTooltipAppear;
                var hoveringAboveTooltip = false;
                
                var makeTooltipAppear = function(e) {
                    // if a tooltip is open, remove it before appending the new one:
                    jQuery('#easyTooltip').remove();
                    
                    tooltip.css("position","absolute")
                    .appendTo($('body'))
                    .show();
                    updatePosition(e);
                    jQuery("#easyTooltip").hover(
                            function(e) {
                                hoveringAboveTooltip = true;
                                clearTimeout(timedTooltipRemove)
                            },
                            function() {
                                hoveringAboveTooltip = false;
                                tooltip.remove();
                            }
                    );
                };

                jQuery(elem).hover(
                    function(e) {
                        timedTooltipAppear = setTimeout(function() { makeTooltipAppear(e); }, 250);
                    },
                    function() {
                        if (!hoveringAboveTooltip) {
                            timedTooltipRemove = setTimeout(function() { jQuery('#easyTooltip').remove(); }, 650);
                        }
                        clearTimeout(timedTooltipAppear);
                    }
                );
//              jQuery(elem).mousemove(updatePosition);
            }
        });
    }

})(jQuery);
