/*
 * Hide n Seek
 */

if(typeof Effect == "undefined") throw ("DI.ExpandBox works with Scriptaculous Effects.");
if(typeof DI == "undefined"){
	var DI = {};
	var self = "di-expandbox.js";
	var path = $$("head script[src*='" + self + "']").first().src.replace(self, '');
	document.write('<script type="text/javascript" src="' + path + 'di-framework.js"><\/script>');
}

Object.extend(DI, {
	HideSeek : Class.create({
		_container	: null,
		_options	: null,
		_effects	: null,
		_animating	: null,
		_lastActive	: null,
		
		initialize : function(container, options) {
			if(typeof container == "string") container = $(container);
			this._container = container;
			this._options = Object.extend({
				boxClassname	: "hide-n-seek-box",
				duration		: 1
			}, options);
			this._animating = false;
			this._lastActive = null;
			
			$$("." + this._options.boxClassname).each(function(node){
				node.setStyle({
					height : 0
				});
			}, this);
		},
		
		open : function(element){
			if(this._animating) return;
			
			this._effects = [];
			
			if(this._lastActive == element){
				this._close($(this._lastActive));
				this._lastActive = null;
			}else if(this._lastActive != null){
				this._close($(this._lastActive));
				this._open($(element));
				this._lastActive = element;
			}else{
				this._open($(element));
				this._lastActive = element;
			}
		},
		
		_open : function(element) {
			var optionsFX = {
				queue			: {
					position	: "end",
					scope		: element.identify()
				},
				sync			: false,
				scaleFrom		: 0,
				scaleContent	: false,
				duration		: this._options.duration,
				transition		: Effect.Transitions.sinoidal,
				scaleMode	: {
					originalHeight	: element.scrollHeight
				},
				beforeStart	: function(element){
					this._animating = true;
				}.bind(this, element),
				afterFinish : function(element){
					this._animating = false;
				}.bind(this, element),
				scaleX			: false,
				scaleY			: true
			};
			if(this._lastActive != null && this._lastActive != element.identify()){
				Object.extend(optionsFX, {
					delay	: Math.round((this._options.duration * .8) * 100.0) / 100.0
				});
			}
			new Effect.Scale(element, 100, optionsFX);
		},
		
		_close : function(element) {
			var optionsFX = {
				queue			: {
					position	: "end",
					scope		: element.identify()
				},
				sync			: false,
				duration		: this._options.duration,
				transition		: Effect.Transitions.sinoidal,
				beforeStart		: function(element){
					this._animating = true;
					element.absolutize();
				}.bind(this, element),
				afterFinish		: function(element){
					element.setStyle({
						position	: "static",
						display		: "block",
						height		: 0
					});
					this._animating = false;
				}.bind(this, element)
			};
			new Effect.Fade(element, optionsFX);
		}
	})
});