$.fn.setHoverShowHide = function (_element_to_showhide, before_hide_time, hide_on_click, fade_out_time, _x, _y) {
	var element = $(_element_to_showhide);
	
	element._hideOut = function () {
		element.attr({
			showhide_is_visible: 0,
			showhide_do_hide: 0
		});
		if (fade_out_time) {
			element.stop().attr('showhide_hiding', 1).animate(
				{ opacity: 0 },
				fade_out_time,
				function () {
					if ((element.attr('showhide_is_visible')==0) && (element.attr('showhide_hiding')==1)) {
						element.hide().css('opacity', 1).attr('showhide_hiding', 0);
					}
				}
			);
		}
		else {
			element.hide();
		}
	}
	
	element.add(this).hover(
		function () {
			var do_show = (element.attr('showhide_is_visible')==0) || (element.attr('showhide_is_visible')==undefined);
			if (do_show) {
				if (_x && _y) {
					element.css({
						left: parseInt(_x) + 'px',
						top: parseInt(_y) + 'px'
					});
				}
				if (fade_out_time) {
					element.css({
						opacity: 0
					});
				}
			}
			
			element.show().attr({
				showhide_is_visible: 1,
				showhide_do_hide: 0,
				showhide_hiding: 0
			});
			
			if (do_show && fade_out_time) {
				element.stop().animate({
					opacity: 1
				}, fade_out_time);
			}
		},
		function () {
			var do_hide = element.attr('showhide_is_visible');
			if (do_hide) {
				element.attr('showhide_do_hide', 1);
				setTimeout(function () {
					if (element.attr('showhide_do_hide')==1) {
						element._hideOut();
					}
				}, before_hide_time);
			}
		}
	);
	
	if (hide_on_click) {
		element.click(function () {
			element._hideOut();
		});
	}
}
