var largeur = 25; // nb de caractères en largeur de la fenêtre.

var iterations = 40; // nb normal d'itérations.

var est_konqueror = /Konqueror/i.test(navigator.userAgent);
var est_ie = (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent));
var est_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
var konqcorrection = 2;

if(est_ie)
	iterations = 20;

var cadre = 0;
var promeneur = null;
var titre = null;
var afficheur = null;

var iterateur = 0;
var body  = document.getElementsByTagName("body")[0];
var cible = null;
var delta = {x:1, y:1};
var poslancement = {x:0, y:0};

function getAbsPos(el) {
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if(is_div && el.scrollLeft)
		SL = el.scrollLeft;
	if(is_div && el.scrollTop)
		ST = el.scrollTop;
	var r = {x:el.offsetLeft - SL, y:el.offsetTop - ST};
	if(el.offsetParent) {
		var tmp = getAbsPos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};

function computePosition(el, me, opts) {
	var p = getAbsPos(el);
	if(!opts || typeof(opts) != "string") {
		p.x += (el.offsetWidth - me.offsetWidth)/2;
		p.y += (el.offsetHeight - me.offsetHeight)/2;
		return p;
	}
	var valign = opts.substr(0,1);
	var halign = "l";
	if(opts.length > 1) {
		halign = opts.substr(1,1);
	}
	switch(valign) {
		case "T": p.y -= me.offsetHeight; break;
		case "B": p.y += el.offsetHeight; break;
		case "C": p.y += (el.offsetHeight - me.offsetHeight)/2; break;
		case "t": p.y += el.offsetHeight - me.offsetHeight; break;
		case "b": break;
	}
	switch(halign) {
		case "L": p.x -= me.offsetWidth; break;
		case "R": p.x += el.offsetWidth; break;
		case "C": p.x += (el.offsetWidth - me.offsetWidth)/2; break;
		case "r": p.x += el.offsetWidth - me.offsetWidth; break;
		case "l": break;
	}
	return p;
};

function cachePromeneur(event) {
	if(event) {
		//window.alert("cachePromeneur(): event OK!");
		if(!est_ie) {
			event.stopPropagation();
			if(event.cancelable)
				event.preventDefault();
		} else {
			event.returnValue = false;
			event.cancelBubble = true;
		}
	}
	promeneur.style.visibility="hidden";
};

var endrag = false;
var souris = {x:0,y:0};

function surClic(ev) {
	if(ev) {
		if(!est_ie) {
			ev.stopPropagation();
			if(ev.cancelable)
				ev.preventDefault();
		} else {
			ev.returnValue = false;
			ev.cancelBubble = true;
		}
	}
	endrag = true;
	if(window.event) {
		souris.x = window.event.clientX;
		souris.y = window.event.clientY;
	} else if(ev) {
		souris.x = ev.clientX;
		souris.y = ev.clientY;
	}
};

function apresClic(ev) {
	if(endrag) {
		if(ev) {
			if(!est_ie) {
				ev.stopPropagation();
				if(ev.cancelable)
					ev.preventDefault();
			} else {
				ev.returnValue = false;
				ev.cancelBubble = true;
			}
		}
	}
	endrag = false;
}

function tirant(ev) {
	if(endrag) {
		if(ev) {
			if(!est_ie) {
				ev.stopPropagation();
				if(ev.cancelable)
					ev.preventDefault();
			} else {
				ev.returnValue = false;
				ev.cancelBubble = true;
			}
		}
		newX = -1;
		newY = -1;
		if(window.event) {
			newX = window.event.clientX;
			newY = window.event.clientY;
		} else if(ev) {
			newX = ev.clientX;
			newY = ev.clientY;
		}
		if((newX != -1) && (newY != -1)) {
			dx = newX - souris.x;
			dy = newY - souris.y;
			souris.x = newX;
			souris.y = newY;
//			if(est_ie)
//				oldPos = getAbsPos(promeneur);
//			else
				oldPos={x:promeneur.offsetLeft, y:promeneur.offsetTop};
			if(est_konqueror) {
				promeneur.style.left = oldPos.x/konqcorrection + dx + "px";
				promeneur.style.top  = oldPos.y/konqcorrection + dy + "px";
			} else {
				promeneur.style.left = oldPos.x + dx + "px";
				promeneur.style.top  = oldPos.y + dy + "px";
			}
		}
	}
};

function konq_calcul() {
	xy = computePosition(cible, promeneur, "");
	zt = getAbsPos(promeneur);
	ciblepos = getAbsPos(cible);
	delta.x = (xy.x - zt.x)/(iterations*konqcorrection);
	delta.y = (xy.y- zt.y)/(iterations*konqcorrection);
	//window.alert('konq_calcul():rampe = (' + xy.x + ',' + xy.y + '), promeneur = (' + zt.x + ',' + zt.y + '), cible=('+ciblepos.x+',' +ciblepos.y+'), delta = (' +delta.x + ',' + delta.y + ')');
	iterateur++;
	promeneur.style.fontSize=(iterateur*100/iterations) + "%";
	promeneur.style.left = poslancement.x + (delta.x*iterateur) +"px";
	promeneur.style.top= poslancement.y + (delta.y*iterateur) +"px";
	setTimeout("aimless()", 15);
};

function aimless(event, idfrom, idto, intitule, htmltexte) {
	if(event) {
		//window.alert("cachePromeneur(): event OK!");
		if(!est_ie) {
			event.stopPropagation();
			if(event.cancelable)
				event.preventDefault();
		} else {
			event.returnValue = false;
			event.cancelBubble = true;
		}
	}
	if((iterateur != 0) && (idfrom || idto))
		return false;
	if(!promeneur) {
		promeneur = document.createElement("div");
		promeneur.className = "mafenetre";
		promeneur.style.visibility="hidden";
		promeneur.style.left="0";
		promeneur.style.top = "0";
		promeneur.style.width= largeur + "em";   //"12em";
		if(est_ie)
			promeneur.style.borderColor="black";
		else
			promeneur.style.borderColor="grey black black grey";
		//body.appendChild(promeneur);
		barre = document.createElement("div");
		barre.className = "barre";
		if(est_ie) {
			if(barre.attachEvent) {
				barre.attachEvent("onmousedown", surClic);
				barre.attachEvent("onmouseup", apresClic);
				barre.attachEvent("onmousemove", tirant);
				barre.attachEvent("onmouseout", apresClic);
			} else {
				barre.addEventListener("mousedown", surClic);
				barre.addEventListener("mouseup", apresClic);
				barre.addEventListener("mousemove", tirant);
				barre.addEventListener("mouseout", apresClic);
			}
		} else {
			barre.addEventListener("mousedown", surClic, false);
			barre.addEventListener("mouseup", apresClic, false);
			barre.addEventListener("mousemove", tirant, false);
			barre.addEventListener("mouseout", apresClic, false);
		}
body.appendChild(promeneur);
		titre = document.createElement("div");
		titre.className = "titre";
		//titre.style.width = (largeur-5) + "em";  //"9em";
		titre.innerHTML = "titleless";
		barre.appendChild(titre);
		croix = document.createElement("div");
		croix.className = "croix";
		croix.innerHTML="<a href=\"#\" onclick=\"cachePromeneur(event)\">X</a>";
		//croix.innerHTML="X";
		barre.appendChild(croix);
//		if(croix.attachEvent)
//			croix.attachEvent("onclick", cachePromeneur);
//		else
//			croix.addEventListener("click", cachePromeneur);
		barre.className = "barre";
		promeneur.appendChild(barre);
		afficheur = document.createElement("div");
		afficheur.className="afficheur";
		promeneur.appendChild(afficheur);
		afficheur.innerHTML = "Promeneur en mouvement....";
	}
	if (iterateur == 0) {
		promeneur.style.left = "0px";
		promeneur.style.top = "0px";
		promeneur.style.position = "absolute";
		if(typeof(htmltexte) == 'string')
			afficheur.innerHTML= htmltexte;
		else if(typeof(htmltexte) == 'object') {
			a_afficher = "";
			derniereligne = null;
			for(i in htmltexte) {
				if(derniereligne) {
					a_afficher = a_afficher + derniereligne + "<br>" ;
				}
				if(parseInt(i) == 0)
					a_afficher = a_afficher + "<div class=\"premiere\">" + htmltexte[i] + "</div>";
				else
					derniereligne=htmltexte[i];
			}
			a_afficher = a_afficher + "<div class=\"derniere\">("+derniereligne+")</div>";
			afficheur.innerHTML = a_afficher;
		}
		//afficheur.innerHTML = String(htmltexte).replace("\\\x\2\6","&");
		titre.innerHTML = intitule;
		delta.x = delta.y = 10;
		if(idfrom) {
			lanceur = document.getElementById(idfrom);
			if(lanceur) {
				poslancement = getAbsPos(lanceur);
				poslancement.x += lanceur.offsetWidth;
				promeneur.style.fontSize = "0%";
				poslancement.x -= promeneur.offsetWidth / 2;
				promeneur.style.fontSize = "100%";
				poslancement.y += lanceur.offsetHeight/2;
				if(est_konqueror) {
					poslancement.x = poslancement.x/konqcorrection;
					poslancement.y = poslancement.y/konqcorrection;
				}
				promeneur.style.left = poslancement.x + "px";
				promeneur.style.top = poslancement.y + "px";
			}
		}
		if (idto) {
			cible = document.getElementById(idto);
			if(cible) {
				//window.alert("créée cible...");
				if(est_khtml) {
					setTimeout("konq_calcul()",10);
					return false;
				}
				xy = computePosition(cible, promeneur, "");
				zt = getAbsPos(promeneur);
				delta.x = (xy.x - zt.x)/iterations;
				delta.y = (xy.y - zt.y)/iterations;
				//ciblepos = getAbsPos(cible);
				//window.alert('rampe = (' + xy.x + ',' + xy.y + '), promeneur = (' + zt.x + ',' + zt.y + '), cible=('+ciblepos.x+',' +ciblepos.y+'), delta = (' +delta.x + ',' + delta.y + ')');
			}
		}
		promeneur.style.fontSize = "0%";
		promeneur.style.visibility = "visible";
	}
	if(est_konqueror && (iterateur == 1))
		promeneur.style.visibility = "visible";
	if(iterateur++ < iterations) {
		promeneur.style.fontSize=(iterateur*100/iterations) + "%";
		promeneur.style.left = poslancement.x + (delta.x*iterateur) +"px";
		promeneur.style.top= poslancement.y + (delta.y*iterateur) +"px";
		setTimeout("aimless()", 10);
	}  else {
		iterateur = 0;
	}
	//return false;
};

window.onload=function() { body = document.getElementsByTagName("body")[0];};

