/* * jQuery Tooltip plugin 1.1 * * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/ * */ (function($) { // the tooltip element var helper = {}, // the current tooltipped element current, // the title of the current element, used for restoring title, // timeout id for delayed tooltips tID, // IE 5.5 or 6 IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent), // flag for mouse tracking track = false; $.Tooltip = { blocked: false, defaults: { delay: 200, extraClass: "", top: 15, left: 15 }, block: function() { $.Tooltip.blocked = !$.Tooltip.blocked; } }; $.fn.extend({ showTooltip: function(settings) { settings = $.extend({}, $.Tooltip.defaults, settings); createHelper(); //return this.each(function() { $(this).tSettings = settings; // copy tooltip into its own expando and remove the title this.tooltipText = 'dummy content'; $(this).removeAttr("title"); // also remove alt attribute to prevent default tooltip in IE this.alt = ""; //$(this).click(hide); //$(this).ready(save); save(); <--------------------- this becomes undefined in the save function }, fixPNG: IE ? function() { return this.each(function () { var image = $(this).css('backgroundImage'); if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) { image = RegExp.$1; $(this).css({ 'backgroundImage': 'none', 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')" }).each(function () { var position = $(this).css('position'); if (position != 'absolute' && position != 'relative') $(this).css('position', 'relative'); }); } }); } : function() { return this; }, unfixPNG: IE ? function() { return this.each(function () { $(this).css({'filter': '', backgroundImage: ''}); }); } : function() { return this; }, hideWhenEmpty: function() { return this.each(function() { $(this)[ $(this).html() ? "show" : "hide" ](); }); }, url: function() { return this.attr('href') || this.attr('src'); } }); function createHelper() { // there can be only one tooltip helper if( helper.parent ) return; // create the helper, h3 for title, div for url helper.parent = $('
') // hide it at first .hide() // add to document .appendTo('body'); // apply bgiframe if available if ( $.fn.bgiframe ) helper.parent.bgiframe(); // save references to title and url elements helper.title = $('div.body', helper.parent); } // main event handler to start showing tooltips function handle(event) { // show helper, either with timeout or on instant if( this.tSettings.delay ) tID = setTimeout(show, this.tSettings.delay); else show(); // if selected, update the helper position when the mouse moves track = !!this.tSettings.track; $('body').bind('mousemove', update); // update at least once update(event); } // save elements title before the tooltip is displayed function save() { // if this is the current source, or it has no title (occurs with click event), stop //if ( $.Tooltip.blocked || this == current || !this.tooltipText ) { return; } if ( $.Tooltip.blocked ) { alert('1'); return; } if ( this == current ) { alert('2'); return; } if ( !this.tooltipText ) { alert('3'); return; } // save current current = this; title = this.tooltipText; title = $('#'+this.tSettings.local).html(); helper.title.html(title).show(); // add an optional class for this tip helper.parent.addClass(this.tSettings.extraClass); // fix PNG background for IE if (this.tSettings.fixPNG) helper.parent.fixPNG(); handle.apply(this, arguments); } // delete timeout and show helper function show() { tID = null; helper.parent.show(); update(); } /** * callback for mousemove * updates the helper position * removes itself when no current element */ function update(event) { if($.Tooltip.blocked) return; // stop updating when tracking is disabled and the tooltip is visible if ( !track && helper.parent.is(":visible")) { $('body').unbind('mousemove', update) } // if no current element is available, remove this listener if( current == null ) { $('body').unbind('mousemove', update); return; } var left = helper.parent[0].offsetLeft; var top = helper.parent[0].offsetTop; if(event) { // position the helper 15 pixel to bottom right, starting from mouse position left = event.pageX + current.tSettings.left; top = event.pageY + current.tSettings.top; helper.parent.css({ left: left + 'px', top: top + 'px' }); } var v = viewport(), h = helper.parent[0]; // check horizontal position if(v.x + v.cx < h.offsetLeft + h.offsetWidth) { left -= h.offsetWidth + 20 + current.tSettings.left; helper.parent.css({left: left + 'px'}); } // check vertical position if(v.y + v.cy < h.offsetTop + h.offsetHeight) { top -= h.offsetHeight + 20 + current.tSettings.top; helper.parent.css({top: top + 'px'}); } } function viewport() { return { x: $(window).scrollLeft(), y: $(window).scrollTop(), cx: $(window).width(), cy: $(window).height() }; } // hide helper and restore added classes and the title function hide(event) { if($.Tooltip.blocked) return; // clear timeout if possible if(tID) clearTimeout(tID); // no more current element current = null; helper.parent.hide().removeClass( this.tSettings.extraClass ); if( this.tSettings.fixPNG ) helper.parent.unfixPNG(); } })(jQuery);