app/assets/javascripts/jquery.tooltip.js
(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'
};
//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>');
};
}
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+'; position:absolute;z-index:100000000000;"><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;
switch(s.tooltipSource){
case 'attribute':/*/////////////////////////////// attribute //////////////////////////////////////////*/
$ttContent.text(s.titleAttributeContent);
showTooltip();
break;
case 'inline':/*/////////////////////////////// inline //////////////////////////////////////////*/
$ttContent.html($(s.tooltipSourceID).children());
$tt.unload(function(){// move elements back when you're finished
$(s.tooltipSourceID).html($ttContent.children());
});
showTooltip();
break;
case 'ajax':/*/////////////////////////////// ajax //////////////////////////////////////////*/
if(s.tooltipHTTPType == 'post'){
var urlOnly, urlQueryObject;
if(s.tooltipSourceURL.indexOf("?") !== -1){//has a query string
urlOnly = s.windowSourceURL.substr(0, s.windowSourceURL.indexOf("?"));
urlQueryObject = urlQueryToObject(s.tooltipSourceURL);
}else{
urlOnly = s.tooltipSourceURL;
urlQueryObject = {};
}
$ttContent.load(urlOnly,urlQueryObject,function(){
showTooltip();
});
}else{
if(s.tooltipSourceURL.indexOf("?") == -1){ //no query string, so add one
s.tooltipSourceURL += '?';
}
$ttContent.load(
s.tooltipSourceURL + '&random=' + (new Date().getTime()),function(){
showTooltip();
});
}
break;
};
return false;
};
function off(e){
hideTooltip(this);
return false;
};
if(s.followMouse){
$(this).bind("mousemove", function(e){
positionTooltip(e);
return false;
});
}
});
};
})(jQuery);