diff --git a/dist/jquery.qtip.basic.js b/dist/jquery.qtip.basic.js index 19ad5480..c160c31e 100644 --- a/dist/jquery.qtip.basic.js +++ b/dist/jquery.qtip.basic.js @@ -9,7 +9,7 @@ * http://en.wikipedia.org/wiki/MIT_License * http://en.wikipedia.org/wiki/GNU_General_Public_License * -* Date: Sat Apr 23 00:41:47 2011 +0100 +* Date: Mon May 2 20:12:06 2011 +0100 */ "use strict"; // Enable ECMAScript "strict" operation for this function. See more: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ @@ -31,6 +31,7 @@ disabled = 'ui-state-disabled', selector = 'div.qtip.'+uitooltip, focusClass = uitooltip + '-focus', + hoverClass = uitooltip + '-hover', hideOffset = '-31000px', replaceSuffix = '_replacedByqTip', oldtitle = 'oldtitle'; @@ -480,10 +481,15 @@ function QTip(target, options, id, attr) }); } - // Focus/blur the tooltip - tooltip.bind('mouseenter'+namespace+' mouseleave'+namespace, function(event) { + // Focus the tooltip on mouseenter (z-index stacking) + tooltip.bind('mouseenter'+namespace, function(event) { self[ event.type === 'mouseenter' ? 'focus' : 'blur' ](event); }); + + // Add hover class on mouseenter/mouseleave + tooltip.bind('mouseenter'+namespace+' mouseleave'+namespace, function(event) { + tooltip.toggleClass(hoverClass, event.type === 'mouseenter'); + }); } // Assign hide events @@ -499,6 +505,16 @@ function QTip(target, options, id, attr) }); } + /* + * Make sure hoverIntent functions properly by using mouseleave to clear show timer if + * mouseenter/mouseout is used for show.event, even if it isn't in the users options. + */ + if(/mouse(over|enter)/i.test(options.show.event) && !/mouse(out|leave)/i.test(options.hide.event)) { + targets.hide.bind('mouseleave'+namespace, function(event) { + clearTimeout(self.timers.show); + }); + } + // Apply hide events $.each(events.hide, function(index, type) { var showIndex = $.inArray(type, events.show), @@ -532,11 +548,12 @@ function QTip(target, options, id, attr) if('number' === typeof options.hide.distance) { // Bind mousemove to target to detect distance difference targets.show.bind('mousemove'+namespace, function(event) { - var coords = cache.coords || [], - limit = options.hide.distance; + var origin = cache.origin || {}, + limit = options.hide.distance, + abs = Math.abs; // Check if the movement has gone beyond the limit, and hide it if so - if(coords && (Math.abs(event.pageX - coords[0]) >= limit || Math.abs(event.pageY - coords[1]) >= limit)){ + if(origin && (abs(event.pageX - origin.pageX) >= limit || abs(event.pageY - origin.pageY) >= limit)){ self.hide(event); } }); @@ -907,6 +924,9 @@ function QTip(target, options, id, attr) // Execute state specific properties if(state) { + // Store show origin coordinates + cache.origin = $.extend({}, MOUSE); + // Focus the tooltip self.focus(event); @@ -918,18 +938,13 @@ function QTip(target, options, id, attr) // Hide other tooltips if tooltip is solo, using it as the context if(opts.solo) { $(selector, opts.solo).not(tooltip).qtip('hide', callback); } - - // Store coordinates if hide.distance is set - if('number' === typeof options.hide.distance) { - cache.coords = [ event.pageX, event.pageY ]; - } } else { // Clear show timer if we're hiding clearTimeout(self.timers.show); - // Delete cached coords - delete cache.coords; + // Remove cached origin on hide + delete cache.origin; // Blur the tooltip self.blur(event); @@ -998,26 +1013,26 @@ function QTip(target, options, id, attr) // Only update the z-index if it has changed and tooltip is not already focused if(!tooltip.hasClass(focusClass)) { - // Only update z-index's if they've changed' - if(curIndex !== newIndex) { - // Reduce our z-index's and keep them properly ordered - qtips.each(function() { - if(this.style.zIndex > curIndex) { - this.style.zIndex = this.style.zIndex - 1; - } - }); - - // Fire blur event for focused tooltip - qtips.filter('.' + focusClass).qtip('blur', cachedEvent); - } - // Call API method callback = $.Event('tooltipfocus'); callback.originalEvent = cachedEvent; tooltip.trigger(callback, [self, newIndex]); - // If callback wasn't FALSE + // If default action wasn't prevented... if(!callback.isDefaultPrevented()) { + // Only update z-index's if they've changed + if(curIndex !== newIndex) { + // Reduce our z-index's and keep them properly ordered + qtips.each(function() { + if(this.style.zIndex > curIndex) { + this.style.zIndex = this.style.zIndex - 1; + } + }); + + // Fire blur event for focused tooltip + qtips.filter('.' + focusClass).qtip('blur', cachedEvent); + } + // Set the new z-index tooltip.addClass(focusClass)[0].style.zIndex = newIndex; } @@ -1067,27 +1082,35 @@ function QTip(target, options, id, attr) // Repositioning method and axis detection horizontal: method[0], vertical: method[1] || method[0], - tip: options.style.tip, + tip: options.style.tip || {}, // Reposition methods left: function(posLeft) { - var viewportScroll = viewport.offset.left + viewport.scrollLeft, + var isShift = readjust.horizontal === 'shift', + viewportScroll = viewport.offset.left + viewport.scrollLeft, myWidth = my.x === 'left' ? elemWidth : my.x === 'right' ? -elemWidth : -elemWidth / 2, atWidth = at.x === 'left' ? targetWidth : at.x === 'right' ? -targetWidth : -targetWidth / 2, - tipAdjust = tip && tip.precedance === 'y' ? readjust.tip.width + readjust.tip.border * 2 : 0, + tipWidth = (readjust.tip.width + readjust.tip.border * 2) || 0, + tipAdjust = tip && tip.precedance === 'x' && !isShift ? tipWidth : 0, overflowLeft = viewportScroll - posLeft - tipAdjust, overflowRight = posLeft + elemWidth - viewport.width - viewportScroll + tipAdjust, offset = myWidth - (my.precedance === 'x' || my.x === my.y ? atWidth : 0), isCenter = my.x === 'center'; // Optional 'shift' style repositioning - if(readjust.horizontal === 'shift') { - position.left += overflowLeft > 0 ? overflowLeft : overflowRight > 0 ? -overflowRight : 0; + if(isShift) { + tipAdjust = tip && tip.precedance === 'y' ? tipWidth : 0; + offset = (my.x === 'left' ? 1 : -1) * myWidth - tipAdjust; - // Make sure we stay within the viewport boundaries - position.left = Math.min( - Math.max(viewportScroll, position.left), - Math.max(overflowLeft > 0 ? -1E9 : 0, viewportScroll + viewport.width - elemWidth) + // Adjust position but keep it within viewport dimensions + position.left += overflowLeft > 0 ? overflowLeft : overflowRight > 0 ? -overflowRight : 0; + position.left = Math.max( + viewport.offset.left + (tipAdjust && tip.x === 'center' ? readjust.tip.offset : 0), + posLeft - offset, + Math.min( + Math.max(viewport.offset.left + viewport.width, posLeft + offset), + position.left + ) ); } @@ -1108,23 +1131,31 @@ function QTip(target, options, id, attr) return position.left - posLeft; }, top: function(posTop) { - var viewportScroll = viewport.offset.top + viewport.scrollTop, + var isShift = readjust.vertical === 'shift', + viewportScroll = viewport.offset.top + viewport.scrollTop, myHeight = my.y === 'top' ? elemHeight : my.y === 'bottom' ? -elemHeight : -elemHeight / 2, atHeight = at.y === 'top' ? targetHeight : at.y === 'bottom' ? -targetHeight : -targetHeight / 2, - tipAdjust = tip && tip.precedance === 'x' ? readjust.tip.height + readjust.tip.border * 2 : 0, + tipHeight = (readjust.tip.height + readjust.tip.border * 2) || 0, + tipAdjust = tip && tip.precedance === 'y' && !isShift ? tipHeight : 0, overflowTop = viewportScroll - posTop - tipAdjust, overflowBottom = posTop + elemHeight - viewport.height - viewportScroll + tipAdjust, offset = myHeight - (my.precedance === 'y' || my.x === my.y ? atHeight : 0), isCenter = my.y === 'center'; // Optional 'shift' style repositioning - if(readjust.vertical === 'shift') { - position.top += overflowTop > 0 ? overflowTop : overflowBottom > 0 ? -overflowBottom : 0; + if(isShift) { + tipAdjust = tip && tip.precedance === 'x' ? tipHeight : 0; + offset = (my.y === 'top' ? 1 : -1) * myHeight - tipAdjust; - // Make sure we stay within the viewport boundaries - position.top = Math.min( - Math.max(viewportScroll, position.top), - Math.max(overflowTop > 0 ? -1E9 : 0, viewportScroll + viewport.height - elemHeight) + // Adjust position but keep it within viewport dimensions + position.top += overflowTop > 0 ? overflowTop : overflowBottom > 0 ? -overflowBottom : 0; + position.top = Math.max( + viewport.offset.top + (tipAdjust && tip.x === 'center' ? readjust.tip.offset : 0), + posTop - offset, + Math.min( + Math.max(viewport.offset.top + viewport.height, posTop + offset), + position.top + ) ); } @@ -1146,18 +1177,6 @@ function QTip(target, options, id, attr) } }; - - - // Cache our viewport details - viewport = !viewport ? FALSE : { - elem: viewport, - height: viewport[ (viewport[0] === window ? 'h' : 'outerH') + 'eight' ](), - width: viewport[ (viewport[0] === window ? 'w' : 'outerW') + 'idth' ](), - scrollLeft: viewport.scrollLeft(), - scrollTop: viewport.scrollTop(), - offset: viewport.offset() || { left:0, top: 0 } - }; - // Check if mouse was the target if(target === 'mouse') { // Force left top to allow flipping @@ -1165,8 +1184,9 @@ function QTip(target, options, id, attr) // Use cached event if one isn't available for positioning event = event && (event.type === 'resize' || event.type === 'scroll') ? cache.event : - adjust.mouse || !event || !event.pageX || (/over|enter$/i.test(event.type) && !adjust.mouse) ? - $.extend({}, MOUSE) : event; + !adjust.mouse && cache.origin ? cache.origin : + MOUSE && (adjust.mouse || !event || !event.pageX) ? { pageX: MOUSE.pageX, pageY: MOUSE.pageY } : + event; // Use event coordinates for position position = { top: event.pageY, left: event.pageX }; @@ -1193,8 +1213,8 @@ function QTip(target, options, id, attr) if(target[0] === window) { position = { - top: !fixed || PLUGINS.iOS ? viewport.scrollTop : 0, - left: !fixed || PLUGINS.iOS ? viewport.scrollLeft : 0 + top: !fixed || PLUGINS.iOS ? viewport.scrollTop() : 0, + left: !fixed || PLUGINS.iOS ? viewport.scrollLeft() : 0 }; } } @@ -1203,7 +1223,7 @@ function QTip(target, options, id, attr) else if(target.is('area') && PLUGINS.imagemap) { position = PLUGINS.imagemap(target, at); } - else if(target[0].namespaceURI == 'http://www.w3.org/2000/svg' && PLUGINS.svg) { + else if(target[0].namespaceURI === 'http://www.w3.org/2000/svg' && PLUGINS.svg) { position = PLUGINS.svg(target, at); } @@ -1211,7 +1231,7 @@ function QTip(target, options, id, attr) targetWidth = target.outerWidth(); targetHeight = target.outerHeight(); - position = PLUGINS.offset(target, posOptions.container); + position = PLUGINS.offset(target, posOptions.container, fixed); } // Parse returned plugin values into proper variables @@ -1230,16 +1250,29 @@ function QTip(target, options, id, attr) position.left += adjust.x + (my.x === 'right' ? -elemWidth : my.x === 'center' ? -elemWidth / 2 : 0); position.top += adjust.y + (my.y === 'bottom' ? -elemHeight : my.y === 'center' ? -elemHeight / 2 : 0); - // Calculate collision offset values - if(posOptions.viewport.jquery && target[0] !== window && target[0] !== docBody) { + // Calculate collision offset values if viewport positioning is enabled + if(viewport.jquery && target[0] !== window && target[0] !== docBody && + readjust.vertical+readjust.horizontal !== 'nonenone') + { + // Cache our viewport details + viewport = { + elem: viewport, + height: viewport[ (viewport[0] === window ? 'h' : 'outerH') + 'eight' ](), + width: viewport[ (viewport[0] === window ? 'w' : 'outerW') + 'idth' ](), + scrollLeft: viewport.scrollLeft(), + scrollTop: viewport.scrollTop(), + offset: viewport.offset() || { left: 0, top: 0 } + }; + + // Adjust position based onviewport and adjustment options position.adjusted = { left: readjust.horizontal !== 'none' ? readjust.left(position.left) : 0, top: readjust.vertical !== 'none' ? readjust.top(position.top) : 0 }; } - else { - position.adjusted = { left: 0, top: 0 }; - } + + //Viewport adjustment is disabled, set values to zero + else { position.adjusted = { left: 0, top: 0 }; } // Set tooltip position class tooltip.attr('class', function(i, val) { @@ -1249,7 +1282,7 @@ function QTip(target, options, id, attr) // Call API method callback.originalEvent = $.extend({}, event); - tooltip.trigger(callback, [self, position, viewport.elem]); + tooltip.trigger(callback, [self, position, viewport.elem || viewport]); if(callback.isDefaultPrevented()){ return self; } delete position.adjusted; @@ -1281,8 +1314,12 @@ function QTip(target, options, id, attr) { if(self.rendered < 1 || options.style.width || isDrawing) { return self; } - var fluid = uitooltip + '-fluid', width, max, min; - isDrawing = 1; // Set drawing flag + var fluid = uitooltip + '-fluid', + container = options.position.container, + perc, width, max, min; + + // Set drawing flag + isDrawing = 1; // Reset width and add fluid class tooltip.css('width', '').addClass(fluid); @@ -1290,15 +1327,20 @@ function QTip(target, options, id, attr) // Grab our tooltip width (add 1 so we don't get wrapping problems in Gecko) width = tooltip.width() + ($.browser.mozilla ? 1 : 0); - // Parse our max/min properties - max = parseInt(tooltip.css('max-width'), 10) || 0; - min = parseInt(tooltip.css('min-width'), 10) || 0; + // Grab our max/min properties + max = tooltip.css('max-width') || ''; + min = tooltip.css('min-width') || ''; + + // Parse into proper pixel values + perc = (max + min).indexOf('%') > -1 ? container.width() / 100 : 0; + max = ((max.indexOf('%') > -1 ? perc : 1) * parseInt(max, 10)) || width; + min = ((min.indexOf('%') > -1 ? perc : 1) * parseInt(min, 10)) || 0; // Determine new dimension size based on max/min/current values width = max + min ? Math.min(Math.max(width, min), max) : width; // Set the newly calculated width and remvoe fluid class - tooltip.css('width', width).removeClass(fluid); + tooltip.css('width', Math.round(width)).removeClass(fluid); // Set drawing flag isDrawing = 0; @@ -1532,12 +1574,14 @@ QTIP.bind = function(opts, event) show: $.trim('' + options.show.event).replace(/ /g, namespace+' ') + namespace, hide: $.trim('' + options.hide.event).replace(/ /g, namespace+' ') + namespace }; - + /* - * If hide event is just 'unfocus', we'll use mouseleave as the hide event... - * since unfocus is actually library specific and won't fire as an event anywho. + * Make sure hoverIntent functions properly by using mouseleave as a hide event if + * mouseenter/mouseout is used for show.event, even if it isn't in the users options. */ - if(options.hide.event === 'unfocus') { events.hide = 'mouseleave' + namespace; } + if(/mouse(over|enter)/i.test(events.show) && !/mouse(out|leave)/i.test(events.hide)) { + events.hide += ' mouseleave' + namespace; + } // Define hoverIntent function function hoverIntent(event) { @@ -1592,7 +1636,7 @@ PLUGINS = QTIP.plugins = { }, // Custom (more correct for qTip!) offset calculator - offset: function(elem, container) { + offset: function(elem, container, fixed) { var pos = elem.offset(), parent = container, deep = 0, @@ -1620,7 +1664,9 @@ PLUGINS = QTIP.plugins = { // Compensate for containers scroll if it also has an offsetParent if(container[0] !== docBody || deep > 1) { scroll( container, 1 ); } - if(PLUGINS.iOS < 4.1 && PLUGINS.iOS > 3.1) { scroll( $(window), -1 ); } + + // Adjust for position.fixed tooltips (and also iOS scroll bug in v3.2 - v4.0) + if((PLUGINS.iOS < 4.1 && PLUGINS.iOS > 3.1) || (!PLUGINS.iOS && fixed)) { scroll( $(window), -1 ); } } return pos; diff --git a/dist/jquery.qtip.css b/dist/jquery.qtip.css index 228eecd0..33e2a0ff 100644 --- a/dist/jquery.qtip.css +++ b/dist/jquery.qtip.css @@ -9,7 +9,7 @@ * http://en.wikipedia.org/wiki/MIT_License * http://en.wikipedia.org/wiki/GNU_General_Public_License * -* Date: Sat Apr 23 00:41:47 2011 +0100 +* Date: Mon May 2 20:12:06 2011 +0100 */ /* Fluid class for determining actual width in IE */ @@ -108,6 +108,11 @@ } +/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */ +.ui-tooltip-hover{ + +} + /*! Default tooltip style */ .ui-tooltip-titlebar, @@ -440,8 +445,7 @@ /* Tipsy style */ .ui-tooltip-tipsy{ - border: 0 solid #000; - border: 0 solid rgba(0,0,0,.87); + border: 0; } .ui-tooltip-tipsy .ui-tooltip-titlebar, @@ -452,7 +456,7 @@ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000)"; color: white; - border: 0 dashed transparent; + border: 0px transparent; font-size: 11px; font-family: 'Lucida Grande', sans-serif; diff --git a/dist/jquery.qtip.js b/dist/jquery.qtip.js index b943bea7..1a623fca 100644 --- a/dist/jquery.qtip.js +++ b/dist/jquery.qtip.js @@ -9,7 +9,7 @@ * http://en.wikipedia.org/wiki/MIT_License * http://en.wikipedia.org/wiki/GNU_General_Public_License * -* Date: Sat Apr 23 00:41:47 2011 +0100 +* Date: Mon May 2 20:12:06 2011 +0100 */ "use strict"; // Enable ECMAScript "strict" operation for this function. See more: http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/ @@ -31,6 +31,7 @@ disabled = 'ui-state-disabled', selector = 'div.qtip.'+uitooltip, focusClass = uitooltip + '-focus', + hoverClass = uitooltip + '-hover', hideOffset = '-31000px', replaceSuffix = '_replacedByqTip', oldtitle = 'oldtitle'; @@ -480,10 +481,15 @@ function QTip(target, options, id, attr) }); } - // Focus/blur the tooltip - tooltip.bind('mouseenter'+namespace+' mouseleave'+namespace, function(event) { + // Focus the tooltip on mouseenter (z-index stacking) + tooltip.bind('mouseenter'+namespace, function(event) { self[ event.type === 'mouseenter' ? 'focus' : 'blur' ](event); }); + + // Add hover class on mouseenter/mouseleave + tooltip.bind('mouseenter'+namespace+' mouseleave'+namespace, function(event) { + tooltip.toggleClass(hoverClass, event.type === 'mouseenter'); + }); } // Assign hide events @@ -499,6 +505,16 @@ function QTip(target, options, id, attr) }); } + /* + * Make sure hoverIntent functions properly by using mouseleave to clear show timer if + * mouseenter/mouseout is used for show.event, even if it isn't in the users options. + */ + if(/mouse(over|enter)/i.test(options.show.event) && !/mouse(out|leave)/i.test(options.hide.event)) { + targets.hide.bind('mouseleave'+namespace, function(event) { + clearTimeout(self.timers.show); + }); + } + // Apply hide events $.each(events.hide, function(index, type) { var showIndex = $.inArray(type, events.show), @@ -532,11 +548,12 @@ function QTip(target, options, id, attr) if('number' === typeof options.hide.distance) { // Bind mousemove to target to detect distance difference targets.show.bind('mousemove'+namespace, function(event) { - var coords = cache.coords || [], - limit = options.hide.distance; + var origin = cache.origin || {}, + limit = options.hide.distance, + abs = Math.abs; // Check if the movement has gone beyond the limit, and hide it if so - if(coords && (Math.abs(event.pageX - coords[0]) >= limit || Math.abs(event.pageY - coords[1]) >= limit)){ + if(origin && (abs(event.pageX - origin.pageX) >= limit || abs(event.pageY - origin.pageY) >= limit)){ self.hide(event); } }); @@ -907,6 +924,9 @@ function QTip(target, options, id, attr) // Execute state specific properties if(state) { + // Store show origin coordinates + cache.origin = $.extend({}, MOUSE); + // Focus the tooltip self.focus(event); @@ -918,18 +938,13 @@ function QTip(target, options, id, attr) // Hide other tooltips if tooltip is solo, using it as the context if(opts.solo) { $(selector, opts.solo).not(tooltip).qtip('hide', callback); } - - // Store coordinates if hide.distance is set - if('number' === typeof options.hide.distance) { - cache.coords = [ event.pageX, event.pageY ]; - } } else { // Clear show timer if we're hiding clearTimeout(self.timers.show); - // Delete cached coords - delete cache.coords; + // Remove cached origin on hide + delete cache.origin; // Blur the tooltip self.blur(event); @@ -998,26 +1013,26 @@ function QTip(target, options, id, attr) // Only update the z-index if it has changed and tooltip is not already focused if(!tooltip.hasClass(focusClass)) { - // Only update z-index's if they've changed' - if(curIndex !== newIndex) { - // Reduce our z-index's and keep them properly ordered - qtips.each(function() { - if(this.style.zIndex > curIndex) { - this.style.zIndex = this.style.zIndex - 1; - } - }); - - // Fire blur event for focused tooltip - qtips.filter('.' + focusClass).qtip('blur', cachedEvent); - } - // Call API method callback = $.Event('tooltipfocus'); callback.originalEvent = cachedEvent; tooltip.trigger(callback, [self, newIndex]); - // If callback wasn't FALSE + // If default action wasn't prevented... if(!callback.isDefaultPrevented()) { + // Only update z-index's if they've changed + if(curIndex !== newIndex) { + // Reduce our z-index's and keep them properly ordered + qtips.each(function() { + if(this.style.zIndex > curIndex) { + this.style.zIndex = this.style.zIndex - 1; + } + }); + + // Fire blur event for focused tooltip + qtips.filter('.' + focusClass).qtip('blur', cachedEvent); + } + // Set the new z-index tooltip.addClass(focusClass)[0].style.zIndex = newIndex; } @@ -1067,27 +1082,35 @@ function QTip(target, options, id, attr) // Repositioning method and axis detection horizontal: method[0], vertical: method[1] || method[0], - tip: options.style.tip, + tip: options.style.tip || {}, // Reposition methods left: function(posLeft) { - var viewportScroll = viewport.offset.left + viewport.scrollLeft, + var isShift = readjust.horizontal === 'shift', + viewportScroll = viewport.offset.left + viewport.scrollLeft, myWidth = my.x === 'left' ? elemWidth : my.x === 'right' ? -elemWidth : -elemWidth / 2, atWidth = at.x === 'left' ? targetWidth : at.x === 'right' ? -targetWidth : -targetWidth / 2, - tipAdjust = tip && tip.precedance === 'y' ? readjust.tip.width + readjust.tip.border * 2 : 0, + tipWidth = (readjust.tip.width + readjust.tip.border * 2) || 0, + tipAdjust = tip && tip.precedance === 'x' && !isShift ? tipWidth : 0, overflowLeft = viewportScroll - posLeft - tipAdjust, overflowRight = posLeft + elemWidth - viewport.width - viewportScroll + tipAdjust, offset = myWidth - (my.precedance === 'x' || my.x === my.y ? atWidth : 0), isCenter = my.x === 'center'; // Optional 'shift' style repositioning - if(readjust.horizontal === 'shift') { - position.left += overflowLeft > 0 ? overflowLeft : overflowRight > 0 ? -overflowRight : 0; + if(isShift) { + tipAdjust = tip && tip.precedance === 'y' ? tipWidth : 0; + offset = (my.x === 'left' ? 1 : -1) * myWidth - tipAdjust; - // Make sure we stay within the viewport boundaries - position.left = Math.min( - Math.max(viewportScroll, position.left), - Math.max(overflowLeft > 0 ? -1E9 : 0, viewportScroll + viewport.width - elemWidth) + // Adjust position but keep it within viewport dimensions + position.left += overflowLeft > 0 ? overflowLeft : overflowRight > 0 ? -overflowRight : 0; + position.left = Math.max( + viewport.offset.left + (tipAdjust && tip.x === 'center' ? readjust.tip.offset : 0), + posLeft - offset, + Math.min( + Math.max(viewport.offset.left + viewport.width, posLeft + offset), + position.left + ) ); } @@ -1108,23 +1131,31 @@ function QTip(target, options, id, attr) return position.left - posLeft; }, top: function(posTop) { - var viewportScroll = viewport.offset.top + viewport.scrollTop, + var isShift = readjust.vertical === 'shift', + viewportScroll = viewport.offset.top + viewport.scrollTop, myHeight = my.y === 'top' ? elemHeight : my.y === 'bottom' ? -elemHeight : -elemHeight / 2, atHeight = at.y === 'top' ? targetHeight : at.y === 'bottom' ? -targetHeight : -targetHeight / 2, - tipAdjust = tip && tip.precedance === 'x' ? readjust.tip.height + readjust.tip.border * 2 : 0, + tipHeight = (readjust.tip.height + readjust.tip.border * 2) || 0, + tipAdjust = tip && tip.precedance === 'y' && !isShift ? tipHeight : 0, overflowTop = viewportScroll - posTop - tipAdjust, overflowBottom = posTop + elemHeight - viewport.height - viewportScroll + tipAdjust, offset = myHeight - (my.precedance === 'y' || my.x === my.y ? atHeight : 0), isCenter = my.y === 'center'; // Optional 'shift' style repositioning - if(readjust.vertical === 'shift') { - position.top += overflowTop > 0 ? overflowTop : overflowBottom > 0 ? -overflowBottom : 0; + if(isShift) { + tipAdjust = tip && tip.precedance === 'x' ? tipHeight : 0; + offset = (my.y === 'top' ? 1 : -1) * myHeight - tipAdjust; - // Make sure we stay within the viewport boundaries - position.top = Math.min( - Math.max(viewportScroll, position.top), - Math.max(overflowTop > 0 ? -1E9 : 0, viewportScroll + viewport.height - elemHeight) + // Adjust position but keep it within viewport dimensions + position.top += overflowTop > 0 ? overflowTop : overflowBottom > 0 ? -overflowBottom : 0; + position.top = Math.max( + viewport.offset.top + (tipAdjust && tip.x === 'center' ? readjust.tip.offset : 0), + posTop - offset, + Math.min( + Math.max(viewport.offset.top + viewport.height, posTop + offset), + position.top + ) ); } @@ -1146,18 +1177,6 @@ function QTip(target, options, id, attr) } }; - - - // Cache our viewport details - viewport = !viewport ? FALSE : { - elem: viewport, - height: viewport[ (viewport[0] === window ? 'h' : 'outerH') + 'eight' ](), - width: viewport[ (viewport[0] === window ? 'w' : 'outerW') + 'idth' ](), - scrollLeft: viewport.scrollLeft(), - scrollTop: viewport.scrollTop(), - offset: viewport.offset() || { left:0, top: 0 } - }; - // Check if mouse was the target if(target === 'mouse') { // Force left top to allow flipping @@ -1165,8 +1184,9 @@ function QTip(target, options, id, attr) // Use cached event if one isn't available for positioning event = event && (event.type === 'resize' || event.type === 'scroll') ? cache.event : - adjust.mouse || !event || !event.pageX || (/over|enter$/i.test(event.type) && !adjust.mouse) ? - $.extend({}, MOUSE) : event; + !adjust.mouse && cache.origin ? cache.origin : + MOUSE && (adjust.mouse || !event || !event.pageX) ? { pageX: MOUSE.pageX, pageY: MOUSE.pageY } : + event; // Use event coordinates for position position = { top: event.pageY, left: event.pageX }; @@ -1193,8 +1213,8 @@ function QTip(target, options, id, attr) if(target[0] === window) { position = { - top: !fixed || PLUGINS.iOS ? viewport.scrollTop : 0, - left: !fixed || PLUGINS.iOS ? viewport.scrollLeft : 0 + top: !fixed || PLUGINS.iOS ? viewport.scrollTop() : 0, + left: !fixed || PLUGINS.iOS ? viewport.scrollLeft() : 0 }; } } @@ -1203,7 +1223,7 @@ function QTip(target, options, id, attr) else if(target.is('area') && PLUGINS.imagemap) { position = PLUGINS.imagemap(target, at); } - else if(target[0].namespaceURI == 'http://www.w3.org/2000/svg' && PLUGINS.svg) { + else if(target[0].namespaceURI === 'http://www.w3.org/2000/svg' && PLUGINS.svg) { position = PLUGINS.svg(target, at); } @@ -1211,7 +1231,7 @@ function QTip(target, options, id, attr) targetWidth = target.outerWidth(); targetHeight = target.outerHeight(); - position = PLUGINS.offset(target, posOptions.container); + position = PLUGINS.offset(target, posOptions.container, fixed); } // Parse returned plugin values into proper variables @@ -1230,16 +1250,29 @@ function QTip(target, options, id, attr) position.left += adjust.x + (my.x === 'right' ? -elemWidth : my.x === 'center' ? -elemWidth / 2 : 0); position.top += adjust.y + (my.y === 'bottom' ? -elemHeight : my.y === 'center' ? -elemHeight / 2 : 0); - // Calculate collision offset values - if(posOptions.viewport.jquery && target[0] !== window && target[0] !== docBody) { + // Calculate collision offset values if viewport positioning is enabled + if(viewport.jquery && target[0] !== window && target[0] !== docBody && + readjust.vertical+readjust.horizontal !== 'nonenone') + { + // Cache our viewport details + viewport = { + elem: viewport, + height: viewport[ (viewport[0] === window ? 'h' : 'outerH') + 'eight' ](), + width: viewport[ (viewport[0] === window ? 'w' : 'outerW') + 'idth' ](), + scrollLeft: viewport.scrollLeft(), + scrollTop: viewport.scrollTop(), + offset: viewport.offset() || { left: 0, top: 0 } + }; + + // Adjust position based onviewport and adjustment options position.adjusted = { left: readjust.horizontal !== 'none' ? readjust.left(position.left) : 0, top: readjust.vertical !== 'none' ? readjust.top(position.top) : 0 }; } - else { - position.adjusted = { left: 0, top: 0 }; - } + + //Viewport adjustment is disabled, set values to zero + else { position.adjusted = { left: 0, top: 0 }; } // Set tooltip position class tooltip.attr('class', function(i, val) { @@ -1249,7 +1282,7 @@ function QTip(target, options, id, attr) // Call API method callback.originalEvent = $.extend({}, event); - tooltip.trigger(callback, [self, position, viewport.elem]); + tooltip.trigger(callback, [self, position, viewport.elem || viewport]); if(callback.isDefaultPrevented()){ return self; } delete position.adjusted; @@ -1281,8 +1314,12 @@ function QTip(target, options, id, attr) { if(self.rendered < 1 || options.style.width || isDrawing) { return self; } - var fluid = uitooltip + '-fluid', width, max, min; - isDrawing = 1; // Set drawing flag + var fluid = uitooltip + '-fluid', + container = options.position.container, + perc, width, max, min; + + // Set drawing flag + isDrawing = 1; // Reset width and add fluid class tooltip.css('width', '').addClass(fluid); @@ -1290,15 +1327,20 @@ function QTip(target, options, id, attr) // Grab our tooltip width (add 1 so we don't get wrapping problems in Gecko) width = tooltip.width() + ($.browser.mozilla ? 1 : 0); - // Parse our max/min properties - max = parseInt(tooltip.css('max-width'), 10) || 0; - min = parseInt(tooltip.css('min-width'), 10) || 0; + // Grab our max/min properties + max = tooltip.css('max-width') || ''; + min = tooltip.css('min-width') || ''; + + // Parse into proper pixel values + perc = (max + min).indexOf('%') > -1 ? container.width() / 100 : 0; + max = ((max.indexOf('%') > -1 ? perc : 1) * parseInt(max, 10)) || width; + min = ((min.indexOf('%') > -1 ? perc : 1) * parseInt(min, 10)) || 0; // Determine new dimension size based on max/min/current values width = max + min ? Math.min(Math.max(width, min), max) : width; // Set the newly calculated width and remvoe fluid class - tooltip.css('width', width).removeClass(fluid); + tooltip.css('width', Math.round(width)).removeClass(fluid); // Set drawing flag isDrawing = 0; @@ -1532,12 +1574,14 @@ QTIP.bind = function(opts, event) show: $.trim('' + options.show.event).replace(/ /g, namespace+' ') + namespace, hide: $.trim('' + options.hide.event).replace(/ /g, namespace+' ') + namespace }; - + /* - * If hide event is just 'unfocus', we'll use mouseleave as the hide event... - * since unfocus is actually library specific and won't fire as an event anywho. + * Make sure hoverIntent functions properly by using mouseleave as a hide event if + * mouseenter/mouseout is used for show.event, even if it isn't in the users options. */ - if(options.hide.event === 'unfocus') { events.hide = 'mouseleave' + namespace; } + if(/mouse(over|enter)/i.test(events.show) && !/mouse(out|leave)/i.test(events.hide)) { + events.hide += ' mouseleave' + namespace; + } // Define hoverIntent function function hoverIntent(event) { @@ -1592,7 +1636,7 @@ PLUGINS = QTIP.plugins = { }, // Custom (more correct for qTip!) offset calculator - offset: function(elem, container) { + offset: function(elem, container, fixed) { var pos = elem.offset(), parent = container, deep = 0, @@ -1620,7 +1664,9 @@ PLUGINS = QTIP.plugins = { // Compensate for containers scroll if it also has an offsetParent if(container[0] !== docBody || deep > 1) { scroll( container, 1 ); } - if(PLUGINS.iOS < 4.1 && PLUGINS.iOS > 3.1) { scroll( $(window), -1 ); } + + // Adjust for position.fixed tooltips (and also iOS scroll bug in v3.2 - v4.0) + if((PLUGINS.iOS < 4.1 && PLUGINS.iOS > 3.1) || (!PLUGINS.iOS && fixed)) { scroll( $(window), -1 ); } } return pos; @@ -2045,8 +2091,7 @@ function Tip(qTip, command) } else { props = offset.bottom !== undefined ? - [ adjust.top, -offset.top ] : - [ -adjust.top, offset.top ]; + [ adjust.top, -offset.top ] : [ -adjust.top, offset.top ]; if( (shift.y = Math.max(props[0], props[1])) > props[0] ) { pos.top -= adjust.top; @@ -2674,12 +2719,12 @@ function Modal(api) // Apply our show/hide/focus modal events .bind('tooltipshow'+globalNamespace+' tooltiphide'+globalNamespace, function(event, api, duration) { - self[ event.type.replace('tooltip', '') ](duration); + self[ event.type.replace('tooltip', '') ](event, duration); }) // Adjust modal z-index on tooltip focus .bind('tooltipfocus'+globalNamespace, function(event, api, zIndex) { - overlay.css('z-index', zIndex - 1); + overlay[0].style.zIndex = zIndex - 1; }) // Focus any other visible modals when this one blurs @@ -2738,8 +2783,11 @@ function Modal(api) return overlay; }, - toggle: function(state) + toggle: function(event, state, duration) { + // Make sure default event hasn't been prevented + if(event && event.isDefaultPrevented()) { return self; } + var effect = options.effect, type = state ? 'show': 'hide', modals = $('[' + attr + ']:visible').not(tooltip), @@ -2748,14 +2796,11 @@ function Modal(api) // Create our overlay if it isn't present already if(!overlay) { overlay = self.create(); } - // Prevent modal from conflicting with show.solo - if(overlay.is(':animated') && !state) { return self; } - - // Make sure not to hide the backdrop if other modals are visible - if(!state && modals.length) { return self; } + // Prevent modal from conflicting with show.solo, and don't hide backdrop is other modals are visible + if((overlay.is(':animated') && !state) || (!state && modals.length)) { return self; } // Toggle backdrop cursor style on show - else if(state) { + if(state) { elems.overlay.css('cursor', options.blur ? 'pointer' : ''); } @@ -2774,7 +2819,7 @@ function Modal(api) // Use basic fade function else { - overlay.fadeTo(90, state ? 0.7 : 0, function() { + overlay.fadeTo( parseInt(duration, 10) || 90, state ? 0.7 : 0, function() { if(!state) { $(this).hide(); } }); } @@ -2782,8 +2827,8 @@ function Modal(api) return self; }, - show: function() { return self.toggle(TRUE); }, - hide: function() { return self.toggle(FALSE); }, + show: function(event, duration) { return self.toggle(event, TRUE, duration); }, + hide: function(event, duration) { return self.toggle(event, FALSE, duration); }, destroy: function() { diff --git a/dist/jquery.qtip.min.css b/dist/jquery.qtip.min.css index 4ad08dff..9147bd78 100644 --- a/dist/jquery.qtip.min.css +++ b/dist/jquery.qtip.min.css @@ -1 +1 @@ -.ui-tooltip-fluid{display:block;visibility:hidden;position:static!important;float:left!important;}.ui-tooltip,.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;}.ui-tooltip-content{position:relative;padding:5px 9px;overflow:hidden;border-width:1px;border-style:solid;text-align:left;word-wrap:break-word;overflow:hidden;}.ui-tooltip-titlebar{position:relative;min-height:14px;padding:5px 35px 5px 10px;overflow:hidden;border-width:1px 1px 0;border-style:solid;font-weight:bold;}.ui-tooltip-titlebar+.ui-tooltip-content{border-top-width:0!important;}/*!Default close button class */ .ui-tooltip-titlebar .ui-state-default{position:absolute;right:4px;top:50%;margin-top:-9px;cursor:pointer;outline:medium none;border-width:1px;border-style:solid;}* html .ui-tooltip-titlebar .ui-state-default{top:16px;}.ui-tooltip-titlebar .ui-icon,.ui-tooltip-icon .ui-icon{display:block;text-indent:-1000em;}.ui-tooltip-icon,.ui-tooltip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.ui-tooltip-icon .ui-icon{width:18px;height:14px;text-align:center;text-indent:0;font:normal bold 10px/13px Tahoma,sans-serif;color:inherit;background:transparent none no-repeat -100em -100em;}/*!Default tooltip style */ .ui-tooltip-titlebar,.ui-tooltip-content{border-color:#F1D031;background-color:#FFFFA3;color:#555;}.ui-tooltip-titlebar{background-color:#FFEF93;}.ui-tooltip-titlebar .ui-tooltip-icon{border-color:#CCC;background:#F1F1F1;color:#777;}.ui-tooltip-titlebar .ui-state-hover{border-color:#AAA;color:#111;}/*!Light tooltip style */ .ui-tooltip-light .ui-tooltip-titlebar,.ui-tooltip-light .ui-tooltip-content{border-color:#E2E2E2;color:#454545;}.ui-tooltip-light .ui-tooltip-content{background-color:white;}.ui-tooltip-light .ui-tooltip-titlebar{background-color:#f1f1f1;}/*!Dark tooltip style */ .ui-tooltip-dark .ui-tooltip-titlebar,.ui-tooltip-dark .ui-tooltip-content{border-color:#303030;color:#f3f3f3;}.ui-tooltip-dark .ui-tooltip-content{background-color:#505050;}.ui-tooltip-dark .ui-tooltip-titlebar{background-color:#404040;}.ui-tooltip-dark .ui-tooltip-icon{border-color:#444;}.ui-tooltip-dark .ui-tooltip-titlebar .ui-state-hover{border-color:#303030;}/*!Cream tooltip style */ .ui-tooltip-cream .ui-tooltip-titlebar,.ui-tooltip-cream .ui-tooltip-content{border-color:#F9E98E;color:#A27D35;}.ui-tooltip-cream .ui-tooltip-content{background-color:#FBF7AA;}.ui-tooltip-cream .ui-tooltip-titlebar{background-color:#F0DE7D;}.ui-tooltip-cream .ui-state-default .ui-tooltip-icon{background-position:-82px 0;}/*!Red tooltip style */ .ui-tooltip-red .ui-tooltip-titlebar,.ui-tooltip-red .ui-tooltip-content{border-color:#D95252;color:#912323;}.ui-tooltip-red .ui-tooltip-content{background-color:#F78B83;}.ui-tooltip-red .ui-tooltip-titlebar{background-color:#F06D65;}.ui-tooltip-red .ui-state-default .ui-tooltip-icon{background-position:-102px 0;}.ui-tooltip-red .ui-tooltip-icon{border-color:#D95252;}.ui-tooltip-red .ui-tooltip-titlebar .ui-state-hover{border-color:#D95252;}/*!Green tooltip style */ .ui-tooltip-green .ui-tooltip-titlebar,.ui-tooltip-green .ui-tooltip-content{border-color:#90D93F;color:#3F6219;}.ui-tooltip-green .ui-tooltip-content{background-color:#CAED9E;}.ui-tooltip-green .ui-tooltip-titlebar{background-color:#B0DE78;}.ui-tooltip-green .ui-state-default .ui-tooltip-icon{background-position:-42px 0;}/*!Blue tooltip style */ .ui-tooltip-blue .ui-tooltip-titlebar,.ui-tooltip-blue .ui-tooltip-content{border-color:#ADD9ED;color:#5E99BD;}.ui-tooltip-blue .ui-tooltip-content{background-color:#E5F6FE;}.ui-tooltip-blue .ui-tooltip-titlebar{background-color:#D0E9F5;}.ui-tooltip-blue .ui-state-default .ui-tooltip-icon{background-position:-2px 0;}.ui-tooltip .ui-tooltip-tip{margin:0 auto;overflow:hidden;background:transparent!important;border:0 dashed transparent!important;z-index:10;}.ui-tooltip .ui-tooltip-tip,.ui-tooltip .ui-tooltip-tip *{position:absolute;line-height:.1px!important;font-size:.1px!important;color:#123456;background:transparent;border:0 dashed transparent;}.ui-tooltip .ui-tooltip-tip canvas{position:static;}#qtip-overlay{position:absolute;left:-10000em;top:-10000em;background-color:black;opacity:.7;filter:alpha(opacity=70);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";}/*!Add shadows to your tooltips in:FF3+,Chrome 2+,Opera 10.6+,IE6+,Safari 2+*/ .ui-tooltip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,0.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,0.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,0.15);}.ui-tooltip-shadow .ui-tooltip-titlebar,.ui-tooltip-shadow .ui-tooltip-content{filter:progid:DXImageTransform.Microsoft.Shadow(Color='gray',Direction=135,Strength=3);-ms-filter:"progid:DXImageTransform.Microsoft.Shadow(Color='gray',Direction=135,Strength=3)";_margin-bottom:-3px;.margin-bottom:-3px;}/*!Add rounded corners to your tooltips in:FF3+,Chrome 2+,Opera 10.6+,IE9+,Safari 2+*/ .ui-tooltip-rounded,.ui-tooltip-rounded .ui-tooltip-content,.ui-tooltip-tipsy,.ui-tooltip-tipsy .ui-tooltip-content,.ui-tooltip-youtube,.ui-tooltip-youtube .ui-tooltip-content{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;}.ui-tooltip-rounded .ui-tooltip-titlebar,.ui-tooltip-tipsy .ui-tooltip-titlebar,.ui-tooltip-youtube .ui-tooltip-titlebar{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.ui-tooltip-rounded .ui-tooltip-titlebar+.ui-tooltip-content,.ui-tooltip-tipsy .ui-tooltip-titlebar+.ui-tooltip-content,.ui-tooltip-youtube .ui-tooltip-titlebar+.ui-tooltip-content{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;}/*!Youtube tooltip style */ .ui-tooltip-youtube{-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;}.ui-tooltip-youtube .ui-tooltip-titlebar,.ui-tooltip-youtube .ui-tooltip-content{background:transparent;background:rgba(0,0,0,0.85);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000)";color:white;border-color:#CCC;}.ui-tooltip-youtube .ui-tooltip-icon{border-color:#222;}.ui-tooltip-youtube .ui-tooltip-titlebar .ui-state-hover{border-color:#303030;}.ui-tooltip-jtools{background:#232323;background:rgba(0,0,0,0.7);background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333;}.ui-tooltip-jtools .ui-tooltip-titlebar{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)";}.ui-tooltip-jtools .ui-tooltip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)";}.ui-tooltip-jtools .ui-tooltip-titlebar,.ui-tooltip-jtools .ui-tooltip-content{background:transparent;color:white;border:0 dashed transparent;}.ui-tooltip-jtools .ui-tooltip-icon{border-color:#555;}.ui-tooltip-jtools .ui-tooltip-titlebar .ui-state-hover{border-color:#333;}.ui-tooltip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,0.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,0.4);box-shadow:4px 4px 5px rgba(0,0,0,0.4);}.ui-tooltip-cluetip .ui-tooltip-titlebar{background-color:#87876A;color:white;border:0 dashed transparent;}.ui-tooltip-cluetip .ui-tooltip-content{background-color:#D9D9C2;color:#111;border:0 dashed transparent;}.ui-tooltip-cluetip .ui-tooltip-icon{border-color:#808064;}.ui-tooltip-cluetip .ui-tooltip-titlebar .ui-state-hover{border-color:#696952;color:#696952;}.ui-tooltip-tipsy{border:0 solid #000;border:0 solid rgba(0,0,0,.87);}.ui-tooltip-tipsy .ui-tooltip-titlebar,.ui-tooltip-tipsy .ui-tooltip-content{background:transparent;background:rgba(0,0,0,.87);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000)";color:white;border:0 dashed transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:bold;line-height:16px;text-shadow:0 1px black;}.ui-tooltip-tipsy .ui-tooltip-titlebar{padding:6px 35px 0 10;}.ui-tooltip-tipsy .ui-tooltip-content{padding:6px 10;}.ui-tooltip-tipsy .ui-tooltip-icon{border-color:#222;text-shadow:none;}.ui-tooltip-tipsy .ui-tooltip-titlebar .ui-state-hover{border-color:#303030;}.ui-tooltip-tipped .ui-tooltip-titlebar,.ui-tooltip-tipped .ui-tooltip-content{border:3px solid #959FA9;}.ui-tooltip-tipped .ui-tooltip-titlebar{background:#3A79B8;background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)";color:white;font-weight:normal;font-family:serif;border-bottom-width:0;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}.ui-tooltip-tipped .ui-tooltip-content{background-color:#F9F9F9;color:#454545;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.ui-tooltip-tipped .ui-tooltip-icon{border:2px solid #285589;background:#285589;}.ui-tooltip-tipped .ui-tooltip-icon .ui-icon{background-color:#FBFBFB;color:#555;} \ No newline at end of file +.ui-tooltip-fluid{display:block;visibility:hidden;position:static!important;float:left!important;}.ui-tooltip,.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;}.ui-tooltip-content{position:relative;padding:5px 9px;overflow:hidden;border-width:1px;border-style:solid;text-align:left;word-wrap:break-word;overflow:hidden;}.ui-tooltip-titlebar{position:relative;min-height:14px;padding:5px 35px 5px 10px;overflow:hidden;border-width:1px 1px 0;border-style:solid;font-weight:bold;}.ui-tooltip-titlebar+.ui-tooltip-content{border-top-width:0!important;}/*!Default close button class */ .ui-tooltip-titlebar .ui-state-default{position:absolute;right:4px;top:50%;margin-top:-9px;cursor:pointer;outline:medium none;border-width:1px;border-style:solid;}* html .ui-tooltip-titlebar .ui-state-default{top:16px;}.ui-tooltip-titlebar .ui-icon,.ui-tooltip-icon .ui-icon{display:block;text-indent:-1000em;}.ui-tooltip-icon,.ui-tooltip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.ui-tooltip-icon .ui-icon{width:18px;height:14px;text-align:center;text-indent:0;font:normal bold 10px/13px Tahoma,sans-serif;color:inherit;background:transparent none no-repeat -100em -100em;}/*!Default tooltip style */ .ui-tooltip-titlebar,.ui-tooltip-content{border-color:#F1D031;background-color:#FFFFA3;color:#555;}.ui-tooltip-titlebar{background-color:#FFEF93;}.ui-tooltip-titlebar .ui-tooltip-icon{border-color:#CCC;background:#F1F1F1;color:#777;}.ui-tooltip-titlebar .ui-state-hover{border-color:#AAA;color:#111;}/*!Light tooltip style */ .ui-tooltip-light .ui-tooltip-titlebar,.ui-tooltip-light .ui-tooltip-content{border-color:#E2E2E2;color:#454545;}.ui-tooltip-light .ui-tooltip-content{background-color:white;}.ui-tooltip-light .ui-tooltip-titlebar{background-color:#f1f1f1;}/*!Dark tooltip style */ .ui-tooltip-dark .ui-tooltip-titlebar,.ui-tooltip-dark .ui-tooltip-content{border-color:#303030;color:#f3f3f3;}.ui-tooltip-dark .ui-tooltip-content{background-color:#505050;}.ui-tooltip-dark .ui-tooltip-titlebar{background-color:#404040;}.ui-tooltip-dark .ui-tooltip-icon{border-color:#444;}.ui-tooltip-dark .ui-tooltip-titlebar .ui-state-hover{border-color:#303030;}/*!Cream tooltip style */ .ui-tooltip-cream .ui-tooltip-titlebar,.ui-tooltip-cream .ui-tooltip-content{border-color:#F9E98E;color:#A27D35;}.ui-tooltip-cream .ui-tooltip-content{background-color:#FBF7AA;}.ui-tooltip-cream .ui-tooltip-titlebar{background-color:#F0DE7D;}.ui-tooltip-cream .ui-state-default .ui-tooltip-icon{background-position:-82px 0;}/*!Red tooltip style */ .ui-tooltip-red .ui-tooltip-titlebar,.ui-tooltip-red .ui-tooltip-content{border-color:#D95252;color:#912323;}.ui-tooltip-red .ui-tooltip-content{background-color:#F78B83;}.ui-tooltip-red .ui-tooltip-titlebar{background-color:#F06D65;}.ui-tooltip-red .ui-state-default .ui-tooltip-icon{background-position:-102px 0;}.ui-tooltip-red .ui-tooltip-icon{border-color:#D95252;}.ui-tooltip-red .ui-tooltip-titlebar .ui-state-hover{border-color:#D95252;}/*!Green tooltip style */ .ui-tooltip-green .ui-tooltip-titlebar,.ui-tooltip-green .ui-tooltip-content{border-color:#90D93F;color:#3F6219;}.ui-tooltip-green .ui-tooltip-content{background-color:#CAED9E;}.ui-tooltip-green .ui-tooltip-titlebar{background-color:#B0DE78;}.ui-tooltip-green .ui-state-default .ui-tooltip-icon{background-position:-42px 0;}/*!Blue tooltip style */ .ui-tooltip-blue .ui-tooltip-titlebar,.ui-tooltip-blue .ui-tooltip-content{border-color:#ADD9ED;color:#5E99BD;}.ui-tooltip-blue .ui-tooltip-content{background-color:#E5F6FE;}.ui-tooltip-blue .ui-tooltip-titlebar{background-color:#D0E9F5;}.ui-tooltip-blue .ui-state-default .ui-tooltip-icon{background-position:-2px 0;}.ui-tooltip .ui-tooltip-tip{margin:0 auto;overflow:hidden;background:transparent!important;border:0 dashed transparent!important;z-index:10;}.ui-tooltip .ui-tooltip-tip,.ui-tooltip .ui-tooltip-tip *{position:absolute;line-height:.1px!important;font-size:.1px!important;color:#123456;background:transparent;border:0 dashed transparent;}.ui-tooltip .ui-tooltip-tip canvas{position:static;}#qtip-overlay{position:absolute;left:-10000em;top:-10000em;background-color:black;opacity:.7;filter:alpha(opacity=70);-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";}/*!Add shadows to your tooltips in:FF3+,Chrome 2+,Opera 10.6+,IE6+,Safari 2+*/ .ui-tooltip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,0.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,0.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,0.15);}.ui-tooltip-shadow .ui-tooltip-titlebar,.ui-tooltip-shadow .ui-tooltip-content{filter:progid:DXImageTransform.Microsoft.Shadow(Color='gray',Direction=135,Strength=3);-ms-filter:"progid:DXImageTransform.Microsoft.Shadow(Color='gray',Direction=135,Strength=3)";_margin-bottom:-3px;.margin-bottom:-3px;}/*!Add rounded corners to your tooltips in:FF3+,Chrome 2+,Opera 10.6+,IE9+,Safari 2+*/ .ui-tooltip-rounded,.ui-tooltip-rounded .ui-tooltip-content,.ui-tooltip-tipsy,.ui-tooltip-tipsy .ui-tooltip-content,.ui-tooltip-youtube,.ui-tooltip-youtube .ui-tooltip-content{-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;}.ui-tooltip-rounded .ui-tooltip-titlebar,.ui-tooltip-tipsy .ui-tooltip-titlebar,.ui-tooltip-youtube .ui-tooltip-titlebar{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.ui-tooltip-rounded .ui-tooltip-titlebar+.ui-tooltip-content,.ui-tooltip-tipsy .ui-tooltip-titlebar+.ui-tooltip-content,.ui-tooltip-youtube .ui-tooltip-titlebar+.ui-tooltip-content{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;}/*!Youtube tooltip style */ .ui-tooltip-youtube{-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;}.ui-tooltip-youtube .ui-tooltip-titlebar,.ui-tooltip-youtube .ui-tooltip-content{background:transparent;background:rgba(0,0,0,0.85);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000)";color:white;border-color:#CCC;}.ui-tooltip-youtube .ui-tooltip-icon{border-color:#222;}.ui-tooltip-youtube .ui-tooltip-titlebar .ui-state-hover{border-color:#303030;}.ui-tooltip-jtools{background:#232323;background:rgba(0,0,0,0.7);background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333;}.ui-tooltip-jtools .ui-tooltip-titlebar{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)";}.ui-tooltip-jtools .ui-tooltip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)";}.ui-tooltip-jtools .ui-tooltip-titlebar,.ui-tooltip-jtools .ui-tooltip-content{background:transparent;color:white;border:0 dashed transparent;}.ui-tooltip-jtools .ui-tooltip-icon{border-color:#555;}.ui-tooltip-jtools .ui-tooltip-titlebar .ui-state-hover{border-color:#333;}.ui-tooltip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,0.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,0.4);box-shadow:4px 4px 5px rgba(0,0,0,0.4);}.ui-tooltip-cluetip .ui-tooltip-titlebar{background-color:#87876A;color:white;border:0 dashed transparent;}.ui-tooltip-cluetip .ui-tooltip-content{background-color:#D9D9C2;color:#111;border:0 dashed transparent;}.ui-tooltip-cluetip .ui-tooltip-icon{border-color:#808064;}.ui-tooltip-cluetip .ui-tooltip-titlebar .ui-state-hover{border-color:#696952;color:#696952;}.ui-tooltip-tipsy{border:0;}.ui-tooltip-tipsy .ui-tooltip-titlebar,.ui-tooltip-tipsy .ui-tooltip-content{background:transparent;background:rgba(0,0,0,.87);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000)";color:white;border:0 transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:bold;line-height:16px;text-shadow:0 1px black;}.ui-tooltip-tipsy .ui-tooltip-titlebar{padding:6px 35px 0 10;}.ui-tooltip-tipsy .ui-tooltip-content{padding:6px 10;}.ui-tooltip-tipsy .ui-tooltip-icon{border-color:#222;text-shadow:none;}.ui-tooltip-tipsy .ui-tooltip-titlebar .ui-state-hover{border-color:#303030;}.ui-tooltip-tipped .ui-tooltip-titlebar,.ui-tooltip-tipped .ui-tooltip-content{border:3px solid #959FA9;}.ui-tooltip-tipped .ui-tooltip-titlebar{background:#3A79B8;background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)";color:white;font-weight:normal;font-family:serif;border-bottom-width:0;-moz-border-radius:3px 3px 0 0;-webkit-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;}.ui-tooltip-tipped .ui-tooltip-content{background-color:#F9F9F9;color:#454545;-moz-border-radius:0 0 3px 3px;-webkit-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;}.ui-tooltip-tipped .ui-tooltip-icon{border:2px solid #285589;background:#285589;}.ui-tooltip-tipped .ui-tooltip-icon .ui-icon{background-color:#FBFBFB;color:#555;} \ No newline at end of file diff --git a/dist/jquery.qtip.min.js b/dist/jquery.qtip.min.js index 4a78c792..0bcd4632 100644 --- a/dist/jquery.qtip.min.js +++ b/dist/jquery.qtip.min.js @@ -9,5 +9,5 @@ * http://en.wikipedia.org/wiki/MIT_License * http://en.wikipedia.org/wiki/GNU_General_Public_License * -* Date: Sat Apr 23 00:41:47 2011 +0100 -*/"use strict",function(a,b,c){function z(b){var c=this,d=b.elements,e=d.tooltip,f=".bgiframe-"+b.id;a.extend(c,{init:function(){d.bgiframe=a(''),d.bgiframe.appendTo(e),e.bind("tooltipmove"+f,c.adjust)},adjust:function(){var a=b.get("dimensions"),c=b.plugins.tip,f=d.tip,g,h;h=parseInt(e.css("border-left-width"),10)||0,h={left:-h,top:-h},c&&f&&(g=c.corner.precedance==="x"?["width","left"]:["height","top"],h[g[1]]-=f[g[0]]()),d.bgiframe.css(h).css(a)},destroy:function(){d.bgiframe.remove(),e.unbind(f)}}),c.init()}function y(c){var f=this,g=c.options.show.modal,h=c.elements,i=h.tooltip,j="#qtip-overlay",k=".qtipmodal",l=k+c.id,m="is-modal-qtip",o;c.checks.modal={"^show.modal.(on|blur)$":function(){f.init(),h.overlay.toggle(i.is(":visible"))}},a.extend(f,{init:function(){if(!g.on)return f;o=f.create(),i.attr(m,d).unbind(k).unbind(l).bind("tooltipshow"+k+" tooltiphide"+k,function(a,b,c){f[a.type.replace("tooltip","")](c)}).bind("tooltipfocus"+k,function(a,b,c){o.css("z-index",c-1)}).bind("tooltipblur"+k,function(b){a("["+m+"]:visible").not(i).last().qtip("focus",b)}),g.escape&&a(b).unbind(l).bind("keydown"+l,function(a){a.keyCode===27&&i.hasClass(n)&&c.hide(a)}),g.blur&&h.overlay.unbind(l).bind("click"+l,function(a){i.hasClass(n)&&c.hide(a)});return f},create:function(){var c=a(j);if(c.length){h.overlay=c;return c}o=h.overlay=a("
",{id:j.substr(1),css:{position:"absolute",top:0,left:0,display:"none"},mousedown:function(){return e}}).appendTo(document.body),a(b).unbind(k).bind("resize"+k,function(){o.css({height:Math.max(a(b).height(),a(document).height()),width:Math.max(a(b).width(),a(document).width())})}).trigger("resize");return o},toggle:function(b){var c=g.effect,j=b?"show":"hide",k=a("["+m+"]:visible").not(i),l;o||(o=f.create());if(o.is(":animated")&&!b)return f;if(!b&&k.length)return f;b&&h.overlay.css("cursor",g.blur?"pointer":""),o.stop(d,e),a.isFunction(c)?c.call(o,b):c===e?o[j]():o.fadeTo(90,b?.7:0,function(){b||a(this).hide()});return f},show:function(){return f.toggle(d)},hide:function(){return f.toggle(e)},destroy:function(){var d=o;d&&(d=a("["+m+"]").not(i).length<1,d?(h.overlay.remove(),a(b).unbind(k)):h.overlay.unbind(k+c.id));return i.removeAttr(m).unbind(k)}}),f.init()}function x(b,g){function v(a){var b=a.precedance==="y",c=n[b?"width":"height"],d=n[b?"height":"width"],e=a.string().indexOf("center")>-1,f=c*(e?.5:1),g=Math.pow,h=Math.round,i,j,k,l=Math.sqrt(g(f,2)+g(d,2)),m=[p/f*l,p/d*l];m[2]=Math.sqrt(g(m[0],2)-g(p,2)),m[3]=Math.sqrt(g(m[1],2)-g(p,2)),i=l+m[2]+m[3]+(e?0:m[0]),j=i/l,k=[h(j*d),h(j*c)];return{height:k[b?0:1],width:k[b?1:0]}}function u(b){var c=k.titlebar&&b.y==="top",d=c?k.titlebar:k.content,e=a.browser.mozilla,f=e?"-moz-":a.browser.webkit?"-webkit-":"",g=b.y+(e?"":"-")+b.x,h=f+(e?"border-radius-"+g:"border-"+g+"-radius");return parseInt(d.css(h),10)||parseInt(l.css(h),10)||0}function t(a,b,c){b=b?b:a[a.precedance];var d=k.titlebar&&a.y==="top",e=d?k.titlebar:k.content,f="border-"+b+"-width",g=parseInt(e.css(f),10);return(c?g||parseInt(l.css(f),10):g)||0}function s(f,g,h,l){if(k.tip){var n=a.extend({},i.corner),o=h.adjusted,p=b.options.position.adjust.method.split(" "),q=p[0],r=p[1]||p[0],s={left:e,top:e,x:0,y:0},t,u={},v;i.corner.fixed!==d&&(q==="shift"&&n.precedance==="x"&&o.left&&n.y!=="center"?n.precedance=n.precedance==="x"?"y":"x":q==="flip"&&o.left&&(n.x=n.x==="center"?o.left>0?"left":"right":n.x==="left"?"right":"left"),r==="shift"&&n.precedance==="y"&&o.top&&n.x!=="center"?n.precedance=n.precedance==="y"?"x":"y":r==="flip"&&o.top&&(n.y=n.y==="center"?o.top>0?"top":"bottom":n.y==="top"?"bottom":"top"),n.string()!==m.corner&&(m.top!==o.top||m.left!==o.left)&&i.update(n,e)),t=i.position(n,o),t.right!==c&&(t.left=-t.right),t.bottom!==c&&(t.top=-t.bottom),t.user=Math.max(0,j.offset);if(s.left=q==="shift"&&!!o.left)n.x==="center"?u["margin-left"]=s.x=t["margin-left"]-o.left:(v=t.right!==c?[o.left,-t.left]:[-o.left,t.left],(s.x=Math.max(v[0],v[1]))>v[0]&&(h.left-=o.left,s.left=e),u[t.right!==c?"right":"left"]=s.x);if(s.top=r==="shift"&&!!o.top)n.y==="center"?u["margin-top"]=s.y=t["margin-top"]-o.top:(v=t.bottom!==c?[o.top,-t.top]:[-o.top,t.top],(s.y=Math.max(v[0],v[1]))>v[0]&&(h.top-=o.top,s.top=e),u[t.bottom!==c?"bottom":"top"]=s.y);k.tip.css(u).toggle(!(s.x&&s.y||n.x==="center"&&s.y||n.y==="center"&&s.x)),h.left-=t.left.charAt?t.user:q!=="shift"||s.top||!s.left&&!s.top?t.left:0,h.top-=t.top.charAt?t.user:r!=="shift"||s.left||!s.left&&!s.top?t.top:0,m.left=o.left,m.top=o.top,m.corner=n.string()}}var i=this,j=b.options.style.tip,k=b.elements,l=k.tooltip,m={top:0,left:0,corner:""},n={width:j.width,height:j.height},o={},p=j.border||0,q=".qtip-tip",r=a("")[0].getContext;i.corner=f,i.mimic=f,i.position={},b.checks.tip={"^position.my|style.tip.(corner|mimic|border)$":function(){i.init()||i.destroy(),b.reposition()},"^style.tip.(height|width)$":function(){n={width:j.width,height:j.height},i.create(),i.update(),b.reposition()},"^content.title.text|style.(classes|widget)$":function(){k.tip&&i.update()}},a.extend(i,{init:function(){var b=i.detectCorner()&&(r||a.browser.msie);b&&(i.create(),i.update(),l.unbind(q).bind("tooltipmove"+q,s));return b},detectCorner:function(){var a=j.corner,c=b.options.position,f=c.at,g=c.my.string?c.my.string():c.my;if(a===e||g===e&&f===e)return e;a===d?i.corner=new h.Corner(g):a.string||(i.corner=new h.Corner(a),i.corner.fixed=d);return i.corner.string()!=="centercenter"},detectColours:function(){var c,d,e,f=k.tip.css({backgroundColor:"",border:""}),g=i.corner,h=g[g.precedance],m="border-"+h+"-color",p="border"+h.charAt(0)+h.substr(1)+"Color",q=/rgba?\(0, 0, 0(, 0)?\)|transparent/i,r="background-color",s="transparent",t="ui-tooltip-fluid",u=a(document.body).css("color"),v=b.elements.content.css("color"),w=k.titlebar&&(g.y==="top"||g.y==="center"&&f.position().top+n.height/2+j.offset