/*

moo.fx pack, effects extensions for moo.fx.

by Valerio Proietti (http://mad4milk.net) MIT-style LICENSE

for more info visit (http://moofx.mad4milk.net).

Friday, April 14, 2006

v 1.2.4

*/



//smooth scroll

fx.Scroll = Class.create();

fx.Scroll.prototype = Object.extend(new fx.Base(), {

	initialize: function(options) {

		this.setOptions(options);

	},



	scrollTo: function(el){

		var dest = Position.cumulativeOffset($(el))[1];

		var client = window.innerHeight || document.documentElement.clientHeight;

		var full = document.documentElement.scrollHeight;

		var top = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;

		if (dest+client > full) this.custom(top, dest - client + (full-dest));

		else this.custom(top, dest);

	},



	increase: function(){

		window.scrollTo(0, this.now);

	}

});



//text size modify, now works with pixels too.

fx.Text = Class.create();

fx.Text.prototype = Object.extend(new fx.Base(), {

	initialize: function(el, options) {

		this.el = $(el);

		this.setOptions(options);

		if (!this.options.unit) this.options.unit = "em";

	},



	increase: function() {

		this.el.style.fontSize = this.now + this.options.unit;

	}

});



//composition effect: widht/height/opacity

fx.Combo = Class.create();

fx.Combo.prototype = {

	setOptions: function(options) {

		this.options = {

			opacity: true,

			height: true,

			width: false

		}

		Object.extend(this.options, options || {});

	},



	initialize: function(el, options) {

		this.el = $(el);

		this.setOptions(options);

		if (this.options.opacity) {

			this.o = new fx.Opacity(el, options);

			this.o.options.onComplete = null;

		}

		if (this.options.height) {

			this.h = new fx.Height(el, options);

			this.h.options.onComplete = null;

		}

		if (this.options.width) this.w = new fx.Width(el, options);

	},

	

	toggle: function() { this.checkExec('toggle'); },



	hide: function(){ this.checkExec('hide'); },

	

	clearTimer: function(){ this.checkExec('clearTimer'); },

	

	checkExec: function(func){

		if (this.o) this.o[func]();

		if (this.h) this.h[func]();

		if (this.w) this.w[func]();

	},

	

	//only if width+height

	resizeTo: function(hto, wto) {

		if (this.h && this.w) {

			this.h.custom(this.el.offsetHeight, this.el.offsetHeight + hto);

			this.w.custom(this.el.offsetWidth, this.el.offsetWidth + wto);

		}

	},



	customSize: function(hto, wto) {

		if (this.h && this.w) {

			this.h.custom(this.el.offsetHeight, hto);

			this.w.custom(this.el.offsetWidth, wto);

		}

	}

}



fx.Accordion = Class.create();

fx.Accordion.prototype = {

	setOptions: function(options) {

		this.options = {

			delay: 100,

			opacity: false

		}

		Object.extend(this.options, options || {});

	},



	initialize: function(togglers, elements, options) {

		this.elements = elements;

		this.setOptions(options);

		var options = options || '';

		this.fxa = [];

		if (options && options.onComplete) options.onFinish = options.onComplete;

		elements.each(function(el, i){

			options.onComplete = function(){

				if (el.offsetHeight > 0) el.style.height = '1%';

				if (options.onFinish) options.onFinish(el);

			}

			this.fxa[i] = new fx.Combo(el, options);

			this.fxa[i].hide();

		}.bind(this));



		togglers.each(function(tog, i){

			if (typeof tog.onclick == 'function') var exClick = tog.onclick;

			tog.onclick = function(){

				if (exClick) exClick();

				this.showThisHideOpen(elements[i]);

			}.bind(this);

		}.bind(this));

	},



	showThisHideOpen: function(toShow){

		this.elements.each(function(el, j){

			if (el.offsetHeight > 0 && el != toShow) this.clearAndToggle(el, j);

			if (el == toShow && toShow.offsetHeight == 0) setTimeout(function(){this.clearAndToggle(toShow, j);}.bind(this), this.options.delay);

		}.bind(this));

	},



	clearAndToggle: function(el, i){

		this.fxa[i].clearTimer();

		this.fxa[i].toggle();

	}

}



