PSBalloon = function ( parent )
{
	var balloon = jQuery('<table id="balloon"/>');
	var balloonTop = jQuery('<tr id="balloonTop"/>');
	var balloonTopLeftCorner = jQuery('<td id="balloonTopLeftCorner"/>');
	var balloonTopEdge = jQuery('<td id="balloonTopEdge"/>');
	var balloonTopStalk = jQuery('<span id="balloonTopStalk"/>').appendTo(balloonTopEdge);	
	var balloonTopRightCorner = jQuery('<td id="balloonTopRightCorner"/>');
	jQuery( [balloonTopLeftCorner, balloonTopEdge, balloonTopRightCorner] ).appendTo(balloonTop);
	var balloonMiddle = jQuery('<tr id="balloonMiddle"/>');
	var balloonMiddleLeftEdge = jQuery('<td id="balloonMiddleLeftEdge"/>');
	var balloonMiddleBody = jQuery('<td id="balloonMiddleBody"/>');
	var balloonMiddleRightEdge = jQuery('<td id="balloonMiddleRightEdge"/>');
	jQuery( [balloonMiddleLeftEdge, balloonMiddleBody, balloonMiddleRightEdge] ).appendTo(balloonMiddle);
	var balloonBottom = jQuery('<tr id="balloonBottom"/>');		
	var balloonBottomLeftCorner = jQuery('<td id="balloonBottomLeftCorner"/>');
	var balloonBottomEdge = jQuery('<td id="balloonBottomEdge"/>');
	var balloonBottomStalk = jQuery('<span id="balloonBottomStalk"/>').appendTo(balloonBottomEdge);
	var balloonBottomRightCorner = jQuery('<td id="balloonBottomRightCorner"/>');
	jQuery( [balloonBottomLeftCorner, balloonBottomEdge, balloonBottomRightCorner] ).appendTo(balloonBottom);
	jQuery( [balloonTop, balloonMiddle, balloonBottom] ).appendTo(balloon);
	jQuery( parent ).prepend(balloon);
	jQuery( [balloonTopStalk, balloonBottomStalk, balloon] ).each(function(){this.hide()});
	this.balloon = balloon;
	this.body = balloonMiddleBody;
	this.topStalk = balloonTopStalk;
	this.bottomStalk = balloonBottomStalk;
}

PSBalloon.prototype.showUp = function ( pos, body )
{
	var psb = this;
	psb.setBalloonPosition_(pos);
	psb.body.html(body);
	psb.balloon.show();	
	psb.bottomStalk.show();
	psb.correctBalloonPosition_(pos);
}

PSBalloon.prototype.showDown = function ( pos, body )
{
	var psb = this;
	psb.setBalloonPosition_(pos);
	psb.body.html(body);
	psb.balloon.show();
	psb.topStalk.show();
	psb.correctBalloonPosition_(pos);
}

PSBalloon.prototype.hide = function ()
{
	var psb = this;
	psb.balloon.hide();
	psb.bottomStalk.hide();
	psb.topStalk.hide();
}

PSBalloon.prototype.setBalloonPosition_ = function ( pos )
{
	var psb = this;
	psb.balloon.css({'left':'','right':'','top':'','bottom':''});
	psb.topStalk.css('marginLeft','');
	psb.bottomStalk.css('marginLeft','');
	if ( pos.left )
		psb.balloon.css('left',pos.left);
	else if ( pos.right )
		psb.balloon.css('right',pos.right);
	if ( pos.top )
		psb.balloon.css('top',pos.top);
	else if ( pos.bottom )
		psb.balloon.css('bottom',pos.bottom);
}

PSBalloon.prototype.correctBalloonPosition_ = function ( pos )
{
	var psb = this;
	var offset = psb.balloon.offset();	
	var diff = jQuery(window).width() - offset.left - psb.balloon.width();
	if ( diff < 0 )
	{
		if ( pos.left )
			psb.balloon.css('left',pos.left+diff);
		else if ( pos.right )
			psb.balloon.css('right',pos.right-diff);
		if ( psb.topStalk.is(':visible') )
			psb.topStalk.css('marginLeft',-diff);
		else if ( psb.bottomStalk.is(':visible') )
			psb.bottomStalk.css('marginLeft',-diff);
	}
}