diff options
Diffstat (limited to 'src/main/webapp/jquery-ui-1.9pre/ui/jquery.ui.tooltip.js')
-rw-r--r-- | src/main/webapp/jquery-ui-1.9pre/ui/jquery.ui.tooltip.js | 223 |
1 files changed, 223 insertions, 0 deletions
diff --git a/src/main/webapp/jquery-ui-1.9pre/ui/jquery.ui.tooltip.js b/src/main/webapp/jquery-ui-1.9pre/ui/jquery.ui.tooltip.js new file mode 100644 index 0000000..05ce841 --- /dev/null +++ b/src/main/webapp/jquery-ui-1.9pre/ui/jquery.ui.tooltip.js @@ -0,0 +1,223 @@ +/* + * jQuery UI Tooltip 1.9pre + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tooltip + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.position.js + */ +(function( $ ) { + +var increments = 0; + +$.widget( "ui.tooltip", { + version: "1.9pre", + options: { + content: function() { + return $( this ).attr( "title" ); + }, + hide: true, + items: "[title]", + position: { + my: "left+15 center", + at: "right center", + collision: "flipfit flipfit" + }, + show: true, + tooltipClass: null, + + // callbacks + close: null, + open: null + }, + + _create: function() { + this._bind({ + mouseover: "open", + focusin: "open" + }); + + // IDs of generated tooltips, needed for destroy + this.tooltips = {}; + }, + + _setOption: function( key, value ) { + if ( key === "disabled" ) { + this[ value ? "_disable" : "_enable" ](); + this.options[ key ] = value; + // disable element style changes + return; + } + this._super( key, value ); + }, + + _disable: function() { + var that = this; + + // close open tooltips + $.each( this.tooltips, function( id, element ) { + var event = $.Event( "blur" ); + event.target = event.currentTarget = element[0]; + that.close( event, true ); + }); + + // remove title attributes to prevent native tooltips + this.element.find( this.options.items ).andSelf().each(function() { + var element = $( this ); + if ( element.is( "[title]" ) ) { + element + .data( "tooltip-title", element.attr( "title" ) ) + .attr( "title", "" ); + } + }); + }, + + _enable: function() { + // restore title attributes + this.element.find( this.options.items ).andSelf().each(function() { + var element = $( this ); + if ( element.data( "tooltip-title" ) ) { + element.attr( "title", element.data( "tooltip-title" ) ); + } + }); + }, + + open: function( event ) { + var content, + that = this, + target = $( event ? event.target : this.element ) + .closest( this.options.items ); + + // if aria-describedby exists, then the tooltip is already open + if ( !target.length || target.attr( "aria-describedby" ) ) { + return; + } + + if ( !target.data( "tooltip-title" ) ) { + target.data( "tooltip-title", target.attr( "title" ) ); + } + + content = this.options.content.call( target[0], function( response ) { + // IE may instantly serve a cached response for ajax requests + // delay this call to _open so the other call to _open runs first + setTimeout(function() { + that._open( event, target, response ); + }, 1 ); + }); + if ( content ) { + that._open( event, target, content ); + } + }, + + _open: function( event, target, content ) { + if ( !content ) { + return; + } + + // if we have a title, clear it to prevent the native tooltip + // we have to check first to avoid defining a title if none exists + // (we don't want to cause an element to start matching [title]) + // TODO: document why we don't use .removeAttr() + if ( target.is( "[title]" ) ) { + target.attr( "title", "" ); + } + + // ajaxy tooltip can update an existing one + var tooltip = this._find( target ); + if ( !tooltip.length ) { + tooltip = this._tooltip( target ); + target.attr( "aria-describedby", tooltip.attr( "id" ) ); + } + tooltip.find( ".ui-tooltip-content" ).html( content ); + tooltip + .stop( true ) + .position( $.extend({ + of: target + }, this.options.position ) ) + .hide(); + + this._show( tooltip, this.options.show ); + + this._trigger( "open", event, { tooltip: tooltip } ); + + this._bind( target, { + mouseleave: "close", + blur: "close", + keyup: function( event ) { + if ( event.keyCode == $.ui.keyCode.ESCAPE ) { + var fakeEvent = $.Event(event); + fakeEvent.currentTarget = target[0]; + this.close( fakeEvent, true ); + } + } + }); + }, + + close: function( event, force ) { + var that = this, + target = $( event ? event.currentTarget : this.element ), + tooltip = this._find( target ); + + // don't close if the element has focus + // this prevents the tooltip from closing if you hover while focused + if ( !force && this.document[0].activeElement === target[0] ) { + return; + } + + // only set title if we had one before (see comment in _open()) + if ( target.data( "tooltip-title" ) ) { + target.attr( "title", target.data( "tooltip-title" ) ); + } + + target.removeAttr( "aria-describedby" ); + + tooltip.stop( true ); + this._hide( tooltip, this.options.hide, function() { + $( this ).remove(); + delete that.tooltips[ this.id ]; + }); + + target.unbind( "mouseleave.tooltip blur.tooltip keyup.tooltip" ); + + this._trigger( "close", event, { tooltip: tooltip } ); + }, + + _tooltip: function( element ) { + var id = "ui-tooltip-" + increments++, + tooltip = $( "<div>" ) + .attr({ + id: id, + role: "tooltip" + }) + .addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " + + ( this.options.tooltipClass || "" ) ); + $( "<div>" ) + .addClass( "ui-tooltip-content" ) + .appendTo( tooltip ); + tooltip.appendTo( this.document[0].body ); + if ( $.fn.bgiframe ) { + tooltip.bgiframe(); + } + this.tooltips[ id ] = element; + return tooltip; + }, + + _find: function( target ) { + var id = target.attr( "aria-describedby" ); + return id ? $( "#" + id ) : $(); + }, + + _destroy: function() { + $.each( this.tooltips, function( id ) { + $( "#" + id ).remove(); + }); + } +}); + +}( jQuery ) ); |