/*
moo.fx, simple effects library built with prototype.js (http://prototype.conio.net).
by Valerio Proietti (http://mad4milk.net) MIT-style LICENSE.
for more info (http://moofx.mad4milk.net).
Sunday, March 05, 2006
v 1.2.3

modified version by TN
*/

var fx = new Object();
//base
fx.Base = function(){};
fx.Base.prototype = {
	setOptions: function(options) {
	this.options = {
		duration: 500,
		onComplete: '',
		transition: fx.easeOutCubic
	}
	Object.extend(this.options, options || {});
	},

	step: function() {
		var time  = (new Date).getTime();
		if (time >= this.options.duration+this.startTime) {
			this.now = this.to;
			clearInterval (this.timer);
			this.timer = null;
			if (this.options.onComplete) setTimeout(this.options.onComplete.bind(this), 10);
		}else {
			if(this.to <= 0){
				this.to = 0;
			}
			var t = (time - this.startTime);
			var b = this.from;
			var c = (this.to-this.from);
			var d = (this.options.duration);
			this.now = this.options.transition(t, b, c, d);
		}
		this.increase();
	},

	custom: function(from, to) {
		if (this.timer != null) return;
		this.from = from;
		this.to = to;
				
		this.startTime = (new Date).getTime();
		this.timer = setInterval (this.step.bind(this), 16);
	},

	hide: function() {
		this.now = 0;
		this.increase();
	},

	clearTimer: function() {
		clearInterval(this.timer);
		this.timer = null;
	}
}

//stretchers
fx.Layout = Class.create();
fx.Layout.prototype = Object.extend(new fx.Base(), {
	initialize: function(el, options) {
		this.el = $(el);
		this.el.style.overflow = "hidden";
		this.iniWidth = this.el.offsetWidth;
		this.iniHeight = this.el.offsetHeight;
		this.setOptions(options);
	}
});

fx.Height = Class.create();
Object.extend(Object.extend(fx.Height.prototype, fx.Layout.prototype), {	
	increase: function() {
		this.el.style.height = this.now + "px";
	},

	toggle: function() {
		if (this.el.offsetHeight > 0) this.custom(this.el.offsetHeight, 0);
		else this.custom(0, this.el.scrollHeight);
	}
});

fx.Width = Class.create();
Object.extend(Object.extend(fx.Width.prototype, fx.Layout.prototype), {	
	increase: function() {
		this.el.style.width = this.now + "px";
	},

	toggle: function(){
		if (this.el.offsetWidth > 0) this.custom(this.el.offsetWidth, 0);
		else this.custom(0, this.iniWidth);
	}
});

//fader
fx.Opacity = Class.create();
fx.Opacity.prototype = Object.extend(new fx.Base(), {
	initialize: function(el, options) {
		this.el = $(el);
		this.now = 1;
		this.increase();
		this.setOptions(options);
	},

	increase: function() {
		if (this.now == 1 && (/Firefox/.test(navigator.userAgent))) this.now = 0.9999;
		this.setOpacity(this.now);
	},
	
	setOpacity: function(opacity) {
		if (opacity == 0 && this.el.style.visibility != "hidden") this.el.style.visibility = "hidden";
		else if (this.el.style.visibility != "visible") this.el.style.visibility = "visible";
		if (window.ActiveXObject) this.el.style.filter = "alpha(opacity=" + opacity*100 + ")";
		this.el.style.opacity = opacity;
	},

	toggle: function() {
		if (this.now > 0) this.custom(1, 0);
		else this.custom(0, 1);
	}
});

//transitions
/*
fx.sinoidal = function(pos){
	return ((-Math.cos(pos*Math.PI)/2) + 0.5);
	//this transition is from script.aculo.us
}
fx.linear = function(pos){
	return pos;
}
fx.cubic = function(pos){
	return Math.pow(pos, 3);
}
fx.circ = function(pos){
	return Math.sqrt(pos);
}
*/

