/////////////////////////////////////
// ==== Tweens mini-engine v1.0 ====
// Gerard Ferrandez
// http://www.dhteumeuleu.com
// last update: Oct 20, 2009
// Licensed under CC-BY-NC
/////////////////////////////////////

var tweens = {
	tweens: [],
	nbTweens: 0,
	add : function (obj, params) {
		var self = this,
		    objList = [],
		    objReturn = [];
		var anim = function () {
			var i = -1, o;
			while( o = self.tweens[++i] ) {
				var cTime = (new Date() * 1) - o.start;
				if (cTime < o.timeframe) {
					for (var k in o.val) {
						var m = o.val[k];
						o.obj[k] = Math.round(o.ease(m.from, m.to, cTime / o.timeframe)) + (o.cssMode ? 'px' : 0);
					}
				} else {
					for (var k in o.val) {
						var m = o.val[k];
						o.obj[k] = o.cssValue ? (Math.round(m.from + m.to) + 'px') : (m.from + m.to);
					}
					self.tweens.splice(i, 1);
					self.nbTweens--;
					if (o.onFinish) o.onFinish (o.params);
					self.stop();
				}
            	if (!o.cssMode) o.obj.onTween();
			}
		};
		if (typeof obj == "string" || !obj.length) objList.push(obj); else objList = obj;
		for (var il = 0, l = objList.length; il < l; il++) {
			var obj = document.getElementById(objList[il]) || objList[il];
			var o = {};
			o.val = {};
			o.cssMode = true;
			o.o = obj;
			o.obj = obj.style;
			for (var k in params) {
				var p = params[k];
				if (k === "cssMode") {
					if (p === false) {
						o.cssMode = false;
						o.obj = obj;
					}
				} else if (k === "onTween") {
					o.obj.onTween = p;
				} else if (k === "init") {
					for (var i in p) o.obj[i] = o.cssMode ? (Math.round(p[i]) + 'px') : p[i];
				} else if (k === "target") {
					for (var i in p) {
						var from = o.cssMode ? (parseInt(o.obj[i]) || 0) : (o.obj[i] || 0);
						o.val[i] = {
							from: from,
							to: p[i] - from
						};
					}
				} else o[k] = params[k];
			}
			if (!o.ease) o.ease = this.inOut;
        	if (!o.cssMode && params['init']) o.obj.onTween();
			if (o.duration) {
				o.start = new Date() * 1;
				o.end = o.start + o.duration;
				o.timeframe = o.end - o.start;
				this.tweens.push(o);
				this.nbTweens++;
				if (!this.running) this.running = window.setInterval(anim, 16);
			}
			objReturn.push(o);
		}
		return objReturn.length === 1 ? o : objReturn;
	},
	stop : function () {
		if (!this.nbTweens) {
			window.clearInterval(this.running);
			this.running = false;
		}
	},
	kill : function (obj) {
		if (obj) {
			for (var i = 0; i < this.nbTweens; i++) {
				if (this.tweens[i] === obj || this.tweens[i].o === obj || this.tweens[i].o === document.getElementById(obj)) {
					this.nbTweens--;
					this.tweens.splice(i, 1);
					this.stop();
				}
			}
		}
	},
	reset : function () {
		this.nbTweens = 0;
		this.stop();
		while( this.tweens.length ) {
			this.tweens.pop();
		}
	},
	linear : function (f, t, d) { return t * d  + f; },
	inOut : function (f, t, d) { return -t * .5 * (Math.cos(Math.PI * d) - 1) + f; }
}