/*
	jQuery Version:				jQuery 1.3.2
	Plugin Name:				aToolTip V 1.0
	Plugin by: 					Ara Abcarians: http://ara-abcarians.com
	License:					aToolTip is licensed under a Creative Commons Attribution 3.0 Unported License
								Read more about this license at --> http://creativecommons.org/licenses/by/3.0/			
*/
(function($) {
    $.fn.aToolTip = function(options) {
    
    	// setup default settings
    	var defaults = {
    		clickIt: 		false,
    		closeTipBtn: 	'aToolTipCloseBtn',
    		fixed: 			false,
    		inSpeed: 		400,
    		outSpeed: 		100,
    		tipContent: 	'',
    		toolTipClass: 	'aToolTip',
    		xOffset: 		0,
    		yOffset: 		0,
			pos: 			'ne'
    	},
    
    	// This makes it so the users custom options overrides the default ones
    	settings = $.extend({}, defaults, options);
    
		return this.each(function() {
			var obj = $(this);
			var hash = obj.attr('href');
			
			if(hash != '#' && $(hash).length && $('#'+hash.slice(1)).is(':hidden')) { // Hash must not be just '#' & the object must exist & be hidden
				// set the tooltip content/text to be an html element based on element id and hash
				var contentID = hash.slice(1);
				var tipContent = $('#'+contentID).html();
			} else if(obj.attr('title')) {
				// set the tooltip content/text to be the obj title attribute
				var tipContent = obj.attr('title');	 
			} else {
				// if no title attribute set it to the tipContent option in settings
				var tipContent = settings.tipContent;
			}
			
			// check if obj has a title attribute and if click feature is off
			if(tipContent && !settings.clickIt){	
				// Activate on hover	
				obj.hover(function(el){
					obj.attr({title: ''});						  
					$('body').append("<div class='"+ settings.toolTipClass +"'><span class='nose nose-"+ settings.pos +"'></span><div class='aToolTipContent'>"+ tipContent +"</div></div>");
					switch(settings.pos) {
						case 'ne':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'nw':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - $('.' + settings.toolTipClass).outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'n':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - ($('.' + settings.toolTipClass).outerWidth() - obj.outerWidth())/2 + settings.xOffset) + 'px'
							}
							break;
						case 'e':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - ($('.' + settings.toolTipClass).outerHeight()/2) - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'w':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - ($('.' + settings.toolTipClass).outerHeight()/2) - settings.yOffset) + 'px',
								left: (obj.offset().left - $('.' + settings.toolTipClass).outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'sw':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top + obj.outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - $('.' + settings.toolTipClass).outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'se':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top + obj.outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 's':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top + obj.outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - ($('.' + settings.toolTipClass).outerWidth() - obj.outerWidth())/2 + settings.xOffset) + 'px'
							}
							break;
						default:
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
					};
					$('.' + settings.toolTipClass).css(position)
					.stop().fadeIn(settings.inSpeed);	
			    },
				function(){ 
					// Fade out
					$('.' + settings.toolTipClass).stop().fadeOut(settings.outSpeed, function(){$(this).remove();});
			    });	
		    }
		    
		    // Follow mouse if fixed is false and click is false
		    if(!settings.fixed && !settings.clickIt){
				obj.mousemove(function(el){
					$('.' + settings.toolTipClass).css({
						top: (el.pageY - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset),
						left: (el.pageX + settings.xOffset)
					})
				});			
			} 		    
		    
		    // check if click feature is enabled
		    if(tipContent && settings.clickIt){
				// Activate on click	
				obj.click(function(el) {
					obj.attr({title: ''});
					// Toggle if already being displayed
					if($('.' + settings.toolTipClass).is(':visible')) {
						$('.' + settings.toolTipClass).fadeOut(settings.outSpeed, function(){$(this).remove();});
						return false;
					}
					$('body').append("<div class='"+ settings.toolTipClass +"'><span class='nose nose-"+ settings.pos +"'></span><div class='aToolTipContent'>"+ tipContent +"</div></div>");
					$('.' + settings.toolTipClass).append("<a class='"+ settings.closeTipBtn +"' href='#' alt='close'>close</a>");
					
					switch(settings.pos) {
						case 'ne':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'nw':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - $('.' + settings.toolTipClass).outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'n':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - ($('.' + settings.toolTipClass).outerWidth() - obj.outerWidth())/2 + settings.xOffset) + 'px'
							}
							break;
						case 'e':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - ($('.' + settings.toolTipClass).outerHeight()/2) - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'w':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - ($('.' + settings.toolTipClass).outerHeight()/2) -settings.yOffset) + 'px',
								left: (obj.offset().left - $('.' + settings.toolTipClass).outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'sw':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top + obj.outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - $('.' + settings.toolTipClass).outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 'se':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top + obj.outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
						case 's':
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top + obj.outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left - ($('.' + settings.toolTipClass).outerWidth() - obj.outerWidth())/2 + settings.xOffset) + 'px'
							}
							break;
						default:
							var position = {
								position: 'absolute',
								display: 'none',
								zIndex: '50000',
								top: (obj.offset().top - $('.' + settings.toolTipClass).outerHeight() - settings.yOffset) + 'px',
								left: (obj.offset().left + obj.outerWidth() + settings.xOffset) + 'px'
							}
							break;
					};
					//console.log('.' + settings.toolTipClass+', top: '+position.top+', left: '+position.left+', offset: '+obj.offset().left+', width: '+$('.' + settings.toolTipClass).outerWidth());
					
					$('.' + settings.toolTipClass).css(position)
					.fadeIn(settings.inSpeed);	
					// Click to close tooltip
					$('.' + settings.closeTipBtn).click(function(){
						$('.' + settings.toolTipClass).fadeOut(settings.outSpeed, function(){$(this).remove();});
						return false;
					});
					return false;			
			    });
		    }
		  
		}); // END: return this
		
		// returns the jQuery object to allow for chainability.  
        return this;
    };
})(jQuery);