/** * CodaBubble extension for jQuery library * * Creates tooltips "coda bubble" style * * @author Carlo Tasca * @version 1.0 * * OPTIONS: * * @param {array} distances Distances of bubbles from their triggers  * @param {array} leftShifts Left positions of bubbles * @param {array} bubbleTimes Life times for bubbles * @param {array} hideDelays Hide delay times for bubbles * @param {array} bubbleWidths Hide delay times for bubbles * @param {string} bubbleImagesPath Path to skin for bubbles * @param {boolean} msieFix Fix for IE png rendering. Replaces pngs with gifs if true (default) * @param {boolean} msiePop If false removes bubble in IE */jQuery.fn.codaBubble = function(opts){

				var bubble = this;

				opts = jQuery.extend({

							distances : [20],

							leftShifts : [30],

							bubbleTimes : [400],

							hideDelays : [0],

							bubbleWidths : [200],

							bubbleImagesPath : "",

							msieFix : true,	

							msiePop : true	},opts||{});

				function bubbleHtmlWrapper(bubbleHtml) {

					return '<table class="popup" style="display: none;"><tr><td class="corner topleft"/><td class="top"/><td class="corner topright"/></tr><tr><td class="left"/><td class="bubble_content">' +  bubbleHtml  + '</td><td class="right"/></tr><tr><td class="corner bottomleft"/><td class="bottom"><img style="display:block;" width="30" height="29" alt="" /></td><td class="corner bottomright"/></tr></table>';} 

					return jQuery(bubble).each(function (i) {

							var bubbleHtml = jQuery('.bubble_html', this).html();

							jQuery('.bubble_html', this).hide().after(bubbleHtmlWrapper(bubbleHtml));

							jQuery('.popup td.bottom img', this).attr('src', 'images/bubble-tail2.png');

							if (opts.msieFix) {	

								if ($.browser.msie) {

									jQuery('.popup td.topleft').css('background', 'url(images/bubble-1.gif)');

									jQuery('.popup td.top').css('background', 'url(images/bubble-2.gif)');	

									jQuery('.popup td.topright').css('background', 'url(images/bubble-3.gif)');	

									jQuery('.popup td.left').css('background', 'url(images/bubble-4.gif)');

									jQuery('.popup td.right').css('background', 'url(images/bubble-5.gif)');	

									jQuery('.popup td.bottomleft').css('background', 'url(images/bubble-6.gif)');

									jQuery('.popup td.bottom').css('background', 'url(images/bubble-7.gif)');

									jQuery('.popup td.bottomright').css('background', 'url(images/bubble-8.gif)');

									jQuery('.popup td.bottom img').attr('src', 'images/bubble-tail2.gif');}	    }

									var distance = opts.distances[i];

									var time = opts.bubbleTimes[i];	

									var hideDelay = opts.hideDelays[i];	

									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 () {

														jQuery(popup).css("width", opts.bubbleWidths[i] + "px");

														var triggerWidth = jQuery(trigger.get(0)).css('width');	

														if (hideDelayTimer) clearTimeout(hideDelayTimer);

														if (beingShown || shown) {

															return;	} else {

																beingShown = true;	

																popup.css({	top: opts.TopShifts[i],

																		  left: opts.leftShifts[i],

																		  display: 'block'}) .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');});}, hideDelay);});

									if (!opts.msiePop && $.browser.msie){jQuery(popup).remove();}});}

