(function(window,$) {
	$.fn.popup = function(options) {
		var opts 	= $.extend({}, $.fn.popup.defaults, options);
		return this.each(function() {
			var $this 	= $(this);
			var o 		= $.meta ? $.extend({}, opts, $this.data()) : opts;
			var oldZIndex = 1;
			$this.hover(
				function(e){
					var $this 			= $(this);
					if(!active) return;
					var $popup 			= $('.popup',$this);
					var $popupParent	= $popup.parent();
					oldZIndex 			= $popupParent.css('zIndex');
					$popupParent.css('zIndex','50000');
					var PopupPositions	= $.fn.popup.calculatePopupPositions($this);
					$popup.css({
						left		: (PopupPositions.left 	+ 'px'),
						top			: (PopupPositions.top	+ 'px')
					});
					var P				= function(){
						$popup.show()
					};
					clearTimeout(popuptime);
					popuptime = setTimeout(P,o.time);		
				},
				function(e){
					var $this = $(this);
					clearTimeout(popuptime);
					$('.popup',$this).hide().parent().css('zIndex',oldZIndex);
				}
			);
			$this.find('a').live('click',function(e){
				var $this 	= $(this);
				$this.parents('.bubbleInfo')
					 .css('zIndex',oldZIndex)
					 .find('.popup')
					 .hide();
				active 		= false;
				var A 		= function(){
					active=true;
				}
				setTimeout(A,100);			
			});
		});	
	};
	var popuptime;
	var active=true;
	$.fn.popup.defaults 				= {
		onComplete	: function(){return false;},
		time  		: 800
	};
	/*
	gets the current viewport width and height
	*/
	$.fn.popup.getWindowSize			=	function (){
		var WindowSize = {
			width	: window.width(),
			height	: window.height()
		};
		return WindowSize;
	};
	/*
	calculates left and top for the popup to be displayed, based on the viewport width and height
	*/
	$.fn.popup.calculatePopupPositions	=	function ($bubble){
		var WindowSize 	= $.fn.popup.getWindowSize();
		
		/* some important variables */
		var $popup				= $('.popup',$bubble);
		var bubblePaddingLeft 	= parseInt($bubble.css("padding-left"), 10);
		var bubblePaddingRight 	= parseInt($bubble.css("padding-right"), 10);
		var bubblePaddingTop 	= parseInt($bubble.css("padding-top"), 10);
		var bubblePaddingBottom	= parseInt($bubble.css("padding-bottom"), 10);
		
		var popupPaddingLeft	= parseInt($popup.css("padding-left"), 10);
		var popupPaddingRight	= parseInt($popup.css("padding-right"), 10);
		var popupPaddingTop		= parseInt($popup.css("padding-top"), 10);
		var popupPaddingBottom	= parseInt($popup.css("padding-bottom"), 10);
		
		/* defaults sould be: */
		var popupL				= parseFloat($bubble.css('width'),10);
		var popupT				= 0;
		
		/* if final left+width of popup exceeds window width then popup should be placed on the left side */
		var $bubbleOffsetLeft	= $bubble.offset().left - window.scrollLeft();
		var popupWidth			= $popup.width();
		
		if($bubbleOffsetLeft + popupL + popupWidth  >  WindowSize.width)
			popupL		= 0 - popupWidth - bubblePaddingLeft - popupPaddingLeft;
		
		/* if final top+height of popup exceeds window height then popup should be adjusted to fit the window */
		var $bubbleOffsetTop	= $bubble.offset().top - window.scrollTop(); 
		var popupHeight			= $popup.height();
		
		/* cases: 
			1) when popup would be hidden on top of viewport 
			2) when popup would be hidden on bottom of viewport 
		*/
		if($bubbleOffsetTop<0){				
			popupT = 0 - $bubbleOffsetTop;
		}
		else if($bubbleOffsetTop + popupHeight  >  WindowSize.height){
			var diff = $bubbleOffsetTop + popupHeight - WindowSize.height;
			popupT = 0 - diff - (popupPaddingTop+popupPaddingBottom+bubblePaddingTop);	
		}
		
		/* new popup positions */
		var PopupPositions = {
			left	: popupL,
			top		: popupT
		};
		
		return PopupPositions;
	};
	
})(jQuery( window ), jQuery);
