(function($){

	$.fn.tooltip = function(instanceSettings){
		
		$.fn.tooltip.defaultsSettings = {
			attributeName:'title',
			borderColor:'#ccc',
			borderSize:'1',
			cancelClick:0,
			followMouse:1,
			height:'auto',
			hoverIntent:{sensitivity:7,interval:100,timeout:0},
			loader:0,
			loaderHeight:0,
			loaderImagePath:'',
			loaderWidth:0,
			positionTop: 12,
			positionLeft: 12,
			width:'auto',
			titleAttributeContent:'',
			tooltipBGColor:'#fff',
			tooltipBGImage:'none', // http path
			tooltipHTTPType:'get',
			tooltipPadding:10,
			tooltipSource:'attribute', //inline, ajax, iframe, attribute
			tooltipSourceID:'',
			tooltipSourceURL:'',
			tooltipID: 'tooltip',
			borderRadius: '10px'
		};
		
		//s = settings
		var s = $.extend({}, $.fn.tooltip.defaultsSettings , instanceSettings || {});
		
		var positionTooltip = function(e){
			
			var posx = 0;
			var posy = 0;
			if (!e) var e = window.event;
			if (e.pageX || e.pageY) 	{
				posx = e.pageX;
				posy = e.pageY;
			}
			else if (e.clientX || e.clientY) 	{
				posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
				posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
			}
			
			var p = {
				x: posx + s.positionLeft, 
				y: posy + s.positionTop,
				w: $('#'+s.tooltipID).width(), 
				h: $('#'+s.tooltipID).height()
			}
			
			var v = {
				x: $(window).scrollLeft(),
				y: $(window).scrollTop(),
				w: $(window).width() - 20,
				h: $(window).height() - 20
			};
				
			//don't go off screen
			if(p.y + p.h > v.y + v.h && p.x + p.w > v.x + v.w){
				p.x = (p.x - p.w) - 45;
				p.y = (p.y - p.h) - 45;
			}else if(p.x + p.w > v.x + v.w){
				p.x = p.x - (((p.x+p.w)-(v.x+v.w)) + 20);
			}else if(p.y + p.h > v.y + v.h){
				p.y = p.y - (((p.y+p.h)-(v.y+v.h)) + 20);
			}
			
			$('#'+s.tooltipID).css({'left':p.x + 'px','top':p.y + 'px'});
		}
		
		var showTooltip = function(){
			$('#tooltipLoader').remove();
			$('#'+s.tooltipID+' #tooltipContent').show();
			
			if($.browser.version == '6.0'){//IE6 only
				$('#'+s.tooltipID).append('<iframe id="tooltipIE6FixIframe" style="width:'+($('#'+s.tooltipID).width()+parseFloat(s.borderSize)+parseFloat(s.borderSize)+20)+'px;height:'+($('#'+s.tooltipID).height()+parseFloat(s.borderSize)+parseFloat(s.borderSize)+20)+'px;position:absolute;top:-'+s.borderSize+'px;left:-'+s.borderSize+'px;filter:alpha(opacity=0);"src="blank.html"></iframe>');
			};
			$('#' + s.tooltipID + ' #tooltipContent').on('click', function () {

			});
		}
		
		var hideTooltip = function(valueOfThis){
			$('#'+s.tooltipID).fadeOut('fast').trigger("unload").remove();
			if($(valueOfThis).filter('[title]')){
				$(valueOfThis).attr('title',s.titleAttributeContent);
			}
		}
		
		var urlQueryToObject = function(s){
			  var query = {};
			  s.replace(/b([^&=]*)=([^&=]*)b/g, function (m, a, d) {
				if (typeof query[a] != 'undefined') {
				  query[a] += ',' + d;
				} else {
				  query[a] = d;
				}
			  });
			  return query;
		};
		
		return this.each(function(index){
			
			if(s.cancelClick){
				$(this).bind("click", function(){return false});
			}
			
			if($.fn.hoverIntent){
				$(this).hoverIntent({
					sensitivity:s.hoverIntent.sensitivity,
					interval:s.hoverIntent.interval,
					over:on,
					timeout:s.hoverIntent.timeout,
					out:off
				});
			}else{
				$(this).hover(on,off);
			}
					  
			function on(e){	
			    $('body').append('<div id="'+s.tooltipID+'" style="background-repeat:no-repeat;background-image:url('+s.tooltipBGImage+');padding:'+s.tooltipPadding+'px;display:none;height:'+s.height+';width:'+s.width+';background-color:'+s.tooltipBGColor+';border:'+s.borderSize+'px solid '+s.borderColor+'; border-radius:'+s.borderRadius+'; position:absolute;z-index:100000000000; font-size: 12px;"><div id="tooltipContent" style="display:none;"></div></div>');
				
				var $tt = $('#'+s.tooltipID);
				var $ttContent = $('#'+s.tooltipID+' #tooltipContent');
				
				if(s.loader && s.loaderImagePath != ''){
					$tt.append('<div id="tooltipLoader" style="width:'+s.loaderWidth+'px;height:'+s.loaderHeight+'px;"><img src="'+s.loaderImagePath+'" /></div>');	
				}
				
				if($(this).attr('title')){
					s.titleAttributeContent = $(this).attr('title');
					$(this).attr('title','');
				}
				
				if($(this).is('input')){
					$(this).focus(function(){ hideTooltip(this); });
				}
				
				e.preventDefault();//stop
				positionTooltip(e);
				
				$tt.show();
				
				//get values from element clicked, or assume its passed as an option
				s.tooltipSourceID = $(this).attr('href') || s.tooltipSourceID;
				s.tooltipSourceURL = $(this).attr('href') || s.tooltipSourceURL;
				
						$ttContent.html($(s.tooltipSourceID).children());
						$tt.unload(function(){// move elements back when you're finished
							$(s.tooltipSourceID).html($ttContent.children());				
						});
						showTooltip();
					
				return false;
				
			};
			
			
			function off(e){
				hideTooltip(this);
				return false;
			};
			
			if(s.followMouse){
				$(this).bind("mousemove", function(e){
					positionTooltip(e);
					return false;
				});
			}
			
		});
	};
	
})(jQuery);