//
// Mekin Effects Manager
// Tim Mowrer
// July 5, 2009
//
//
// Wrapper for the Script.aculo.us Effects library
// Handles cancellation of any existing effect of similar type (e.g. opacity)
// on the same element.  E.g. multiple calls to Mekin.fade() will ensure only one
// Effect.Fade is running at a time.
//

// Did we include Base first?
if (typeof Mekin == 'undefined')
{
	throw('Mekin.Effects library requires Mekin base library.\nInclude Mekin.js first.');
}

// Requires script.aculo.us
//Mekin.require('../ThirdParty/scriptaculous.js');
Mekin.checkObject( 'Scriptaculous Effects', Effect );

// Define the effects manager
Mekin.Effects = {

	defaultDuration: .3,

	findEffect: function ( element, scope ) {
		Effect.Queues.get(scope).each(function(e) {
			if (e.element == element) {
				return e;
			}
		});
		
		return null;
	},
	
	cancelEffect: function ( element, scope ) {
		Effect.Queues.get(scope).each(function(e) {
			if (e.element == element) {
				e.cancel();
			}
		});	
	},

	fade: function fade( element, options ) {
		// Cancel any opacity scoped effects running on this object
		this.cancelEffect( $(element), 'opacity' );
		new Effect.Opacity( element, Object.extend( {queue:{scope:'opacity'}, duration:this.defaultDuration}, options ) );
	},
	
	fadeIn: function ( element, options ) {
		this.fade( element, Object.extend( {to: 1}, options ) );
	},
	
	fadeOut: function ( element, options ) {
		this.fade( element, Object.extend( {to: 0}, options ) );	
	},
	
	appear: function (element, options) {
		// Cancel any opacity scoped effects running on this object
		this.cancelEffect( $(element), 'opacity' );
		new Effect.Appear( element, Object.extend( {queue:{scope:'opacity'}, duration:this.defaultDuration}, options ) );
	},
	
	disappear: function (element, options) {
		// Cancel any opacity scoped effects running on this object
		this.cancelEffect( $(element), 'opacity' );
		new Effect.Fade( element, Object.extend( {queue:{scope:'opacity'}, duration:this.defaultDuration}, options ) );
	}

};

