+function liveHandler( event ) {
+ var stop = true, elems = [], args = arguments;
+
+ jQuery.each( jQuery.data( this, "events" ).live || [], function( i, fn ) {
+ if ( fn.live === event.type ) {
+ var elem = jQuery( event.target ).closest( fn.selector, event.currentTarget )[0],
+ related;
+ if ( elem ) {
+ // Those two events require additional checking
+ if ( fn.live === "mouseenter" || fn.live === "mouseleave" ) {
+ related = jQuery( event.relatedTarget ).closest( fn.selector )[0];
+ }
+
+ if ( !related || related !== elem ) {
+ elems.push({ elem: elem, fn: fn });
+ }
+ }
+ }
+ });
+
+ elems.sort(function( a, b ) {
+ return a.closer - b.closer;
+ });
+
+ jQuery.each(elems, function() {
+ event.currentTarget = this.elem;
+ event.data = this.fn.data;
+ if ( this.fn.apply( this.elem, args ) === false ) {
+ return (stop = false);
+ }
+ });
+
+ return stop;
+}
+
+function liveConvert( type, selector ) {
+ return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
+}
+