define( [

"../core",
"../css/finalPropName",

"../css"

], function( jQuery, finalPropName ) {

“use strict”;

function Tween( elem, options, prop, end, easing ) {

return new Tween.prototype.init( elem, options, prop, end, easing );

} jQuery.Tween = Tween;

Tween.prototype = {

constructor: Tween,
init: function( elem, options, prop, end, easing, unit ) {
        this.elem = elem;
        this.prop = prop;
        this.easing = easing || jQuery.easing._default;
        this.options = options;
        this.start = this.now = this.cur();
        this.end = end;
        this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
},
cur: function() {
        var hooks = Tween.propHooks[ this.prop ];

        return hooks && hooks.get ?
                hooks.get( this ) :
                Tween.propHooks._default.get( this );
},
run: function( percent ) {
        var eased,
                hooks = Tween.propHooks[ this.prop ];

        if ( this.options.duration ) {
                this.pos = eased = jQuery.easing[ this.easing ](
                        percent, this.options.duration * percent, 0, 1, this.options.duration
                );
        } else {
                this.pos = eased = percent;
        }
        this.now = ( this.end - this.start ) * eased + this.start;

        if ( this.options.step ) {
                this.options.step.call( this.elem, this.now, this );
        }

        if ( hooks && hooks.set ) {
                hooks.set( this );
        } else {
                Tween.propHooks._default.set( this );
        }
        return this;
}

};

Tween.prototype.init.prototype = Tween.prototype;

Tween.propHooks = {

_default: {
        get: function( tween ) {
                var result;

                // Use a property on the element directly when it is not a DOM element,
                // or when there is no matching style property that exists.
                if ( tween.elem.nodeType !== 1 ||
                        tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
                        return tween.elem[ tween.prop ];
                }

                // Passing an empty string as a 3rd parameter to .css will automatically
                // attempt a parseFloat and fallback to a string if the parse fails.
                // Simple values such as "10px" are parsed to Float;
                // complex values such as "rotate(1rad)" are returned as-is.
                result = jQuery.css( tween.elem, tween.prop, "" );

                // Empty strings, null, undefined and "auto" are converted to 0.
                return !result || result === "auto" ? 0 : result;
        },
        set: function( tween ) {

                // Use step hook for back compat.
                // Use cssHook if its there.
                // Use .style if available and use plain properties where available.
                if ( jQuery.fx.step[ tween.prop ] ) {
                        jQuery.fx.step[ tween.prop ]( tween );
                } else if ( tween.elem.nodeType === 1 && (
                                jQuery.cssHooks[ tween.prop ] ||
                                tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
                        jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
                } else {
                        tween.elem[ tween.prop ] = tween.now;
                }
        }
}

};

// Support: IE <=9 only // Panic based approach to setting things on disconnected nodes Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {

set: function( tween ) {
        if ( tween.elem.nodeType && tween.elem.parentNode ) {
                tween.elem[ tween.prop ] = tween.now;
        }
}

};

jQuery.easing = {

linear: function( p ) {
        return p;
},
swing: function( p ) {
        return 0.5 - Math.cos( p * Math.PI ) / 2;
},
_default: "swing"

};

jQuery.fx = Tween.prototype.init;

// Back compat <1.8 extension point jQuery.fx.step = {};

} );