jQuery.HelpBubbleContainer = {
	bubble: null,
	removed: true
};
jQuery.fn.HelpBubble = function(bubble, options) {
	var o = jQuery.extend({delay: 700, className: 'bubble', offsetX: 10, offsetY: 10}, options);
	if (!jQuery.HelpBubbleContainer.bubble) {
		jQuery.HelpBubbleContainer.bubble = jQuery('<div></div>').addClass(o.className).css('position', 'absolute');
		jQuery.HelpBubbleContainer.removed = true;
	}
	var e3 = jQuery.HelpBubbleContainer.bubble;
	var d = {width: 0, height: 0};
	var w = {width: jQuery(window).width(), height: jQuery(window).height()};

	return this.each(function() {
		var e1 = jQuery(this);
		var e2 = bubble == null? jQuery('+span', this) : jQuery(bubble);
		e2.hide();
		var p = function(e) {
			if (! e instanceof Object || isNaN(e.pageX) || isNaN(e.pageY)) {
				return {};
			} else {
				var p = {left: e.pageX+o.offsetX, top: e.pageY+o.offsetY};
				var c = {left: e.clientX, top: e.clientY};
				var dx = c.left+d.width+o.offsetX-w.width;
				if (dx > 0) {
					p.left -= d.width+o.offsetX+o.offsetX;
				}
				var dy = c.top+d.height+o.offsetY-w.height;
				if (dy > 0) {
					p.top -= dy;
				}
				return p;
			}
		}
		e1.mouseover(function(e) {
			e3.html(e2.html());
			e3.css({opacity: 0}).appendTo('body').animate({opacity: 0}, o.delay).queue(function() {
				jQuery(this).css({opacity: 1});
			});
			jQuery.HelpBubbleContainer.removed = false;
			w = {width: jQuery(window).width(), height: jQuery(window).height()};
//			d = {width: e3.innerWidth(), height: e3.innerHeight()};
			d = {width: e3.width(), height: e3.height()};
			e3.css(p(e));
		});
		e1.mousemove(function(e) {
			e3.css(p(e));
		});
		e1.mouseout(function() {
			if (!jQuery.HelpBubbleContainer.removed) {
				e3.stop().remove();
				jQuery.HelpBubbleContainer.removed = true;
			}
		});
		e3.mouseover(function() {
			if (!jQuery.HelpBubbleContainer.removed) {
				e3.stop().remove();
				jQuery.HelpBubbleContainer.removed = true;
			}
		});
	});
};
