docs: function(elem, types, handler, data) {
  		if ( elem.nodeType == 3 || elem.nodeType == 8 )
  			return;
  
  		// For whatever reason, IE has trouble passing the window object
  		// around, causing it to be cloned in the process
  		if ( elem.setInterval && elem != window )
  			elem = window;
  
  		// Make sure that the function being executed has a unique ID
  		if ( !handler.guid )
  			handler.guid = this.guid++;
  
  		// if data is passed, bind to handler
  		if ( data !== undefined ) {
  			// Create temporary function pointer to original handler
  			var fn = handler;
  
  			// Create unique handler function, wrapped around original handler
  			handler = this.proxy( fn );
  
  			// Store data in unique handler
  			handler.data = data;
  		}
  
  		// Init the element's event structure
  		var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
  			handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
  				// Handle the second event of a trigger and when
  				// an event is called after a page has unloaded
  				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
  					jQuery.event.handle.apply(arguments.callee.elem, arguments) :
  					undefined;
  			});
  		// Add elem as a property of the handle function
  		// This is to prevent a memory leak with non-native
  		// event in IE.
  		handle.elem = elem;
  
  		// Handle multiple events separated by a space
  		// jQuery(...).bind("mouseover mouseout", fn);
  		jQuery.each(types.split(/\s+/), function(index, type) {
  			// Namespaced event handlers
  			var namespaces = type.split(".");
  			type = namespaces.shift();
  			handler.type = namespaces.slice().sort().join(".");
  
  			// Get the current list of functions bound to this event
  			var handlers = events[type];
  			
  			if ( jQuery.event.specialAll[type] )
  				jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
  
  			// Init the event handler queue
  			if (!handlers) {
  				handlers = events[type] = {};
  
  				// Check for a special event handler
  				// Only use addEventListener/attachEvent if the special
  				// events handler returns false
  				if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
  					// Bind the global event handler to the element
  					if (elem.addEventListener)
  						elem.addEventListener(type, handle, false);
  					else if (elem.attachEvent)
  						elem.attachEvent("on" + type, handle);
  				}
  			}
  
  			// Add the function to the element's handler list
  			handlers[handler.guid] = handler;
  
  			// Keep track of which events have been used, for global triggering
  			jQuery.event.global[type] = true;
  		});
  
  		// Nullify elem to prevent memory leaks in IE
  		elem = null;
  	}