[6286] | 1 | /* |
---|
| 2 | * jQuery Tooltip plugin 1.3 |
---|
| 3 | * |
---|
| 4 | * http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/ |
---|
| 5 | * http://docs.jquery.com/Plugins/Tooltip |
---|
| 6 | * |
---|
| 7 | * Copyright (c) 2006 - 2008 Jörn Zaefferer |
---|
| 8 | * |
---|
| 9 | * $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $ |
---|
| 10 | * |
---|
| 11 | * Dual licensed under the MIT and GPL licenses: |
---|
| 12 | * http://www.opensource.org/licenses/mit-license.php |
---|
| 13 | * http://www.gnu.org/licenses/gpl.html |
---|
| 14 | */ |
---|
| 15 | |
---|
| 16 | ;(function($) { |
---|
| 17 | |
---|
| 18 | // the tooltip element |
---|
| 19 | var helper = {}, |
---|
| 20 | // the current tooltipped element |
---|
| 21 | current, |
---|
| 22 | // the title of the current element, used for restoring |
---|
| 23 | title, |
---|
| 24 | // timeout id for delayed tooltips |
---|
| 25 | tID, |
---|
| 26 | // IE 5.5 or 6 |
---|
| 27 | IE = $.browser.msie && /MSIE\s(5\.5|6\.)/.test(navigator.userAgent), |
---|
| 28 | // flag for mouse tracking |
---|
| 29 | track = false; |
---|
| 30 | |
---|
| 31 | $.tooltip = { |
---|
| 32 | blocked: false, |
---|
| 33 | defaults: { |
---|
| 34 | delay: 200, |
---|
| 35 | fade: false, |
---|
| 36 | showURL: true, |
---|
| 37 | extraClass: "", |
---|
| 38 | top: 15, |
---|
| 39 | left: 15, |
---|
| 40 | id: "tooltip" |
---|
| 41 | }, |
---|
| 42 | block: function() { |
---|
| 43 | $.tooltip.blocked = !$.tooltip.blocked; |
---|
| 44 | } |
---|
| 45 | }; |
---|
| 46 | |
---|
| 47 | $.fn.extend({ |
---|
| 48 | tooltip: function(settings) { |
---|
| 49 | settings = $.extend({}, $.tooltip.defaults, settings); |
---|
| 50 | createHelper(settings); |
---|
| 51 | return this.each(function() { |
---|
| 52 | $.data(this, "tooltip", settings); |
---|
| 53 | this.tOpacity = helper.parent.css("opacity"); |
---|
| 54 | // copy tooltip into its own expando and remove the title |
---|
| 55 | this.tooltipText = this.title; |
---|
| 56 | $(this).removeAttr("title"); |
---|
| 57 | // also remove alt attribute to prevent default tooltip in IE |
---|
| 58 | this.alt = ""; |
---|
| 59 | }) |
---|
| 60 | .mouseover(save) |
---|
| 61 | .mouseout(hide) |
---|
| 62 | .click(hide); |
---|
| 63 | }, |
---|
| 64 | fixPNG: IE ? function() { |
---|
| 65 | return this.each(function () { |
---|
| 66 | var image = $(this).css('backgroundImage'); |
---|
| 67 | if (image.match(/^url\(["']?(.*\.png)["']?\)$/i)) { |
---|
| 68 | image = RegExp.$1; |
---|
| 69 | $(this).css({ |
---|
| 70 | 'backgroundImage': 'none', |
---|
| 71 | 'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + image + "')" |
---|
| 72 | }).each(function () { |
---|
| 73 | var position = $(this).css('position'); |
---|
| 74 | if (position != 'absolute' && position != 'relative') |
---|
| 75 | $(this).css('position', 'relative'); |
---|
| 76 | }); |
---|
| 77 | } |
---|
| 78 | }); |
---|
| 79 | } : function() { return this; }, |
---|
| 80 | unfixPNG: IE ? function() { |
---|
| 81 | return this.each(function () { |
---|
| 82 | $(this).css({'filter': '', backgroundImage: ''}); |
---|
| 83 | }); |
---|
| 84 | } : function() { return this; }, |
---|
| 85 | hideWhenEmpty: function() { |
---|
| 86 | return this.each(function() { |
---|
| 87 | $(this)[ $(this).html() ? "show" : "hide" ](); |
---|
| 88 | }); |
---|
| 89 | }, |
---|
| 90 | url: function() { |
---|
| 91 | return this.attr('href') || this.attr('src'); |
---|
| 92 | } |
---|
| 93 | }); |
---|
| 94 | |
---|
| 95 | function createHelper(settings) { |
---|
| 96 | // there can be only one tooltip helper |
---|
| 97 | if( helper.parent ) |
---|
| 98 | return; |
---|
| 99 | // create the helper, h3 for title, div for url |
---|
| 100 | helper.parent = $('<div id="' + settings.id + '"><h3></h3><div class="body"></div><div class="url"></div></div>') |
---|
| 101 | // add to document |
---|
| 102 | .appendTo(document.body) |
---|
| 103 | // hide it at first |
---|
| 104 | .hide(); |
---|
| 105 | |
---|
| 106 | // apply bgiframe if available |
---|
| 107 | if ( $.fn.bgiframe ) |
---|
| 108 | helper.parent.bgiframe(); |
---|
| 109 | |
---|
| 110 | // save references to title and url elements |
---|
| 111 | helper.title = $('h3', helper.parent); |
---|
| 112 | helper.body = $('div.body', helper.parent); |
---|
| 113 | helper.url = $('div.url', helper.parent); |
---|
| 114 | } |
---|
| 115 | |
---|
| 116 | function settings(element) { |
---|
| 117 | return $.data(element, "tooltip"); |
---|
| 118 | } |
---|
| 119 | |
---|
| 120 | // main event handler to start showing tooltips |
---|
| 121 | function handle(event) { |
---|
| 122 | // show helper, either with timeout or on instant |
---|
| 123 | if( settings(this).delay ) |
---|
| 124 | tID = setTimeout(show, settings(this).delay); |
---|
| 125 | else |
---|
| 126 | show(); |
---|
| 127 | |
---|
| 128 | // if selected, update the helper position when the mouse moves |
---|
| 129 | track = !!settings(this).track; |
---|
| 130 | $(document.body).bind('mousemove', update); |
---|
| 131 | |
---|
| 132 | // update at least once |
---|
| 133 | update(event); |
---|
| 134 | } |
---|
| 135 | |
---|
| 136 | // save elements title before the tooltip is displayed |
---|
| 137 | function save() { |
---|
| 138 | // if this is the current source, or it has no title (occurs with click event), stop |
---|
| 139 | if ( $.tooltip.blocked || this == current || (!this.tooltipText && !settings(this).bodyHandler) ) |
---|
| 140 | return; |
---|
| 141 | |
---|
| 142 | // save current |
---|
| 143 | current = this; |
---|
| 144 | title = this.tooltipText; |
---|
| 145 | |
---|
| 146 | if ( settings(this).bodyHandler ) { |
---|
| 147 | helper.title.hide(); |
---|
| 148 | var bodyContent = settings(this).bodyHandler.call(this); |
---|
| 149 | if (bodyContent.nodeType || bodyContent.jquery) { |
---|
| 150 | helper.body.empty().append(bodyContent) |
---|
| 151 | } else { |
---|
| 152 | helper.body.html( bodyContent ); |
---|
| 153 | } |
---|
| 154 | helper.body.show(); |
---|
| 155 | } else if ( settings(this).showBody ) { |
---|
| 156 | var parts = title.split(settings(this).showBody); |
---|
| 157 | helper.title.html(parts.shift()).show(); |
---|
| 158 | helper.body.empty(); |
---|
| 159 | for(var i = 0, part; (part = parts[i]); i++) { |
---|
| 160 | if(i > 0) |
---|
| 161 | helper.body.append("<br/>"); |
---|
| 162 | helper.body.append(part); |
---|
| 163 | } |
---|
| 164 | helper.body.hideWhenEmpty(); |
---|
| 165 | } else { |
---|
| 166 | helper.title.html(title).show(); |
---|
| 167 | helper.body.hide(); |
---|
| 168 | } |
---|
| 169 | |
---|
| 170 | // if element has href or src, add and show it, otherwise hide it |
---|
| 171 | if( settings(this).showURL && $(this).url() ) |
---|
| 172 | helper.url.html( $(this).url().replace('http://', '') ).show(); |
---|
| 173 | else |
---|
| 174 | helper.url.hide(); |
---|
| 175 | |
---|
| 176 | // add an optional class for this tip |
---|
| 177 | helper.parent.addClass(settings(this).extraClass); |
---|
| 178 | |
---|
| 179 | // fix PNG background for IE |
---|
| 180 | if (settings(this).fixPNG ) |
---|
| 181 | helper.parent.fixPNG(); |
---|
| 182 | |
---|
| 183 | handle.apply(this, arguments); |
---|
| 184 | } |
---|
| 185 | |
---|
| 186 | // delete timeout and show helper |
---|
| 187 | function show() { |
---|
| 188 | tID = null; |
---|
| 189 | if ((!IE || !$.fn.bgiframe) && settings(current).fade) { |
---|
| 190 | if (helper.parent.is(":animated")) |
---|
| 191 | helper.parent.stop().show().fadeTo(settings(current).fade, current.tOpacity); |
---|
| 192 | else |
---|
| 193 | helper.parent.is(':visible') ? helper.parent.fadeTo(settings(current).fade, current.tOpacity) : helper.parent.fadeIn(settings(current).fade); |
---|
| 194 | } else { |
---|
| 195 | helper.parent.show(); |
---|
| 196 | } |
---|
| 197 | update(); |
---|
| 198 | } |
---|
| 199 | |
---|
| 200 | /** |
---|
| 201 | * callback for mousemove |
---|
| 202 | * updates the helper position |
---|
| 203 | * removes itself when no current element |
---|
| 204 | */ |
---|
| 205 | function update(event) { |
---|
| 206 | if($.tooltip.blocked) |
---|
| 207 | return; |
---|
| 208 | |
---|
| 209 | if (event && event.target.tagName == "OPTION") { |
---|
| 210 | return; |
---|
| 211 | } |
---|
| 212 | |
---|
| 213 | // stop updating when tracking is disabled and the tooltip is visible |
---|
| 214 | if ( !track && helper.parent.is(":visible")) { |
---|
| 215 | $(document.body).unbind('mousemove', update) |
---|
| 216 | } |
---|
| 217 | |
---|
| 218 | // if no current element is available, remove this listener |
---|
| 219 | if( current == null ) { |
---|
| 220 | $(document.body).unbind('mousemove', update); |
---|
| 221 | return; |
---|
| 222 | } |
---|
| 223 | |
---|
| 224 | // remove position helper classes |
---|
| 225 | helper.parent.removeClass("viewport-right").removeClass("viewport-bottom"); |
---|
| 226 | |
---|
| 227 | var left = helper.parent[0].offsetLeft; |
---|
| 228 | var top = helper.parent[0].offsetTop; |
---|
| 229 | if (event) { |
---|
| 230 | // position the helper 15 pixel to bottom right, starting from mouse position |
---|
| 231 | left = event.pageX + settings(current).left; |
---|
| 232 | top = event.pageY + settings(current).top; |
---|
| 233 | var right='auto'; |
---|
| 234 | if (settings(current).positionLeft) { |
---|
| 235 | right = $(window).width() - left; |
---|
| 236 | left = 'auto'; |
---|
| 237 | } |
---|
| 238 | helper.parent.css({ |
---|
| 239 | left: left, |
---|
| 240 | right: right, |
---|
| 241 | top: top |
---|
| 242 | }); |
---|
| 243 | } |
---|
| 244 | |
---|
| 245 | var v = viewport(), |
---|
| 246 | h = helper.parent[0]; |
---|
| 247 | // check horizontal position |
---|
| 248 | if (v.x + v.cx < h.offsetLeft + h.offsetWidth) { |
---|
| 249 | left -= h.offsetWidth + 20 + settings(current).left; |
---|
| 250 | helper.parent.css({left: left + 'px'}).addClass("viewport-right"); |
---|
| 251 | } |
---|
| 252 | // check vertical position |
---|
| 253 | if (v.y + v.cy < h.offsetTop + h.offsetHeight) { |
---|
| 254 | top -= h.offsetHeight + 20 + settings(current).top; |
---|
| 255 | helper.parent.css({top: top + 'px'}).addClass("viewport-bottom"); |
---|
| 256 | } |
---|
| 257 | } |
---|
| 258 | |
---|
| 259 | function viewport() { |
---|
| 260 | return { |
---|
| 261 | x: $(window).scrollLeft(), |
---|
| 262 | y: $(window).scrollTop(), |
---|
| 263 | cx: $(window).width(), |
---|
| 264 | cy: $(window).height() |
---|
| 265 | }; |
---|
| 266 | } |
---|
| 267 | |
---|
| 268 | // hide helper and restore added classes and the title |
---|
| 269 | function hide(event) { |
---|
| 270 | if($.tooltip.blocked) |
---|
| 271 | return; |
---|
| 272 | // clear timeout if possible |
---|
| 273 | if(tID) |
---|
| 274 | clearTimeout(tID); |
---|
| 275 | // no more current element |
---|
| 276 | current = null; |
---|
| 277 | |
---|
| 278 | var tsettings = settings(this); |
---|
| 279 | function complete() { |
---|
| 280 | helper.parent.removeClass( tsettings.extraClass ).hide().css("opacity", ""); |
---|
| 281 | } |
---|
| 282 | if ((!IE || !$.fn.bgiframe) && tsettings.fade) { |
---|
| 283 | if (helper.parent.is(':animated')) |
---|
| 284 | helper.parent.stop().fadeTo(tsettings.fade, 0, complete); |
---|
| 285 | else |
---|
| 286 | helper.parent.stop().fadeOut(tsettings.fade, complete); |
---|
| 287 | } else |
---|
| 288 | complete(); |
---|
| 289 | |
---|
| 290 | if( settings(this).fixPNG ) |
---|
| 291 | helper.parent.unfixPNG(); |
---|
| 292 | } |
---|
| 293 | |
---|
| 294 | })(jQuery); |
---|