
(function(jQuery){Math.cot=function(x){return 1/Math.tan(x);}
function degrees_to_radians(deg){return deg*(Math.PI/180);}
function radians_to_degrees(rad){return rad*(180/Math.PI);}
function calculate_opposite_side(adjacent,degrees){return Math.round(Math.tan(degrees_to_radians(degrees))*adjacent);}
function calculate_adjacent_side(opposite,degrees){return Math.round(Math.cot(degrees_to_radians(degrees))*opposite);}
function calculate_degrees_from_sides(adjacent,opposite){return radians_to_degrees(Math.atan(opposite/adjacent));}
jQuery.extend({orbitaltooltip:{version:0.1,defaults:{orbitalPosition:180,tooltipClass:'orbitaltooltip-default-bottom',spacing:5,offset:0,html:'<p>sample text</p>',revealStyle:'fade',orbit:false,orbitInterval:500}}});jQuery.fn.extend({orbitaltooltip:function(options){var options=jQuery.extend({},jQuery.orbitaltooltip.defaults,options);var orbTooltip=this;var uniqueID='orbialtTip_'+this.attr("id");jQuery("body").append(jQuery(document.createElement('div')).html(options.html).addClass(options.tooltipClass).attr("id",uniqueID).css("display","none"));if(options.orbit!=true){var tooltipPosition=calculatePosition(orbTooltip,jQuery("#"+uniqueID),options.orbitalPosition,options.spacing,options.offset);}
var fly_orbit=false;return this.hover(function(e){if(options.orbit==true){alert('orbiting functionality is not currently functioning');}else{position(jQuery("#"+uniqueID),tooltipPosition[0],tooltipPosition[1]);}},function(e){fly_orbit=false;hideTooltip(jQuery("#"+uniqueID));});}});function move_along_orbit(tooltip,tooltipPosition)
{tooltip.fadeOut(50);tooltip.css("position","absolute");tooltip.css("top",tooltipPosition[1]);tooltip.css("left",tooltipPosition[0]);tooltip.fadeIn(50);}
function position_top(element_to_add_tooltip,tooltip,spacing)
{var tooltip_width=tooltip.width();var tooltip_height=tooltip.height();var coordinates=element_to_add_tooltip.offset()
var x=coordinates.left+((element_width/2)-(tooltip_width/2));var y=coordinates.top-tooltip_height;position(tooltip,x,y);}
function get_vertical_padding(element)
{var vertical_padding=parseInt(element.css('padding-top'))+parseInt(element.css('padding-bottom'));vertical_padding=vertical_padding+parseInt(element.css('border-top-width'))+parseInt(element.css('border-bottom-width'));return vertical_padding;}
function get_horizontal_padding(element)
{var horizontal_padding=parseInt(element.css('padding-right'))+parseInt(element.css('padding-left'));horizontal_padding=horizontal_padding+parseInt(element.css('border-right-width'))+parseInt(element.css('border-left-width'));return horizontal_padding;}
function calculatePosition(element_to_add_tooltip,tooltip,orbitalPosition,spacing,offset)
{var position=new Array();var element_center=get_element_center_coordinates(element_to_add_tooltip);var tooltip_center=get_element_center_coordinates(tooltip);if(orbitalPosition>360||orbitalPosition<0){alert('You have misconfigured your orbitalTooltip - please choose from an orbit between 0-360 degrees for the object: #'+orbitalTooltip.attr("id"));position[0]=0;position[1]=0;return position;}
var adjacent=element_to_add_tooltip.height()/2;var opposite=element_to_add_tooltip.width()/2;var angle_to_corner=calculate_degrees_from_sides(adjacent,opposite);var topleft_indegrees=Math.round(360-angle_to_corner);var topright_indegrees=Math.round(angle_to_corner);var bottomright_indegrees=Math.round(180-angle_to_corner);var bottomleft_indegrees=Math.round(180+angle_to_corner);switch(true)
{case((orbitalPosition==0)||(orbitalPosition==360)):position[0]=element_center[0]-Math.round(tooltip.width()/2);position[1]=element_center[1]-Math.round(element_to_add_tooltip.height()/2)-(tooltip.height()+spacing);break;case(orbitalPosition==90):position[0]=element_center[0]+Math.round(element_to_add_tooltip.width()/2)+spacing;position[1]=element_center[1]-Math.round(tooltip.height()/2);break;case(orbitalPosition==180):position[0]=element_center[0]-Math.round(tooltip.width()/2);position[1]=element_center[1]+Math.round(element_to_add_tooltip.height()/2)+spacing;break;case(orbitalPosition==270):position[0]=element_center[0]-Math.round(element_to_add_tooltip.width()/2)-(tooltip.width()+spacing);position[1]=element_center[1]-Math.round(tooltip.height()/2);break;case(((orbitalPosition>=topleft_indegrees)&&(orbitalPosition<360))||(orbitalPosition<topright_indegrees)):if(orbitalPosition>=topleft_indegrees){degrees_from_bisector=360-orbitalPosition;var tt_shift=1-calculate_opposite_side((element_to_add_tooltip.height()/2),degrees_from_bisector);tt_shift=tt_shift-calculate_opposite_side((tooltip.height()/2),degrees_from_bisector);}
if(orbitalPosition<topright_indegrees){degrees_from_bisector=orbitalPosition;var tt_shift=calculate_opposite_side((element_to_add_tooltip.height()/2),degrees_from_bisector);tt_shift=tt_shift+calculate_opposite_side((tooltip.height()/2),degrees_from_bisector);}
position[0]=element_center[0]+offset+tt_shift-Math.round(tooltip.width()/2);position[1]=element_center[1]-Math.round(element_to_add_tooltip.height()/2)-(tooltip.height()+spacing);break;case((orbitalPosition>=topright_indegrees)&&(orbitalPosition<bottomright_indegrees)):if(orbitalPosition<90){degrees_from_bisector=90-orbitalPosition;var tt_shift=1-calculate_opposite_side((element_to_add_tooltip.width()/2),degrees_from_bisector);}else{degrees_from_bisector=orbitalPosition-90;var tt_shift=calculate_opposite_side((element_to_add_tooltip.width()/2),degrees_from_bisector);}
position[0]=element_center[0]+Math.round(element_to_add_tooltip.width()/2)+spacing;position[1]=element_center[1]+offset+tt_shift-Math.round(tooltip.height()/2);break;case((orbitalPosition>=bottomright_indegrees)&&(orbitalPosition<bottomleft_indegrees)):if(orbitalPosition<180){degrees_from_bisector=180-orbitalPosition;var tt_shift=calculate_opposite_side((element_to_add_tooltip.height()/2),degrees_from_bisector);}else{degrees_from_bisector=orbitalPosition-180;var tt_shift=1-calculate_opposite_side((element_to_add_tooltip.height()/2),degrees_from_bisector);}
position[0]=element_center[0]+offset+tt_shift-Math.round(tooltip.width()/2);position[1]=element_center[1]+Math.round(element_to_add_tooltip.height()/2)+spacing;break;case((orbitalPosition>=bottomleft_indegrees)&&(orbitalPosition<topleft_indegrees)):if(orbitalPosition<270){degrees_from_bisector=270-orbitalPosition;var tt_shift=calculate_opposite_side((element_to_add_tooltip.width()/2),degrees_from_bisector);}else{degrees_from_bisector=orbitalPosition-270;var tt_shift=1-calculate_opposite_side((element_to_add_tooltip.width()/2),degrees_from_bisector);}
position[0]=element_center[0]-Math.round(element_to_add_tooltip.width()/2)-(tooltip.width()+spacing);position[1]=element_center[1]+offset+tt_shift-Math.round(tooltip.height()/2);break;}
return position;}
function position(element,x,y)
{element.stop(true,true);element.css("position","absolute");element.css("top",y);element.css("left",x);revealTooltip(element);}
function get_element_center_coordinates(element)
{var center_of_element=new Array();var element_top_left_coords=element.offset()
center_of_element[0]=element_top_left_coords.left+Math.round((element.width()+get_horizontal_padding(element))/2);center_of_element[1]=element_top_left_coords.top+Math.round((element.height()+get_vertical_padding(element))/2);return center_of_element;}
function revealTooltip(tooltip)
{tooltip.fadeIn(200);}
function hideTooltip(tooltip)
{tooltip.fadeOut(200);}})(jQuery);