docs: function( event, data, elem, bubbling ) {
  		// Event object or event type
  		var type = event.type || event;
  
  		if( !bubbling ){
  			event = typeof event === "object" ?
  				// jQuery.Event object
  				event[expando] ? event :
  				// Object literal
  				jQuery.extend( jQuery.Event(type), event ) :
  				// Just the event type (string)
  				jQuery.Event(type);
  
  			if ( type.indexOf("!") >= 0 ) {
  				event.type = type = type.slice(0, -1);
  				event.exclusive = true;
  			}
  
  			// Handle a global trigger
  			if ( !elem ) {
  				// Don't bubble custom events when global (to avoid too much overhead)
  				event.stopPropagation();
  				// Only trigger if we've ever bound an event for it
  				if ( this.global[type] )
  					jQuery.each( jQuery.cache, function(){
  						if ( this.events && this.events[type] )
  							jQuery.event.trigger( event, data, this.handle.elem );
  					});
  			}
  
  			// Handle triggering a single element
  
  			// don't do events on text and comment nodes
  			if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
  				return undefined;
  			
  			// Clean up in case it is reused
  			event.result = undefined;
  			event.target = elem;
  			
  			// Clone the incoming data, if any
  			data = jQuery.makeArray(data);
  			data.unshift( event );
  		}
  
  		event.currentTarget = elem;
  
  		// Trigger the event, it is assumed that "handle" is a function
  		var handle = jQuery.data(elem, "handle");
  		if ( handle )
  			handle.apply( elem, data );
  
  		// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
  		if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
  			event.result = false;
  
  		// Trigger the native events (except for clicks on links)
  		if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
  			this.triggered = true;
  			try {
  				elem[ type ]();
  			// prevent IE from throwing an error for some hidden elements
  			} catch (e) {}
  		}
  
  		this.triggered = false;
  
  		if ( !event.isPropagationStopped() ) {
  			var parent = elem.parentNode || elem.ownerDocument;
  			if ( parent )
  				jQuery.event.trigger(event, data, parent, true);
  		}
  	}