/*
* jQuery-1.4.4 hoverFade by FirstView (http://firstviewmedia.com).
* This lets you fade out & in, with various options
* Options include easing, callbacks, IE opacity class, accessing children elements.
*/
/*
Eg. :

$('.links').hoverFade({
	opacity:0.6,
	onAnimInStart:function(){
		doFunction('what');
	},
	childElement:'.bannerContainer',
	easing:'easeInElastic',
	animSpeedIn:200
});
*/

(function($){
	$.fn.hoverFade = function(opts) {
	
		var defaults = {
			opacity: .7,								// 0 - 1. //
			animSpeedIn: 500,							// Anim time in milliseconds. //
			animSpeedOut: 200,							// Anim time in milliseconds. //
			delayIn: 0,									// Delay time in milliseconds. //
			delayOut: 0,								// Delay time in milliseconds. //
			childElement: null,							// Child to apply fade to. //
			easing: '',									// Easing to apply. //
			onAnimInStart: null,						// Additional function to peform when anim begins. //
			onAnimInEnd: null,							// Additional function to peform when anim ends. //
			onAnimOutStart: null,						// Additional function to peform when anim begins. //
			onAnimOutEnd: null,							// Additional function to peform when anim ends. //
			ieOpacityClass: 'ieOpacityFailed'			// IE class that uses IE filters to change opacity. //
		};
		var opts										= $.extend(defaults, opts);
		if( !opts.childElement ) var initialOpacity		= this.css('opacity');
		else var initialOpacity							= this.find(opts.childElement).css('opacity');
		var supportsOpacity								= $.support.opacity;
		
		return this.each(function(){
			
			var $this = $(this);
			
			$this.hover(function(){
				if( opts.onAnimInStart )		opts.onAnimInStart($this);
				if( supportsOpacity ) {
					if( !opts.childElement )	$(this).stop(true, true).delay(opts.delayIn).fadeTo(opts.animSpeedIn, opts.opacity, opts.easing, opts.onAnimInEnd);
					else						$(this).find(opts.childElement).stop(true, true).delay(opts.delayIn).fadeTo(opts.animSpeedIn, opts.opacity, opts.easing, function(){ if( opts.onAnimInEnd ) opts.onAnimInEnd($this) });
				}else{
					if( !opts.childElement ){
						$(this).addClass(opts.ieOpacityClass);
						opts.onAnimInEnd();
					}else{
						$(this).find(opts.childElement).addClass(opts.ieOpacityClass);
						opts.onAnimInEnd();
					}
				}
			}, function(){
				if( opts.onAnimOutStart )		opts.onAnimOutStart($this);
				if( supportsOpacity ) {
					if( !opts.childElement )	$(this).delay(opts.delayOut).fadeTo(opts.animSpeedOut, initialOpacity, opts.easing, opts.onAnimOutEnd);
					else						$(this).find(opts.childElement).delay(opts.delayOut).fadeTo(opts.animSpeedOut, initialOpacity, opts.easing, function(){ if( opts.onAnimOutEnd ) opts.onAnimOutEnd($this); });
				}else{
					if( !opts.childElement ){
						$(this).removeClass(opts.ieOpacityClass);
						opts.onAnimInEnd();
					}else{
						$(this).find(opts.childElement).removeClass(opts.ieOpacityClass);
						opts.onAnimInEnd();
					}
				}
			});
			
			return this;
		});
	};
})(jQuery);

