/*|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|                              CLASSE PALERTE                               |
|---------------------------------------------------------------------------|
|                                                                           |
|    La petite alerte permet d'afficher un message sans intervention de     |
|     l'utilisateur. Le message disparaît au bout de quelques secondes.     |
|                                                                           |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|                                             Benjamin COIFFARD - août 2007 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/


/* CONSTRUCTEUR
----------------------------------------------------------------------------
	Le constructeur de la petite alerte est appelée dès le chargement sur
	toutes les pages contenant une occurence de l'objet. Elle est déclarée
	invisible par CSS et ne perturbe donc pas l'utilisateur.
	Pour afficher une petite alerte, il suffit d'appeler la fonction montre,
	qui la rend visible, la déplace au bon endroit et lui place les valeurs
	adéquates.
---------------------------------------------------------------------------*/
function PAlerte(){

// Initialisation des attributs de la petite alerte
	var elle = this;
	elle.type = null;
	elle.estVisible = false;
	elle.opacite = '1';
	elle.estompage = false;
	elle.noeud = document.createElement('div');
	elle.noeud.className = 'pAlerte';
	ajouterAttribut('id', elle.noeud, 'pAlerte');
	elle.noeud.style.width = '200px';

// Ajout de l'élément au DOM
	document.getElementsByTagName('body')[0].appendChild(elle.noeud);

}


/* AFFICHE LA PETITE ALERTE
----------------------------------------------------------------------------
	La petite alerte est toujours présente sur la page, on joue simplement
	sur la propriété "visibility" pour l'afficher ou la masquer.
	Avant d'afficher la petite alerte, on vérifie qu'elle n'est pas déjà
	présente, et si oui, on l'efface.
	Le paramètre noeud indique d'où provient l'alerte.
	Le paramètre nType indique le type d'alerte
	Le paramètre nTab est un tableau contenant le message à afficher
	Le paramètre nTemps indique le temps en milliseconde avant estompage.
---------------------------------------------------------------------------*/
PAlerte.prototype.afficher = function (noeud, nType, nPlacement, nTab, nTemps){

	var elle = this;

// Si un effet d'estompage est en cours, on le supprime
	if (elle.estompage) {
		clearTimeout("laPAlerte.estomper()");
		elle.estompage = false;
	}
	
// Si la petite alerte est déjà affichée, on la vide et on l'efface
	if (elle.estVisible) {		
		elle.masquer();
	}
	elle.estVisible = true;

// Ajout des nouveaux paramètres à l'objet
	elle.type = nType;

// Construction du message à partir du tableau
	if (nTab[0] == 'simple') {
		for (var i=1; i<nTab.length; i++) {
			var texte = document.createTextNode(nTab[i]);
			var noeudChoix = document.createElement('span');
			ajouterAttribut('id', noeudChoix, 'pAlerte_l'+i);
			noeudChoix.appendChild(texte);
		
			elle.noeud.appendChild(noeudChoix);
	}
	}
	else {
		for (var i=0; i<nTab.length; i++) {
		
		// Construction de chaque élément (texte, balise, id)
			var texte = document.createTextNode(nTab[i]['m']);
			var noeudChoix = document.createElement('span');
			ajouterAttribut('id', noeudChoix, 'pAlerte_l'+i);
			noeudChoix.appendChild(texte);
			
			noeudChoix.className = nTab[i]['t'];
		
			elle.noeud.appendChild(noeudChoix);
			
		}
	}

// Paramètres d'affichages CSS
	elle.noeud.style.display = "block";
	document.getElementById('pAlerte').style.opacity = '1';
	document.getElementById('pAlerte').style.filter = 'alpha(opacity=100)';;

// Estompage
	if (nType == 'estompage') {
		setTimeout("laPAlerte.estomper()", nTemps);
		elle.estompage = true;
	}

// Placement de l'alerte sur la page
	if (nPlacement == 'principal') {
		
		var global = document.getElementById('global');
		
		elle.noeud.style.top = '50px';
		
		var gauche = global.offsetLeft;
		elle.noeud.style.left = (gauche+400) + 'px';

	}
	
}


/* MASQUE LA PETITE ALERTE
----------------------------------------------------------------------------
	La petite alerte est toujours présente sur la page, on joue simplement
	sur sa propriété "visibility" pour l'afficher ou la masquer.
	Lorsqu'on la masque , on en profite pour faire un peu de ménage,
	et supprimer tous les éléments <span> : éléments de l'ancien message.
---------------------------------------------------------------------------*/
PAlerte.prototype.masquer = function (){

	var elle = this;
	
// On supprime tous les éléments <span>
	var box = document.getElementById('pAlerte');
	var elSpan = box.getElementsByTagName('span');
	var temp;
	
	while (elSpan.length > 0) {
		for (var i=0; i<elSpan.length; i++) {
			temp = elSpan[i];
			box.removeChild(temp);
		}
		elSpan = box.getElementsByTagName('span');
	}
	
// On rend la boitet invisible, et on le dit
	elle.estVisible = false;
	elle.opacite = '1';
	elle.estompage = false;
	elle.noeud.style.display = "none";
	
// On initialise les propriétés
	elle.type = null;
	
}


/* PLACE EXACTE DES ELEMENTS
----------------------------------------------------------------------------
	Les propriétés offsetTop et offsetLeft permettent respectivement de
	déterminer la position d'un élément par rapport au sommet de la fenêtre
	et à son bord de gauche.
	Mais certains navigateurs ne calculent cette valeur qu'en fonction de
	l'élément parent, et non par rapport à la fenêtre globale.
	Cette fonction permet de remonter autant que necessaire dans le DOM.	
---------------------------------------------------------------------------*/
PAlerte.prototype._realOffsetTop = function (noeud) {
	if (noeud == undefined) return 0;
	return noeud.offsetTop + this._realOffsetTop(noeud.offsetParent);
}

PAlerte.prototype._realOffsetLeft = function (noeud) {
	if (noeud == undefined) return 0;
	return noeud.offsetLeft + this._realOffsetLeft(noeud.offsetParent);
}


/* ESTOMPE LA FENETRE
----------------------------------------------------------------------------
	Cette fonction applique un effet d'estompage. Toutes les 50ms, l'opacité
	de la fenêtre perd 5%.
---------------------------------------------------------------------------*/
PAlerte.prototype.estomper = function (){
	
	var elle = this;

// Récupération de l'opacité actuelle
	var opCrt = elle.opacite;

// Détermination de la nouvelle opacité
	var nvOp = parseFloat(opCrt-0.05);

// Si l'opacité est toujours positive : on estompe encre
	if (nvOp > 0) {
		
	// Inscription de l'opacité dans les paramètres de l'objet
		elle.opacite = nvOp;
		
	// Navigateur basée sur Mozilla Firefox
		document.getElementById('pAlerte').style.opacity = nvOp;
	
	// Internet Explorer
		var al = 'alpha(opacity='+(nvOp*100)+')';
		document.getElementById('pAlerte').style.filter = al;
	
	// Récursivité dans 50ms
		setTimeout("laPAlerte.estomper()", 50);

	}
	
// Dès que l'opacité est nulle, on masque la petite alerte
	else {
		elle.masquer();
	}
}



/* CHARGE LA PETITE ALERTE SUR LA PAGE
----------------------------------------------------------------------------
	Au moment du chargement de la page HTML, l'objet palerte doit être créé,
	et le calque ajouté à la page.
---------------------------------------------------------------------------*/
function cPA(){

	laPAlerte = new PAlerte();

}


