|  | define( [ | 
|  | "../core", | 
|  | "../core/stripAndCollapse", | 
|  | "../var/isFunction", | 
|  | "../var/rnothtmlwhite", | 
|  | "../data/var/dataPriv", | 
|  | "../core/init" | 
|  | ], function( jQuery, stripAndCollapse, isFunction, rnothtmlwhite, dataPriv ) { | 
|  |  | 
|  | "use strict"; | 
|  |  | 
|  | function getClass( elem ) { | 
|  | return elem.getAttribute && elem.getAttribute( "class" ) || ""; | 
|  | } | 
|  |  | 
|  | function classesToArray( value ) { | 
|  | if ( Array.isArray( value ) ) { | 
|  | return value; | 
|  | } | 
|  | if ( typeof value === "string" ) { | 
|  | return value.match( rnothtmlwhite ) || []; | 
|  | } | 
|  | return []; | 
|  | } | 
|  |  | 
|  | jQuery.fn.extend( { | 
|  | addClass: function( value ) { | 
|  | var classNames, cur, curValue, className, i, finalValue; | 
|  |  | 
|  | if ( isFunction( value ) ) { | 
|  | return this.each( function( j ) { | 
|  | jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); | 
|  | } ); | 
|  | } | 
|  |  | 
|  | classNames = classesToArray( value ); | 
|  |  | 
|  | if ( classNames.length ) { | 
|  | return this.each( function() { | 
|  | curValue = getClass( this ); | 
|  | cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); | 
|  |  | 
|  | if ( cur ) { | 
|  | for ( i = 0; i < classNames.length; i++ ) { | 
|  | className = classNames[ i ]; | 
|  | if ( cur.indexOf( " " + className + " " ) < 0 ) { | 
|  | cur += className + " "; | 
|  | } | 
|  | } | 
|  |  | 
|  | // Only assign if different to avoid unneeded rendering. | 
|  | finalValue = stripAndCollapse( cur ); | 
|  | if ( curValue !== finalValue ) { | 
|  | this.setAttribute( "class", finalValue ); | 
|  | } | 
|  | } | 
|  | } ); | 
|  | } | 
|  |  | 
|  | return this; | 
|  | }, | 
|  |  | 
|  | removeClass: function( value ) { | 
|  | var classNames, cur, curValue, className, i, finalValue; | 
|  |  | 
|  | if ( isFunction( value ) ) { | 
|  | return this.each( function( j ) { | 
|  | jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); | 
|  | } ); | 
|  | } | 
|  |  | 
|  | if ( !arguments.length ) { | 
|  | return this.attr( "class", "" ); | 
|  | } | 
|  |  | 
|  | classNames = classesToArray( value ); | 
|  |  | 
|  | if ( classNames.length ) { | 
|  | return this.each( function() { | 
|  | curValue = getClass( this ); | 
|  |  | 
|  | // This expression is here for better compressibility (see addClass) | 
|  | cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); | 
|  |  | 
|  | if ( cur ) { | 
|  | for ( i = 0; i < classNames.length; i++ ) { | 
|  | className = classNames[ i ]; | 
|  |  | 
|  | // Remove *all* instances | 
|  | while ( cur.indexOf( " " + className + " " ) > -1 ) { | 
|  | cur = cur.replace( " " + className + " ", " " ); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Only assign if different to avoid unneeded rendering. | 
|  | finalValue = stripAndCollapse( cur ); | 
|  | if ( curValue !== finalValue ) { | 
|  | this.setAttribute( "class", finalValue ); | 
|  | } | 
|  | } | 
|  | } ); | 
|  | } | 
|  |  | 
|  | return this; | 
|  | }, | 
|  |  | 
|  | toggleClass: function( value, stateVal ) { | 
|  | var classNames, className, i, self, | 
|  | type = typeof value, | 
|  | isValidValue = type === "string" || Array.isArray( value ); | 
|  |  | 
|  | if ( isFunction( value ) ) { | 
|  | return this.each( function( i ) { | 
|  | jQuery( this ).toggleClass( | 
|  | value.call( this, i, getClass( this ), stateVal ), | 
|  | stateVal | 
|  | ); | 
|  | } ); | 
|  | } | 
|  |  | 
|  | if ( typeof stateVal === "boolean" && isValidValue ) { | 
|  | return stateVal ? this.addClass( value ) : this.removeClass( value ); | 
|  | } | 
|  |  | 
|  | classNames = classesToArray( value ); | 
|  |  | 
|  | return this.each( function() { | 
|  | if ( isValidValue ) { | 
|  |  | 
|  | // Toggle individual class names | 
|  | self = jQuery( this ); | 
|  |  | 
|  | for ( i = 0; i < classNames.length; i++ ) { | 
|  | className = classNames[ i ]; | 
|  |  | 
|  | // Check each className given, space separated list | 
|  | if ( self.hasClass( className ) ) { | 
|  | self.removeClass( className ); | 
|  | } else { | 
|  | self.addClass( className ); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Toggle whole class name | 
|  | } else if ( value === undefined || type === "boolean" ) { | 
|  | className = getClass( this ); | 
|  | if ( className ) { | 
|  |  | 
|  | // Store className if set | 
|  | dataPriv.set( this, "__className__", className ); | 
|  | } | 
|  |  | 
|  | // If the element has a class name or if we're passed `false`, | 
|  | // then remove the whole classname (if there was one, the above saved it). | 
|  | // Otherwise bring back whatever was previously saved (if anything), | 
|  | // falling back to the empty string if nothing was stored. | 
|  | if ( this.setAttribute ) { | 
|  | this.setAttribute( "class", | 
|  | className || value === false ? | 
|  | "" : | 
|  | dataPriv.get( this, "__className__" ) || "" | 
|  | ); | 
|  | } | 
|  | } | 
|  | } ); | 
|  | }, | 
|  |  | 
|  | hasClass: function( selector ) { | 
|  | var className, elem, | 
|  | i = 0; | 
|  |  | 
|  | className = " " + selector + " "; | 
|  | while ( ( elem = this[ i++ ] ) ) { | 
|  | if ( elem.nodeType === 1 && | 
|  | ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { | 
|  | return true; | 
|  | } | 
|  | } | 
|  |  | 
|  | return false; | 
|  | } | 
|  | } ); | 
|  |  | 
|  | } ); |