;(function($) {
	$.fn.popup = function(options) {
		var defaults = {
			elements:'popup',
			trigger:'popup-trigger',
			target:'popup-target',
			distance:10,
			time:250,
			hideDelay:100,
			position:{
				x:'right',
				y:'top',
				xval:40,
				yval:3
			}
		}
		var settings = $.extend(defaults, options);
		
		$('.' + settings.elements + '').each(function () {
			// options
			var distance = settings.distance;
			var time = settings.time;
			var hideDelay = settings.hideDelay;
			
			var hideDelayTimer = null;
			
			// tracker
			var beingShown = false;
			var shown = false;
			
			var trigger = $('.' + settings.trigger, this);
			var popup = $('.' + settings.target, this).css('opacity', 0);
			
			
			// set the mouseover and mouseout on both element
			$([trigger.get(0), popup.get(0)]).mouseover(function () {
				// stops the hide event if we move from the trigger to the popup element
				if (hideDelayTimer) clearTimeout(hideDelayTimer);
				
				// don't trigger the animation again if we're being shown, or already visible
				if (beingShown || shown) {
					return;
				} else {
					beingShown = true;
				
					if(settings.position.x=='left') {
						popup.css('left',settings.position.xval);
					}
					if(settings.position.x=='right') {
						popup.css('right',settings.position.xval);
					}
					if(settings.position.y=='top') {
						popup.css('top',settings.position.yval);
					}
					if(settings.position.y=='bottom') {
						popup.css('bottom',settings.position.yval);
					}
					// reset position of popup box
					popup.css({
						//top: 3,
						//right: 40,
						display: 'block',
						visibility: 'visible'// brings the popup back in to view
					})
					//.css(settings.position.x,settings.position.xval)
				
					// (we're using chaining on the popup) now animate it's opacity and position
					.animate({
						top: '-=' + distance + 'px',
						opacity: 1
					}, time, 'swing', function() {
						// once the animation is complete, set the tracker variables
						beingShown = false;
						shown = true;
					});
				}
			}).mouseout(function () {
				// reset the timer if we get fired again - avoids double animations
				if (hideDelayTimer) clearTimeout(hideDelayTimer);
				
				// store the timer so that it can be cleared in the mouseover if required
				hideDelayTimer = setTimeout(function () {
					hideDelayTimer = null;
					popup.animate({
						top: '-=' + distance + 'px',
					opacity: 0
					}, time, 'swing', function () {
						// once the animate is complete, set the tracker variables
						shown = false;
						// hide the popup entirely after the effect (opacity alone doesn't do the job)
						popup.css({
							display:'none',
							visibility:'hidden'
						});
					});
				}, hideDelay);
			});
		});
	}
})(jQuery);