var Remember = new Object();

Remember = function(){};

Remember.prototype = {

	initialize: function(el, options){

		this.el = $(el);

		this.days = 365;

		this.options = options;

		this.effect();

		var cookie = this.readCookie();

		if (cookie) {

			this.fx.now = cookie;

			this.fx.increase();

		}

	},



	//cookie functions based on code by Peter-Paul Koch

	setCookie: function(value) {

		var date = new Date();

		date.setTime(date.getTime()+(this.days*24*60*60*1000));

		var expires = "; expires="+date.toGMTString();

		document.cookie = this.el+this.el.id+this.prefix+"="+value+expires+"; path=/";

	},



	readCookie: function() {

		var nameEQ = this.el+this.el.id+this.prefix + "=";

		var ca = document.cookie.split(';');

		for(var i=0;c=ca[i];i++) {

			while (c.charAt(0)==' ') c = c.substring(1,c.length);

			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);

		}

		return false;

	},



	custom: function(from, to){

		if (this.fx.now != to) {

			this.setCookie(to);

			this.fx.custom(from, to);

		}

	}

}



fx.RememberHeight = Class.create();

fx.RememberHeight.prototype = Object.extend(new Remember(), {

	effect: function(){

		this.fx = new fx.Height(this.el, this.options);

		this.prefix = 'height';

	},

	

	toggle: function(){

		if (this.el.offsetHeight == 0) this.setCookie(this.el.scrollHeight);

		else this.setCookie(0);

		this.fx.toggle();

	},

	

	resize: function(to){

		this.setCookie(this.el.offsetHeight+to);

		this.fx.custom(this.el.offsetHeight,this.el.offsetHeight+to);

	},



	hide: function(){

		if (!this.readCookie()) {

			this.fx.hide();

		}

	}

});



fx.RememberText = Class.create();

fx.RememberText.prototype = Object.extend(new Remember(), {

	effect: function(){

		this.fx = new fx.Text(this.el, this.options);

		this.prefix = 'text';

	}

});



//useful for-replacement

Array.prototype.iterate = function(func){

	for(var i=0;i<this.length;i++) func(this[i], i);

}

if (!Array.prototype.each) Array.prototype.each = Array.prototype.iterate;



//Easing Equations (c) 2003 Robert Penner, all rights reserved.

//This work is subject to the terms in http://www.robertpenner.com/easing_terms_of_use.html.



//expo

fx.expoIn = function(pos){

	return Math.pow(2, 10 * (pos - 1));

}

fx.expoOut = function(pos){

	return (-Math.pow(2, -10 * pos) + 1);

}



//quad

fx.quadIn = function(pos){

	return Math.pow(pos, 2);

}

fx.quadOut = function(pos){

	return -(pos)*(pos-2);

}



//circ

fx.circOut = function(pos){

	return Math.sqrt(1 - Math.pow(pos-1,2));

}

fx.circIn = function(pos){

	return -(Math.sqrt(1 - Math.pow(pos, 2)) - 1);

}



//back

fx.backIn = function(pos){

	return (pos)*pos*((2.7)*pos - 1.7);

}

fx.backOut = function(pos){

	return ((pos-1)*(pos-1)*((2.7)*(pos-1) + 1.7) + 1);

}



//sine

fx.sineOut = function(pos){

	return Math.sin(pos * (Math.PI/2));

}

fx.sineIn = function(pos){

	return -Math.cos(pos * (Math.PI/2)) + 1;

}

fx.sineInOut = function(pos){

	return -(Math.cos(Math.PI*pos) - 1)/2;

}
