/**
 * 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="opacity: 0; top: -120px; left: -33px; 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', opts.bubbleImagesPath  + '/bubble-tail2.png');
	    if (opts.msieFix)
	    {
		     if ($.browser.msie)
		     {
		      jQuery('.popup td.topleft').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-1.gif)');
		      jQuery('.popup td.top').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-2.gif)');
		      jQuery('.popup td.topright').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-3.gif)');
		      jQuery('.popup td.left').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-4.gif)');
		      jQuery('.popup td.right').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-5.gif)');
		      jQuery('.popup td.bottomleft').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-6.gif)');
		      jQuery('.popup td.bottom').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-7.gif)');
		      jQuery('.popup td.bottomright').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-8.gif)');
		      jQuery('.popup td.bottom img').attr('src', opts.bubbleImagesPath  + '/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: -100,
	          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();
	  	}
	  });
}