/**
 * @author Remy Sharp
 * @date 2008-03-27
 * @url http://jqueryfordesigners.com/coda-popup-bubbles/
 * @license Creative Commons License - ShareAlike http://creativecommons.org/licenses/by-sa/3.0/
 *
 * See URL for markup examples and screencast
 */

(function ($) {
	$.fn.bubble = function (options) {
		var defaults = {
			'trigger' : '.trigger',
			'initiateOn' : 'mouseover',
			'hideOn' : 'mouseout',
			'popup' : '.popup',
			'position' : 'top right', 
			'distance' : 10,
			'hideDelay' : 500,
			'effectTime' : 250,
			'offTop' : 0,
			'offLeft' : 0
		};
		
		var settings = $.extend({}, defaults, options);
		if(settings.hideOn == 'auto'){
			settings.hideOn = settings.initiateOn;
		}
		return this.each(function () {
			var hideDelayTimer = null;

			var trigger = $(settings.trigger, this);
			var popup = $(settings.popup, this);
			var topv = 0;
			var bottomv = 0;
			var leftv = 0;

			$([trigger.get(0), popup.get(0)]).bind(settings.initiateOn,function () {
				if (hideDelayTimer) clearTimeout(hideDelayTimer);
				if (popup.is(':animated, :visible')) {
					return;
				} else {
					popup.css({top:0,left:0,display:'block'});
					toff = trigger.offset();
					poff = popup.offset();
					if(settings.position.search('menu') >= 0){
						topv = (toff.top-poff.top);
						leftv = (toff.left-poff.left);
						dir = (settings.position.search('up') >= 0 ? 'up' : 'down');
						if(dir == 'up')
							topv = topv-popup.outerHeight();
						if(settings.position.search('left') >= 0){
							leftv = leftv - popup.outerWidth();
						}else if(settings.position.search('right') >= 0){
							leftv = leftv + trigger.outerWidth();
						}else{
							topv = topv + (trigger.outerHeight())*(dir == 'up' ? -1 : 1);
						}
						topv = topv + settings.distance*(dir == 'up' ? 1 : -1);
						bottomv = (dir == 'down');
					}else{
						if(settings.position.search('top') >= 0){
							topv = (Number(popup.outerHeight())*-1)+settings.distance;
							bottomv = false;
						}
						else{
							topv = (Number(trigger.outerHeight()))-settings.distance;
							bottomv = true;
						}
						if(settings.position.search('left') >= 0)
							leftv = (Number(popup.outerWidth())*-1)+20;
						else
							leftv = Number(trigger.outerWidth())-20;
						topv += (toff.top-poff.top);
						leftv += (toff.left-poff.left);
					}
					topv += Number(settings.offTop);
					leftv += Number(settings.offLeft);
					popup.css({
						display: 'block',
						top: topv,
						left: leftv
					}).animate({
						opacity: 1,
						top: (bottomv ? '+' : '-')+'=' + settings.distance + 'px'
					}, settings.effectTime);				
				}
			}).bind(settings.hideOn, function () {
				if (hideDelayTimer) clearTimeout(hideDelayTimer);

				hideDelayTimer = setTimeout(function () {
					hideDelayTimer = null;
					popup.animate({
						top: '-=' + settings.distance + 'px',
						opacity: 0
					}, settings.effectTime, 'swing', function () {
						popup.css('display', 'none');
					});		
				}, settings.hideDelay);
			});
		});
	}
})(jQuery);
