Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14217 anikendra 1
define([
2
	"./core",
3
	"./var/pnum",
4
	"./css/var/cssExpand",
5
	"./css/var/isHidden",
6
	"./css/defaultDisplay",
7
	"./data/var/data_priv",
8
 
9
	"./core/init",
10
	"./effects/Tween",
11
	"./queue",
12
	"./css",
13
	"./deferred",
14
	"./traversing"
15
], function( jQuery, pnum, cssExpand, isHidden, defaultDisplay, data_priv ) {
16
 
17
var
18
	fxNow, timerId,
19
	rfxtypes = /^(?:toggle|show|hide)$/,
20
	rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
21
	rrun = /queueHooks$/,
22
	animationPrefilters = [ defaultPrefilter ],
23
	tweeners = {
24
		"*": [ function( prop, value ) {
25
			var tween = this.createTween( prop, value ),
26
				target = tween.cur(),
27
				parts = rfxnum.exec( value ),
28
				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
29
 
30
				// Starting value computation is required for potential unit mismatches
31
				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
32
					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
33
				scale = 1,
34
				maxIterations = 20;
35
 
36
			if ( start && start[ 3 ] !== unit ) {
37
				// Trust units reported by jQuery.css
38
				unit = unit || start[ 3 ];
39
 
40
				// Make sure we update the tween properties later on
41
				parts = parts || [];
42
 
43
				// Iteratively approximate from a nonzero starting point
44
				start = +target || 1;
45
 
46
				do {
47
					// If previous iteration zeroed out, double until we get *something*.
48
					// Use string for doubling so we don't accidentally see scale as unchanged below
49
					scale = scale || ".5";
50
 
51
					// Adjust and apply
52
					start = start / scale;
53
					jQuery.style( tween.elem, prop, start + unit );
54
 
55
				// Update scale, tolerating zero or NaN from tween.cur(),
56
				// break the loop if scale is unchanged or perfect, or if we've just had enough
57
				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
58
			}
59
 
60
			// Update tween properties
61
			if ( parts ) {
62
				start = tween.start = +start || +target || 0;
63
				tween.unit = unit;
64
				// If a +=/-= token was provided, we're doing a relative animation
65
				tween.end = parts[ 1 ] ?
66
					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
67
					+parts[ 2 ];
68
			}
69
 
70
			return tween;
71
		} ]
72
	};
73
 
74
// Animations created synchronously will run synchronously
75
function createFxNow() {
76
	setTimeout(function() {
77
		fxNow = undefined;
78
	});
79
	return ( fxNow = jQuery.now() );
80
}
81
 
82
// Generate parameters to create a standard animation
83
function genFx( type, includeWidth ) {
84
	var which,
85
		i = 0,
86
		attrs = { height: type };
87
 
88
	// If we include width, step value is 1 to do all cssExpand values,
89
	// otherwise step value is 2 to skip over Left and Right
90
	includeWidth = includeWidth ? 1 : 0;
91
	for ( ; i < 4 ; i += 2 - includeWidth ) {
92
		which = cssExpand[ i ];
93
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
94
	}
95
 
96
	if ( includeWidth ) {
97
		attrs.opacity = attrs.width = type;
98
	}
99
 
100
	return attrs;
101
}
102
 
103
function createTween( value, prop, animation ) {
104
	var tween,
105
		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
106
		index = 0,
107
		length = collection.length;
108
	for ( ; index < length; index++ ) {
109
		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
110
 
111
			// We're done with this property
112
			return tween;
113
		}
114
	}
115
}
116
 
117
function defaultPrefilter( elem, props, opts ) {
118
	/* jshint validthis: true */
119
	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
120
		anim = this,
121
		orig = {},
122
		style = elem.style,
123
		hidden = elem.nodeType && isHidden( elem ),
124
		dataShow = data_priv.get( elem, "fxshow" );
125
 
126
	// Handle queue: false promises
127
	if ( !opts.queue ) {
128
		hooks = jQuery._queueHooks( elem, "fx" );
129
		if ( hooks.unqueued == null ) {
130
			hooks.unqueued = 0;
131
			oldfire = hooks.empty.fire;
132
			hooks.empty.fire = function() {
133
				if ( !hooks.unqueued ) {
134
					oldfire();
135
				}
136
			};
137
		}
138
		hooks.unqueued++;
139
 
140
		anim.always(function() {
141
			// Ensure the complete handler is called before this completes
142
			anim.always(function() {
143
				hooks.unqueued--;
144
				if ( !jQuery.queue( elem, "fx" ).length ) {
145
					hooks.empty.fire();
146
				}
147
			});
148
		});
149
	}
150
 
151
	// Height/width overflow pass
152
	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
153
		// Make sure that nothing sneaks out
154
		// Record all 3 overflow attributes because IE9-10 do not
155
		// change the overflow attribute when overflowX and
156
		// overflowY are set to the same value
157
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
158
 
159
		// Set display property to inline-block for height/width
160
		// animations on inline elements that are having width/height animated
161
		display = jQuery.css( elem, "display" );
162
 
163
		// Test default display if display is currently "none"
164
		checkDisplay = display === "none" ?
165
			data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
166
 
167
		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
168
			style.display = "inline-block";
169
		}
170
	}
171
 
172
	if ( opts.overflow ) {
173
		style.overflow = "hidden";
174
		anim.always(function() {
175
			style.overflow = opts.overflow[ 0 ];
176
			style.overflowX = opts.overflow[ 1 ];
177
			style.overflowY = opts.overflow[ 2 ];
178
		});
179
	}
180
 
181
	// show/hide pass
182
	for ( prop in props ) {
183
		value = props[ prop ];
184
		if ( rfxtypes.exec( value ) ) {
185
			delete props[ prop ];
186
			toggle = toggle || value === "toggle";
187
			if ( value === ( hidden ? "hide" : "show" ) ) {
188
 
189
				// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
190
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
191
					hidden = true;
192
				} else {
193
					continue;
194
				}
195
			}
196
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
197
 
198
		// Any non-fx value stops us from restoring the original display value
199
		} else {
200
			display = undefined;
201
		}
202
	}
