/**
	* 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: -100px; 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="25" 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));
		var img_type = 'png';
		if(opts.msieFix) {
			if(jQ.browser.msie) {
				img_type = 'gif';
			}
		}
		jQuery('.popup td.topleft').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-1.'+ img_type+')');
		jQuery('.popup td.top').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-2.'+ img_type+')');
		jQuery('.popup td.topright').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-3.'+ img_type+')');
		jQuery('.popup td.left').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-4.'+ img_type+')');
		jQuery('.popup td.right').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-5.'+ img_type+')');
		jQuery('.popup td.bottomleft').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-6.'+ img_type+')');
		jQuery('.popup td.bottom').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-7.'+ img_type+')');
		jQuery('.popup td.bottomright').css('background-image', 'url(' + opts.bubbleImagesPath  + '/bubble-8.'+ img_type+')');
		jQuery('.popup td.bottom img').attr('src', opts.bubbleImagesPath  + '/bubble-tail2.'+ img_type);
		var distance = opts.distances[i];
		var calcHeight = -70 + distance;
		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: calcHeight, 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 && jQ.browser.msie) {
			jQuery(popup).remove();
		}
	});
}

