/* 
 * Based on Julien Guimont's (http://jguimont.com/) jquery-popover
 * from:  https://github.com/juggy/jquery-popover 
 */

(function($) {
	$.fn.popover = function(options) {

		var defaults = {
			openEvent : function(){},
			closeEvent : null
		}
		var options = $.extend(defaults, options);
		
		var popoverbox = $(
				'<div class="popover">' + '<div class="triangle"></div>'
						+ '<div class="content"></div>' + '</div>').appendTo(
				'#content');

		// Document click closes active popover
		$.fn.popover.openedPopup = null;
		$('body')
				.click(function(event) {
						if ($.fn.popover.openedPopup != null
							&& ($(event.target).parents(".popover").length === 0)
							&& (!$(event.target).hasClass('popover-button'))) {
								
								$.fn.popover.openedPopup.trigger('hidePopover');
						}
					});

		var showPopover = function(button) {
			var url = button.attr("url");
			var annualPrice = button.attr("annualPrice");
			var quarterlyPrice = button.attr("quarterlyPrice");
			var yearSub = button.attr("yearSub");
			var quarterlySub = button.attr("quarterlySub");
			
			// Already opened?
			if ($.fn.popover.openedPopup === button) {
				
				$.fn.popover.openedPopup.trigger('hidePopover');
				return false;
			} else if ($.fn.popover.openedPopup != null) {
				/* Need to hide (rather than fade) the open popover 
				 * if another gets opened. 
				 */
				popoverbox.hide();
				$.fn.popover.openedPopup.trigger('hidePopover');
			}
			var triangle = $('.triangle', popoverbox).click(function() {
				button.trigger('hidePopover')
			});

			// position and resize
			var leftOff = 0;
			var topOff = 0;
			var docWidth = $(document).width();
			var triangleSize = parseInt(triangle.css("border-bottom-width"));
			var contentWidth = popoverbox.outerWidth();
			var buttonWidth = button.outerWidth();
			var buttonHeight = button.outerHeight()
			var offset = button.offset();
			
			// Calculate topOff
			topOff = offset.top + buttonHeight + triangleSize;
			
			// Padding against document borders
			var padding = 18;

			// Calculate leftOff
			leftOff = offset.left + (buttonWidth - contentWidth) / 2;
			var diffWidth = 0;
			if (leftOff < padding) {
				// out of the document at left
				diffWidth = leftOff - padding;
			} else if (leftOff + contentWidth > docWidth) {
				// left of the screen right
				diffWidth = leftOff + contentWidth - docWidth + padding;
			}

			// position triangle
			triangle.css("left", contentWidth / 2 - triangleSize + diffWidth);
			
			popoverbox.css("top", topOff);
			popoverbox.css("left", (leftOff - diffWidth));

			$(".popover > .content").replaceWith('<div class="content">'
											+ '<div class="link">'
											+ '<a href="' + url + '&type=a">' 
											+ yearSub 
											+ '</a>'
											+ '</div>'
											+ '<div class="price">' + annualPrice + '</div>'
											+ '<br>'
											+ '<div class="link">'
											+ '<a href="' + url + '&type=q">'
											+ quarterlySub 
											+ '</a>'
											+ '</div>'
											+ '<div class="price">' + quarterlyPrice + '</div>'
											+ '</div>');
			
			/* Mild browser dependence. IE doesn't fade properly. */
			if($.browser.msie)
			{
				popoverbox.show()
			}
			else {
				popoverbox.fadeIn("fast");
			}
			
			// Moves the browser to display the popover,
			// animated scroll.
			var gapVal = (($(window).scrollTop() + $(window).height()) - topOff);
			
			// adding 20px of space.
			var moveVal = ((($(window).scrollTop() + popoverbox.outerHeight()) - gapVal) + 20);

			if (topOff + popoverbox.outerHeight() >= $(window).scrollTop() + $(window).height())
			{
				$("html,body").animate({ scrollTop: moveVal}, "fast" );
			}
			
			if ($.isFunction(options.openEvent))
				options.openEvent();
			$.fn.popover.openedPopup = button;
			button.addClass('popover-on');
			return false;
		}

		this.each(function() {
			var button = $(this);
			button.addClass("popover-button");
			button.click(function() {
				showPopover(button)
				
			});
			
			button.bind('showPopover', function() {
				showPopover(button)
			});
			
			button.bind('hidePopover', function() {
				
				/* Fade issues. */
				if($.browser.msie)
				{
					popoverbox.hide();
				}
				else
				{
					popoverbox.fadeOut("slow");
				}
				
				button.removeClass('popover-on');
				
				if ($.isFunction(options.closeEvent))
					options.closeEvent();
				$.fn.popover.openedPopup = null;
				return false;
			});
		});
	}
})(jQuery);