203
 
204
	if ( !jQuery.isEmptyObject( orig ) ) {
205
		if ( dataShow ) {
206
			if ( "hidden" in dataShow ) {
207
				hidden = dataShow.hidden;
208
			}
209
		} else {
210
			dataShow = data_priv.access( elem, "fxshow", {} );
211
		}
212
 
213
		// Store state if its toggle - enables .stop().toggle() to "reverse"
214
		if ( toggle ) {
215
			dataShow.hidden = !hidden;
216
		}
217
		if ( hidden ) {
218
			jQuery( elem ).show();
219
		} else {
220
			anim.done(function() {
221
				jQuery( elem ).hide();
222
			});
223
		}
224
		anim.done(function() {
225
			var prop;
226
 
227
			data_priv.remove( elem, "fxshow" );
228
			for ( prop in orig ) {
229
				jQuery.style( elem, prop, orig[ prop ] );
230
			}
231
		});
232
		for ( prop in orig ) {
233
			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
234
 
235
			if ( !( prop in dataShow ) ) {
236
				dataShow[ prop ] = tween.start;
237
				if ( hidden ) {
238
					tween.end = tween.start;
239
					tween.start = prop === "width" || prop === "height" ? 1 : 0;
240
				}
241
			}
242
		}
243
 
244
	// If this is a noop like .hide().hide(), restore an overwritten display value
245
	} else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
246
		style.display = display;
247
	}
248
}
249
 
