- one: function( type, data, fn ) {
- var one = jQuery.event.proxy( fn || data, function( event ) {
- jQuery( this ).unbind( event, one );
- return (fn || data).apply( this, arguments );
- });
- return this.each(function() {
- jQuery.event.add( this, type, one, fn && data );
- });
+ 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.
+if ( !jQuery.support.changeBubbles ) {
+
+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 );
+ }
+ }
+ },
+ beforeactivate: function( e ) {
+ var elem = e.target;
+
+ if ( elem.nodeName.toLowerCase() === "input" && elem.type === "radio" && !elem.checked ) {
+ return trigger( "change", this, arguments );
+ }
+ },
+ blur: function( e ) {
+ var elem = e.target, nodeName = elem.nodeName.toLowerCase();
+
+ if ( (nodeName === "textarea" || (nodeName === "input" && (elem.type === "text" || elem.type === "password")))
+ && jQuery.data(elem, "_change_data") !== elem.value ) {
+
+ return trigger( "change", this, arguments );
+ }
+ },
+ focus: function( e ) {
+ var elem = e.target, nodeName = elem.nodeName.toLowerCase();
+
+ if ( nodeName === "textarea" || (nodeName === "input" && (elem.type === "text" || elem.type === "password" ) ) ) {
+ jQuery.data( elem, "_change_data", elem.value );
+ }
+ }
+ },
+ setup: function( data, namespaces, fn ) {
+ for ( var type in changeFilters ) {
+ jQuery.event.add( this, type + ".specialChange." + fn.guid, changeFilters[type] );
+ }
+
+ // always want to listen for change for trigger
+ return false;