;(function($){
	$.fn.coda = function(settings){
		
		var defaults = {
			"distance" 	: 20, 
			"time"		: 250,
			"hideDelay" : 500
		};
			
		if(!settings) settings = {};
		settings = $.extend(defaults, settings);
		
		return this.each(function()
		{ 
			var trigger 		= $(this);
			var popup 			= $("#"+$(this).attr("coda_target")).css('opacity', 0);;
			
			if(!popup) return;
			
			var distance 		= settings.distance;
		    var time 			= settings.time;
			var hideDelay 		= settings.hideDelay;
			var offset			= settings.offset;
			var hideDelayTimer 	= null;
			
			// tracker
		    var beingShown 		= false;
		    var shown 			= false;
		    
		    var base_location = trigger.offset();
		    
		    // 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;
				
			    // reset position of popup box
		        popup.css({
		          top: base_location.top - popup.height() - offset,
		          left: base_location.left - (popup.width() / 2) + (trigger.width() / 2),
		          display: 'block' // brings the popup back in to view
		        })
		        
				
		        // (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');
		        });
		      }, hideDelay);
		    });
			
			
			
		});
		
  	};
  	
  	
  	
})(jQuery);