250
function propFilter( props, specialEasing ) {
251
	var index, name, easing, value, hooks;
252
 
253
	// camelCase, specialEasing and expand cssHook pass
254
	for ( index in props ) {
255
		name = jQuery.camelCase( index );
256
		easing = specialEasing[ name ];
257
		value = props[ index ];
258
		if ( jQuery.isArray( value ) ) {
259
			easing = value[ 1 ];
260
			value = props[ index ] = value[ 0 ];
261
		}
262
 
263
		if ( index !== name ) {
264
			props[ name ] = value;
265
			delete props[ index ];
266
		}
267
 
268
		hooks = jQuery.cssHooks[ name ];
269
		if ( hooks && "expand" in hooks ) {
270
			value = hooks.expand( value );
271
			delete props[ name ];
272
 
273
			// Not quite $.extend, this won't overwrite existing keys.
274
			// Reusing 'index' because we have the correct "name"
275
			for ( index in value ) {
276
				if ( !( index in props ) ) {
277
					props[ index ] = value[ index ];
278
					specialEasing[ index ] = easing;
279
				}
280
			}
281
		} else {
282
			specialEasing[ name ] = easing;
283
		}
284
	}
285
}
286
 
287
function Animation( elem, properties, options ) {
288
	var result,
289
		stopped,
290
		index = 0,
291
		length = animationPrefilters.length,
292
		deferred = jQuery.Deferred().always( function() {
293
			// Don't match elem in the :animated selector
294
			delete tick.elem;
295
		}),
296
		tick = function() {
297
			if ( stopped ) {
298
				return false;
299
			}
300
			var currentTime = fxNow || createFxNow(),
301
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
302
				// Support: Android 2.3
303
				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
304
				temp = remaining / animation.duration || 0,
305
				percent = 1 - temp,
306
				index = 0,
307
				length = animation.tweens.length;
308
 
309
			for ( ; index < length ; index++ ) {
310
				animation.tweens[ index ].run( percent );
311
			}
312
 
313
			deferred.notifyWith( elem, [ animation, percent, remaining ]);
314
 
315
			if ( percent < 1 && length ) {
316
				return remaining;
317
			} else {
318
				deferred.resolveWith( elem, [ animation ] );
319
				return false;
320
			}
321
		},
322
		animation = deferred.promise({
323
			elem: elem,
324
			props: jQuery.extend( {}, properties ),
325
			opts: jQuery.extend( true, { specialEasing: {} }, options ),
326
			originalProperties: properties,
327
			originalOptions: options,
328
			startTime: fxNow || createFxNow(),
329
			duration: options.duration,
330
			tweens: [],
331
			createTween: function( prop, end ) {
332
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
333
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
334
				animation.tweens.push( tween );
335
				return tween;
336
			},
337
			stop: function( gotoEnd ) {
338
				var index = 0,
339
					// If we are going to the end, we want to run all the tweens
340
					// otherwise we skip this part
341
					length = gotoEnd ? animation.tweens.length : 0;
342
				if ( stopped ) {
343
					return this;
344
				}
345
				stopped = true;
346
				for ( ; index < length ; index++ ) {
347
					animation.tweens[ index ].run( 1 );
348
				}
349
 
350
				// Resolve when we played the last frame; otherwise, reject
351
				if ( gotoEnd ) {
352
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
353
				} else {
354
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
355
				}
356
				return this;
357
			}
358
		}),
359
		props = animation.props;
360
 
361
	propFilter( props, animation.opts.specialEasing );
362
 
363
	for ( ; index < length ; index++ ) {
364
		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
365
		if ( result ) {
366
			return result;
367
		}
368
	}
369
 
370
	jQuery.map( props, createTween, animation );
371
 
372
	if ( jQuery.isFunction( animation.opts.start ) ) {
373
		animation.opts.start.call( elem, animation );
374
	}
375
 
376
	jQuery.fx.timer(
377
		jQuery.extend( tick, {
378
			elem: elem,
379
			anim: animation,
380
			queue: animation.opts.queue
381
		})
382
	);
383
 
384
	// attach callbacks from options
385
	return animation.progress( animation.opts.progress )
386
		.done( animation.opts.done, animation.opts.complete )
387
		.fail( animation.opts.fail )
388
		.always( animation.opts.always );
389
}
390
 
