+
+// Create mouseenter and mouseleave events
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ setup: function(data){
+ jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
+ },
+ teardown: function(data){
+ jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
+ }
+ };
+});
+
+// submit delegation
+jQuery.event.special.submit = {
+ setup: function( data, namespaces, fn ) {
+ if ( !jQuery.support.submitBubbles && this.nodeName.toLowerCase() !== "form" ) {
+ jQuery.event.add(this, "click.specialSubmit." + fn.guid, function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
+ return trigger( "submit", this, arguments );
+ }
+ });
+
+ jQuery.event.add(this, "keypress.specialSubmit." + fn.guid, function( e ) {
+ var elem = e.target, type = elem.type;
+
+ if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
+ return trigger( "submit", this, arguments );
+ }
+ });
+ }
+
+ return false;
+ },
+
+ remove: function( namespaces, fn ) {
+ jQuery.event.remove( this, "click.specialSubmit" + (fn ? "."+fn.guid : "") );
+ jQuery.event.remove( this, "keypress.specialSubmit" + (fn ? "."+fn.guid : "") );
+ }
+};
+
+// change delegation, happens here so we have bind.
+jQuery.event.special.change = {
+ filters: {
+ click: function( e ) {
+ var elem = e.target;
+
+ if ( elem.nodeName.toLowerCase() === "input" && elem.type === "checkbox" ) {
+ return trigger( "change", this, arguments );
+ }
+
+ return changeFilters.keyup.call( this, e );
+ },
+ keyup: function( e ) {
+ var elem = e.target, data, index = elem.selectedIndex + "";
+
+ if ( elem.nodeName.toLowerCase() === "select" ) {
+ data = jQuery.data( elem, "_change_data" );
+ jQuery.data( elem, "_change_data", index );
+
+ if ( (elem.type === "select-multiple" || data != null) && data !== index ) {
+ return trigger( "change", this, arguments );
+ }
+ }