jQuery(document).ready(function() {
	jQuery('.haspopup').each(function () {
		var distance = 10;
		var time = 150;
		var hideDelay = 30;
		var hideDelayTimer = null;
		var beingShown = false; 
		var shown = false; 
		var trigger = jQuery('.trigger', this); 
		var popup = jQuery('.popup', this).css('opacity', 0); 
		
		jQuery([trigger.get(0), popup.get(0)]).mouseover(function () { 
			if (hideDelayTimer) clearTimeout(hideDelayTimer); 
			if (beingShown || shown) { 
				return; 
			} else { 
				beingShown = true; 
				popup.css({ 
					'position' : 'absolute',
					'display' : 'block',
					'top' : (15 - popup.height()) + 'px'
				})
				.animate({ top: '-=' + distance + 'px', opacity: 1 },
				time, 'swing', 
				function() { 
					beingShown = false;
					shown = true;
				}); 
			} 
		}) 
		.mouseout(function () { 
			if (hideDelayTimer) clearTimeout(hideDelayTimer);
			hideDelayTimer = setTimeout(function () { 
				hideDelayTimer = null; 
				popup.animate({
					top: '+=' + distance + 'px',
					opacity: 0
				}, 
				time, 'swing', 
				function () {
					shown = false;
					popup.css({
						'display' : 'none',
						'top' : 0
					});
				}); 
			}, 
			hideDelay); 
		}); 
	}); 
});