391
jQuery.Animation = jQuery.extend( Animation, {
392
 
393
	tweener: function( props, callback ) {
394
		if ( jQuery.isFunction( props ) ) {
395
			callback = props;
396
			props = [ "*" ];
397
		} else {
398
			props = props.split(" ");
399
		}
400
 
401
		var prop,
402
			index = 0,
403
			length = props.length;
404
 
405
		for ( ; index < length ; index++ ) {
406
			prop = props[ index ];
407
			tweeners[ prop ] = tweeners[ prop ] || [];
408
			tweeners[ prop ].unshift( callback );
409
		}
410
	},
411
 
412
	prefilter: function( callback, prepend ) {
413
		if ( prepend ) {
414
			animationPrefilters.unshift( callback );
415
		} else {
416
			animationPrefilters.push( callback );
417
		}
418
	}
419
});
420
 
421
jQuery.speed = function( speed, easing, fn ) {
422
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
423
		complete: fn || !fn && easing ||
424
			jQuery.isFunction( speed ) && speed,
425
		duration: speed,
426
		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
427
	};
428
 
429
	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
430
		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
431
 
432
	// Normalize opt.queue - true/undefined/null -> "fx"
433
	if ( opt.queue == null || opt.queue === true ) {
434
		opt.queue = "fx";
435
	}
436
 
437
	// Queueing
438
	opt.old = opt.complete;
439
 
440
	opt.complete = function() {
441
		if ( jQuery.isFunction( opt.old ) ) {
442
			opt.old.call( this );
443
		}
444
 
445
		if ( opt.queue ) {
446
			jQuery.dequeue( this, opt.queue );
447
		}
448
	};
449
 
450
	return opt;
451
};
452
 
453
jQuery.fn.extend({
454
	fadeTo: function( speed, to, easing, callback ) {
455
 
456
		// Show any hidden elements after setting opacity to 0
457
		return this.filter( isHidden ).css( "opacity", 0 ).show()
458
 
459
			// Animate to the value specified
460
			.end().animate({ opacity: to }, speed, easing, callback );
461
	},
462
	animate: function( prop, speed, easing, callback ) {
463
		var empty = jQuery.isEmptyObject( prop ),
464
			optall = jQuery.speed( speed, easing, callback ),
465
			doAnimation = function() {
466
				// Operate on a copy of prop so per-property easing won't be lost
467
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
468
 
469
				// Empty animations, or finishing resolves immediately
470
				if ( empty || data_priv.get( this, "finish" ) ) {
471
					anim.stop( true );
472
				}
473
			};
474
			doAnimation.finish = doAnimation;
475
 
476
		return empty || optall.queue === false ?
477
			this.each( doAnimation ) :
478
			this.queue( optall.queue, doAnimation );
479
	},
480
	stop: function( type, clearQueue, gotoEnd ) {
481
		var stopQueue = function( hooks ) {
482
			var stop = hooks.stop;
483
			delete hooks.stop;
484
			stop( gotoEnd );
485
		};
486
 
487
		if ( typeof type !== "string" ) {
488
			gotoEnd = clearQueue;
489
			clearQueue = type;
490
			type = undefined;
491
		}
492
		if ( clearQueue && type !== false ) {
493
			this.queue( type || "fx", [] );
494
		}
495
 
496
		return this.each(function() {
497
			var dequeue = true,
498
				index = type != null && type + "queueHooks",
499
				timers = jQuery.timers,
500
				data = data_priv.get( this );
501
 
502
			if ( index ) {
503
				if ( data[ index ] && data[ index ].stop ) {
504
					stopQueue( data[ index ] );
505
				}
506
			} else {
507
				for ( index in data ) {
508
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
509
						stopQueue( data[ index ] );
510
					}
511
				}
512
			}
513
 
514
			for ( index = timers.length; index--; ) {
515
				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
516
					timers[ index ].anim.stop( gotoEnd );
517
					dequeue = false;
518
					timers.splice( index, 1 );
519
				}
520
			}
521
 
522
			// Start the next in the queue if the last step wasn't forced.
523
			// Timers currently will call their complete callbacks, which
524
			// will dequeue but only if they were gotoEnd.
525
			if ( dequeue || !gotoEnd ) {
526
				jQuery.dequeue( this, type );
527
			}
528
		});
529
	},