fx.linear = function(t, b, c, d){
	return c*t/d + b;
}
fx.easeInQuad = function(t, b, c, d){
	return c*(t/=d)*t + b;
}
fx.easeOutQuad = function(t, b, c, d){
	return -c *(t/=d)*(t-2) + b;
}
fx.easeInOutQuad = function(t, b, c, d){
	if ((t/=d/2) < 1) return c/2*t*t + b;
	return -c/2 * ((--t)*(t-2) - 1) + b;
}
fx.easeOutInQuad = function(t, b, c, d){
	if (t < d/2) return easeOutQuad (t*2, b, c/2, d);
	return easeInQuad((t*2)-d, b+c/2, c/2, d);
}
fx.easeInCubic = function(t, b, c, d){
	return c*(t/=d)*t*t + b;
}
fx.easeOutCubic = function(t, b, c, d){
	return c*((t=t/d-1)*t*t + 1) + b;
}
fx.easeInOutCubic = function(t, b, c, d){
	if ((t/=d/2) < 1) return c/2*t*t*t + b;
	return c/2*((t-=2)*t*t + 2) + b;
}
fx.easeOutInCubic = function(t, b, c, d){
	if (t < d/2) return easeOutCubic (t*2, b, c/2, d);
	return easeInCubic((t*2)-d, b+c/2, c/2, d);
}
fx.easeInQuart = function(t, b, c, d){
	return c*(t/=d)*t*t*t + b;
}
fx.easeOutQuart = function(t, b, c, d){
	return -c * ((t=t/d-1)*t*t*t - 1) + b;
}
fx.easeInOutQuart = function(t, b, c, d){
	if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
	return -c/2 * ((t-=2)*t*t*t - 2) + b;
}
fx.easeOutInQuart = function(t, b, c, d){
	if (t < d/2) return easeOutQuart (t*2, b, c/2, d);
	return easeInQuart((t*2)-d, b+c/2, c/2, d);
}
fx.easeInQuint = function(t, b, c, d){
	return c*(t/=d)*t*t*t*t + b;
}
fx.easeOutQuint = function(t, b, c, d){
	return c*((t=t/d-1)*t*t*t*t + 1) + b;
}
fx.easeInOutQuint = function(t, b, c, d){
	if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;
	return c/2*((t-=2)*t*t*t*t + 2) + b;
}
fx.easeOutInQuint = function(t, b, c, d){
	if (t < d/2) return easeOutQuint (t*2, b, c/2, d);
	return easeInQuint((t*2)-d, b+c/2, c/2, d);
}
fx.easeInSine = function(t, b, c, d){
	return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
}
fx.easeOutSine = function(t, b, c, d){
	return c * Math.sin(t/d * (Math.PI/2)) + b;
}
fx.easeInOutSine = function(t, b, c, d){
	return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;
}
fx.easeOutInSine = function(t, b, c, d){
	if (t < d/2) return easeOutSine (t*2, b, c/2, d);
	return easeInSine((t*2)-d, b+c/2, c/2, d);
}
fx.easeInExpo = function(t, b, c, d){
	return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b - c * 0.001;
}
fx.easeOutExpo = function(t, b, c, d){
	return (t==d) ? b+c : c * 1.001 * (-Math.pow(2, -10 * t/d) + 1) + b;
}
fx.easeInOutExpo = function(t, b, c, d){
	if (t==0) return b;
	if (t==d) return b+c;
	if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b - c * 0.0005;
	return c/2 * 1.0005 * (-Math.pow(2, -10 * --t) + 2) + b;
}
fx.easeOutInExpo = function(t, b, c, d){
	if (t < d/2) return easeOutExpo (t*2, b, c/2, d);
	return easeInExpo((t*2)-d, b+c/2, c/2, d);
}
fx.easeInCirc = function(t, b, c, d){
	return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;
}
fx.easeOutCirc = function(t, b, c, d){
	return c * Math.sqrt(1 - (t=t/d-1)*t) + b;
}
fx.easeInOutCirc = function(t, b, c, d){
	if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;
	return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;
}
fx.easeOutInCirc = function(t, b, c, d){
	if (t < d/2) return easeOutCirc (t*2, b, c/2, d);
	return easeInCirc((t*2)-d, b+c/2, c/2, d);
}
