// JavaScript Document
// ========================================================
//              ===== images slider ====
// script: Gerard Ferrandez - Ge-1-doot - February 2008
// http://www.dhteumeuleu.com
// CC-BY-NC
// ========================================================

/* ==== slider nameSpace ==== */
var slider = function() {
	/* ==== private methods ==== */
	function getElementsByClass(object, tag, className) {
		var o = object.getElementsByTagName(tag);
		for ( var i = 0, n = o.length, ret = []; i < n; i++) {
			if (o[i].className == className) ret.push(o[i]);
		}
		if (ret.length == 1) ret = ret[0];
		return ret;
	}
	var slides = [];
	var S, S0, iW, iH, oP, oc, frm, NF, view, Z;
	var wh, ht, wr, r, mx, mn;
	/* ==== animation loop ==== */
	var run = function () {
		Z += (mn - Z) * .5;
		view.calc();
		var i = NF;
		while (i--) slides[i].move();
	}
	/* ==== resize  ==== */
	var resize = function () {
		wh = oc.clientWidth;
		ht = oc.clientHeight;
		wr = wh * iW;
		r  = ht / wr;
		mx = wh / NF;
		mn = (wh * (1 - iW)) / (NF - 1);
	}

	/* ==== Slide Constructor ==== */
	Slide = function (N) {
		this.N      = N;
		this.x0     = this.x1 = N * mx;
		this.v      = 0;
		this.loaded = false;
		this.cpt    = 0;
		this.start  = new Date();
		this.obj    = frm[N];
		this.txt    = getElementsByClass(this.obj, 'div', 'text');
		this.img    = getElementsByClass(this.obj, 'img', 'diapo');
		this.bkg    = document.createElement('div');
		this.bkg.className = 'backgroundText';
		this.obj.insertBefore(this.bkg, this.txt);
		if (N == 0) this.obj.style.borderLeft = 'none';
		this.obj.style.left = Math.floor(this.x0) + 'px';
		/* ==== mouse events ==== */
		this.obj.parent = this;
		this.obj.onmouseover = function() {
			this.parent.over();
			return false;
		}
	}
	/* ==== target positions ==== */
	Slide.prototype.calc = function () {
		for (var i = 0; i <= this.N; i++)
			slides[i].x1 = i * Z;
		for (var i = this.N + 1; i < NF; i++)
			slides[i].x1 = wh - (NF - i) * Z;
	}
	/* ==== HTML animation : move slides ==== */
	Slide.prototype.move = function() {
		var s = (this.x1 - this.x0) / S;
		/* ==== lateral slide ==== */
		if (this.N && Math.abs(s) > .5)
			this.obj.style.left = Math.floor(this.x0 += s) + 'px';
		/* ==== vertical text ==== */
		var v = (this.N < NF - 1) ? slides[this.N + 1].x0 - this.x0 : wh - this.x0;
		if (Math.abs(v - this.v) > .5) {
			this.bkg.style.top = this.txt.style.top = Math.floor(2 + ht - (v - Z) * iH * r) + 'px';
			this.v = v;
			this.cpt++;
		} else {
			if (!this.pro) {
				/* ==== adjust speed ==== */
				this.pro = true;
				var tps = new Date() - this.start;
				if(this.cpt > 1) {
					S = Math.max(2, (28 / (tps / this.cpt)) * S0);
				}
			}
		}
		if (!this.loaded) {
			if (this.img.complete) {
				this.img.style.visibility = 'visible';
				this.loaded = true;
			}
		}
	}
	/* ==== over ==== */
	Slide.prototype.over = function () {
		resize();
		view = this;
		this.start = new Date();
		this.cpt = 0;
		this.pro = false;
		this.calc();
	}
	/* ==== start script ==== */
	var init = function (oCont, speed, iw, ih, op) {
		S   = S0 = speed;
		iW  = iw;
		iH  = ih;
		oP  = op;
		oc  = document.getElementById(oCont);
		frm = getElementsByClass(oc, 'div', 'slide');
		NF  = frm.length;
		resize();
		for (var i = 0; i < NF; i++)
			slides[i] = new Slide(i);
		view = slides[0];
		Z = mx;
		setInterval(run, 32);
	}
	/* ==== public methods ==== */
	return {
		init : init
	}
}();