530
	finish: function( type ) {
531
		if ( type !== false ) {
532
			type = type || "fx";
533
		}
534
		return this.each(function() {
535
			var index,
536
				data = data_priv.get( this ),
537
				queue = data[ type + "queue" ],
538
				hooks = data[ type + "queueHooks" ],
539
				timers = jQuery.timers,
540
				length = queue ? queue.length : 0;
541
 
542
			// Enable finishing flag on private data
543
			data.finish = true;
544
 
545
			// Empty the queue first
546
			jQuery.queue( this, type, [] );
547
 
548
			if ( hooks && hooks.stop ) {
549
				hooks.stop.call( this, true );
550
			}
551
 
552
			// Look for any active animations, and finish them
553
			for ( index = timers.length; index--; ) {
554
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
555
					timers[ index ].anim.stop( true );
556
					timers.splice( index, 1 );
557
				}
558
			}
559
 
560
			// Look for any animations in the old queue and finish them
561
			for ( index = 0; index < length; index++ ) {
562
				if ( queue[ index ] && queue[ index ].finish ) {
563
					queue[ index ].finish.call( this );
564
				}
565
			}
566
 
567
			// Turn off finishing flag
568
			delete data.finish;
569
		});
570
	}
571
});
572
 
573
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
574
	var cssFn = jQuery.fn[ name ];
575
	jQuery.fn[ name ] = function( speed, easing, callback ) {
576
		return speed == null || typeof speed === "boolean" ?
577
			cssFn.apply( this, arguments ) :
578
			this.animate( genFx( name, true ), speed, easing, callback );
579
	};
580
});
581
 
582
// Generate shortcuts for custom animations
583
jQuery.each({
584
	slideDown: genFx("show"),
585
	slideUp: genFx("hide"),
586
	slideToggle: genFx("toggle"),
587
	fadeIn: { opacity: "show" },
588
	fadeOut: { opacity: "hide" },
589
	fadeToggle: { opacity: "toggle" }
590
}, function( name, props ) {
591
	jQuery.fn[ name ] = function( speed, easing, callback ) {
592
		return this.animate( props, speed, easing, callback );
593
	};
594
});
595
 
596
jQuery.timers = [];
597
jQuery.fx.tick = function() {
598
	var timer,
599
		i = 0,
600
		timers = jQuery.timers;
601
 
602
	fxNow = jQuery.now();
603
 
604
	for ( ; i < timers.length; i++ ) {
605
		timer = timers[ i ];
606
		// Checks the timer has not already been removed
607
		if ( !timer() && timers[ i ] === timer ) {
608
			timers.splice( i--, 1 );
609
		}
610
	}
611
 
612
	if ( !timers.length ) {
613
		jQuery.fx.stop();
614
	}
615
	fxNow = undefined;
616
};
617
 
618
jQuery.fx.timer = function( timer ) {
619
	jQuery.timers.push( timer );
620
	if ( timer() ) {
621
		jQuery.fx.start();
622
	} else {
623
		jQuery.timers.pop();
624
	}
625
};
626
 
627
jQuery.fx.interval = 13;
628
 
629
jQuery.fx.start = function() {
630
	if ( !timerId ) {
631
		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
632
	}
633
};
634
 
635
jQuery.fx.stop = function() {
636
	clearInterval( timerId );
637
	timerId = null;
638
};
639
 
640
jQuery.fx.speeds = {
641
	slow: 600,
642
	fast: 200,
643
	// Default speed
644
	_default: 400
645
};
646
 
647
return jQuery;
648
});