// custom effects library, primarily a clone of scriptaculous ones with some addies

// opacity over multiple elements
Effect.MultiOpacity = Class.create(Effect.Base, {
	initialize: function(elements) {
		this.elements = Object.isArray(elements) ? elements.map(Element.extend) : $$(elements);
		if (!this.elements.length) {
			return;
		}
		// make this work on IE on elements without 'layout'
		if (Prototype.Browser.IE) {
			this.elements.each(function(element) { element.setStyle({ zoom: 1 }); })
		}
		var opacity = this.elements[0].getOpacity() || 1.0;
		var options = Object.extend({
			from	: opacity,
			to		: 1.0 - opacity
		}, arguments[1] || {});
		this.start(options);
	},
	update: function(position) {
		this.elements.invoke('setOpacity', position);
	}
});

// fade out over multiple elements
Effect.MultiFade = function(elements) {
	elements = Object.isArray(elements) ? elements.map(Element.extend) : $$(elements);
	if (!elements.length) {
		return;
	}
	var oldOpacities = elements.map(function(element) { return element.getInlineOpacity(); });
	var options = Object.extend({
		from	: elements[0].getOpacity() || 1.0,
		to		: 0.0,
		afterFinishInternal: function(effect) {
			if (effect.options.to != 0) {
				return;
			}
			effect.elements.invoke('hide').each(function(element, index) { element.setOpacity(oldOpacities[index]); });
		}
	}, arguments[1] || {});
	return new Effect.MultiOpacity(elements, options);
};

// fade in over multiple elements
Effect.MultiAppear = function(elements) {
	elements = Object.isArray(elements) ? elements.map(Element.extend) : $$(elements);
	if (!elements.length) {
		return;
	}
	var options = Object.extend({
		from	: (elements[0].getStyle('display') == 'none' ? 0.0 : elements[0].getOpacity() || 0.0),
		to		: 1.0,
		// force Safari to render floated elements properly
		afterFinishInternal: function(effect) {
			effect.elements.invoke('forceRerendering');
		},
		beforeSetup: function(effect) {
			effect.elements.invoke('setOpacity', effect.options.from).invoke('show');
		}
	}, arguments[1] || {});
	return new Effect.MultiOpacity(elements, options);
};

// pair multifade and multiappear
Effect.PAIRS.multiappear = ['MultiAppear', 'MultiFade'];

// make a multiple toggle func too
Effect.multitoggle = function(elements, effect, options) {
	elements = Object.isArray(elements) ? elements.map(Element.extend) : $$(elements);
	if (!elements.length) {
		return;
	}
	effect = (effect || 'multiappear').toLowerCase();
	return Effect[Effect.PAIRS[effect][elements[0].visible() ? 1 : 0]](elements, Object.extend({
		queue: {
			position	: 'end',
			scope		: 'global',
			limit		: 1
		}
	}, options || {}));
}

