/** Helps with basic tab functionality.
 * Joshua Logsdon
 * Licensed under the MIT License: http://en.wikipedia.org/wiki/MIT_License
 * Requires: jQuery v1.3+
 */
// Avoid collisions
;if(window.jQuery) (function($) {
	
	// plugin definition
	$.fn.logsdon_tooltip = function(options)
	{
		// Extend our default options with those provided.
		// Note that the first arg to extend is an empty object -
		// this is to keep from overriding our "defaults" object.
		var opts = $.extend({}, $.fn.logsdon_tooltip.defaults, options);
		
		// Other way of extending default options without needing properties
		//var config = {'foo': 'bar'};
		//if (settings) $.extend(config, settings);
		
		var outer_id = 'logsdon_tooltip_outer';
		var inner_id = 'logsdon_tooltip_inner';
		
		// Insert tooltip (hidden).
		if ( $('#'+ outer_id).length == 0 )
		{
			$('body').append('<div id="'+ outer_id +'"><div id="'+ inner_id +'"></div></div>');
		}
		
		// Empty variables.
		var $tooltip_title, $tooltip_alt;
		var $tooltip = $('#'+ outer_id);
		var $tooltip_i = $('#'+ inner_id);
		var $tooltip_trigger;
		
		// Plugin code
		this.each(function()
		{
			var $trigger = $(this);
			
			var hover_out_handler = (opts.tooltip_click_close) ? null : hover_out;
			
			// Watch for hover.
			$trigger.hover( hover_in, hover_out_handler );
		
			if ( opts.mousemove )
			{
				// Watch for mouse movement.
				$trigger.mousemove(function(event)
				{
					movetip(event);
				});
			}
			
			return;
		});
		
		if ( opts.tooltip_click_close )
		{
			$tooltip.click(function(event)
			{
				hover_out(event);
			});
		}
		
		function hover_in(event)
		{
			var $trigger = $(event.target);
			$tooltip_trigger = $trigger;
			
			if ( opts.swap_attributes )
			{
				// Store title, empty it.
				if ( $trigger.attr('title') )
				{
					$tooltip_title = $trigger.attr('title');
					$trigger.attr('title', '');
				}
				
				// Store alt, empty it.
				if ( $trigger.attr('alt') )
				{
					$tooltip_alt = $trigger.attr('alt');
					$trigger.attr('alt', '');
				}
			}
			
			if ( opts.open_callback )
			{
				if ( opts.open_callback(event) == false )
				{
					return;
				}
			}
			
			// Insert text.
			$tooltip_i.html($tooltip_title);
			
			// Show tooltip.
			$tooltip.show();
			
			movetip(event);
			
			return;
		}
		
		function hover_out(event)
		{
			var $trigger = $tooltip_trigger;//$(event.target);
			
			// Hide tooltip.
			$tooltip.hide();
	
			// Empty text.
			$tooltip_i.html('');
			
			if ( opts.swap_attributes )
			{
				// Fix title.
				if ( $tooltip_title )
				{
					$trigger.attr('title', $tooltip_title);
				}
		
				// Fix alt.
				if ( $tooltip_alt )
				{
					$trigger.attr('alt', $tooltip_alt);
				}
			}
			
			if ( opts.close_callback )
			{
				opts.close_callback(event);
			}
			
			return;
		}
		
		function movetip(event)
		{
			// Event coordinates.
			var mouse_x = event.pageX;
			var mouse_y = event.pageY;
			var cursor_height = 22;
			var cursor_width = 15;
	
			// Tooltip coordinates.
			var tooltip_width = $tooltip.outerWidth();
			var tooltip_height = $tooltip.outerHeight();
	
			// Body coordinates.
			var body_width = $('body').outerWidth();
			var body_height = $('body').outerHeight();
			
			var $trigger = $tooltip_trigger;//$(event.target);
			var trigger_height = $trigger.outerHeight();
			var trigger_width = $trigger.outerWidth();
			var trigger_offset = $trigger.offset();
			
			var new_pos = {
				'top': 0,
				'left': 0,
				'bottom': 0,
				'right': 0
			};
			
			// Update x,y or left,top top left corner parameters
			if ( opts.position == 't' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y - tooltip_height - opts.offset;
					new_pos.left = mouse_x - ( (tooltip_width / 2) );
				}
				else
				{
					new_pos.top = trigger_offset.top - tooltip_height - opts.offset;
					new_pos.left = trigger_offset.left + ( (trigger_width / 2) - (tooltip_width / 2) ) + opts.offset;
				}
			}
			else if ( opts.position == 'b' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y + cursor_height + opts.offset;
					new_pos.left = mouse_x - ( (tooltip_width / 2) );
				}
				else
				{
					new_pos.top = trigger_offset.top + trigger_height + opts.offset;
					new_pos.left = trigger_offset.left + ( (trigger_width / 2) - (tooltip_width / 2) ) + opts.offset;
				}
			}
			else if ( opts.position == 'tr' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y - tooltip_height - opts.offset;
					new_pos.left = mouse_x + cursor_width + opts.offset;
					//'top': mouse_y + tooltip_height > body_height ? mouse_y - tooltip_height : mouse_y,
					//'left': mouse_x + tooltip_width + 20 > body_width ? mouse_x - tooltip_width - 10 : mouse_x + 15
				}
				else
				{
					new_pos.top = trigger_offset.top - tooltip_height - opts.offset;
					new_pos.left = trigger_offset.left + trigger_width + opts.offset;
				}
			}
			else if ( opts.position == 'br' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y + opts.offset;
					new_pos.left = mouse_x + cursor_width + opts.offset;
				}
				else
				{
					new_pos.top = trigger_offset.top + trigger_height + opts.offset;
					new_pos.left = trigger_offset.left + trigger_width + opts.offset;
				}
			}
			else if ( opts.position == 'r' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y - ( (tooltip_height / 2) ) - opts.offset;
					new_pos.left = mouse_x + cursor_width + opts.offset;
				}
				else
				{
					new_pos.top = trigger_offset.top - ( (tooltip_height / 2) - (trigger_height / 2) );
					new_pos.left = trigger_offset.left + trigger_width + opts.offset;
				}
			}
			else if ( opts.position == 'l' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y - ( (tooltip_height / 2) ) - opts.offset;
					new_pos.left = mouse_x - tooltip_width - opts.offset;
				}
				else
				{
					new_pos.top = trigger_offset.top - ( (tooltip_height / 2) - (trigger_height / 2) );
					new_pos.left = trigger_offset.left - tooltip_width - opts.offset;
				}
			}
			else if ( opts.position == 'tl' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y - tooltip_height - opts.offset;
					new_pos.left = mouse_x - tooltip_width - opts.offset;
				}
				else
				{
					new_pos.top = trigger_offset.top - tooltip_height - opts.offset;
					new_pos.left = trigger_offset.left - tooltip_width - opts.offset;
				}
			}
			else if ( opts.position == 'bl' )
			{
				if ( opts.mouse_position )
				{
					new_pos.top = mouse_y + opts.offset;
					new_pos.left = mouse_x - tooltip_width - opts.offset;
				}
				else
				{
					new_pos.top = trigger_offset.top + trigger_height + opts.offset;
					new_pos.left = trigger_offset.left - tooltip_width - opts.offset;
				}
			}
			
			// Update right,bottom bottom right corner parameters
			new_pos.bottom = new_pos.top + tooltip_height;
			new_pos.right = new_pos.left + tooltip_width;
			
			// Constrain position within page
			if ( new_pos.top < 0 )
			{
				// Position to bottom of trigger
				new_pos.top = trigger_offset.top + trigger_height + opts.offset;
				new_pos.bottom = new_pos.top + tooltip_height;
			}
			if ( new_pos.bottom > body_height )
			{
				// Position to top of trigger
				new_pos.top = trigger_offset.top - tooltip_height - opts.offset;
				new_pos.bottom = new_pos.top + tooltip_height;
			}
			if ( new_pos.left < 0 )
			{
				// Position to right of trigger
				new_pos.left = trigger_offset.left + trigger_width + opts.offset;
				new_pos.right = new_pos.left + tooltip_width;
			}
			if ( new_pos.right > body_width )
			{
				// Position to left of trigger
				new_pos.left = trigger_offset.left - trigger_width - opts.offset;
				new_pos.right = new_pos.left + tooltip_width;
			}
			
			// Update tooltip position css
			$tooltip.css({
				'top': new_pos.top,
				'left': new_pos.left
			});
			
			return;
		}
	
		return this;
	};
	
	// plugin defaults - added as a property on our plugin function
	$.fn.logsdon_tooltip.defaults = {
		'tooltip_click_close': false,
		'mousemove': false,
		'offset' : 0,
		'position': 'tr',
		'mouse_position': false,
		'open_callback': null,
		'close_callback': null,
		'swap_attributes': true
	};
	
	/*
	// Default implementation
	$(document).ready(function() {
		$('.tooltip').logsdon_tooltip();
	});
	
	<span class="tooltip" title="This is my title. There are many like it, but
	this one is mine. You will see it as you hover your mouse over me.">
	Mouse over me to read my title in a tooltip!</span>
	*/
	
// Avoid collisions
})(jQuery);