/*||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|                                       Objet Alerte                                       |
|------------------------------------------------------------------------------------------|
|                                                                                          |
|           L'alerte permet de transmettre à l'utilisateur les messages d'erreurs          |
|                                  généré par le système.                                  |
|           Graphiquement, il s'agit d'une boite qui apparaît à l'écran, et qui            |
|             affiche sous forme de liste les erreurs renvoyés par le système.             |
|                                                                                          |
|------------------------------------------------------------------------------------------|
|                                                                                          |
| Fonctions disponibles :                                                                  |
|    - Alerte()                                                                            |
|    - afficher()                                                                          |
|    - masquer()                                                                           |
|    - _realOffsetTop()                                                                    |
|    - _realOffsetLeft()                                                                   |
|    - chargerAlerte()                                                                     |
|                                                                                          |
|                                                                                    1.5.0 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|                                                         Benjamin COIFFARD - janvier 2010 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||*/


/**
 * Constructeur de l'objet Alerte
 * 
 * Le constructeur de l'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 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.
 * 
 * @param none
 * @return void
 */
/*-----------------------------------------------------------------------------------------*/
function Alerte()
{

// Initialisation des attributs de l'alerte
	var elle = this;
	elle.type = null;
	elle.estVisible = false;
	elle.noeud = document.createElement('div');
	elle.noeud.className = 'alerte';
	ajouterAttribut('id', elle.noeud, 'alerte');
	elle.noeud.style.width = '500px';

// Ajout de l'élément au DOM
	document.getElementsByTagName('body')[0].appendChild(elle.noeud);

}


/**
 * Affichage de l'alerte
 * 
 * Le calque de l'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 l'alerte,
 * on vérifie qu'elle n'est pas déjà présente, et si oui, on l'efface.
 * "visibility" pour l'afficher ou la masquer.
 * Le paramètre nType indique le type d'alerte
 * Le paramètre nMessage est un tableau contenant le message à afficher. Le nombre de
 * colonnes de ce tableau peut varier, selon le type d'alerte, ce qui a pour conséquence
 * de modifier l'affichage.
 * 
 * @param string nType type d'alerte
 * @param array nMessage tableau contenant le message à afficher
 * @return void
 */
/*-----------------------------------------------------------------------------------------*/
Alerte.prototype.afficher = function (nType, nMessage)
{

// Initialisation de la variable elle, contenant l'objet à traiter
	var elle = this;
	
// Si l'alerte est déjà affichée, on la vide et on l'efface
	if (elle.estVisible)
		elle.masquer();
	elle.estVisible = true;

// Modification du type d'alerte dans les paramètres de l'objet
	elle.type = nType;

// Construction du message à partir du tableau

// Alerte de type simple : le tableau ne contient qu'une seule colonne
	if (nType == 'simple')
	{
		
	// Message d'entete
		if (nMessage.length == 0)
		{
			var texte = "Le système détecte une erreur, mais ne parvient pas à ";
			texte += "l'identifier. Vérifiez les éléments que vous venez de soumettre ";
			texte += "au système et contacter l'administrateur si le problème persiste.";
		}
		
		else if (nMessage.length == 1)
		{
			var texte = "";
		}
		
		else
		{
			var texte = "Les problèmes suivant bloquent le système. ";
			texte += "Corrigez-les avant de poursuivre votre action.";
		}

		var noeudtexte = document.createTextNode(texte);
		var noeudLigne = document.createElement('span');
		ajouterAttribut('id', noeudLigne, 'alerte_entete');
		noeudLigne.appendChild(noeudtexte);
		noeudLigne.className = 'elEntete';
		elle.noeud.appendChild(noeudLigne);

	// Liste des messages
		for (var i=0; i<nMessage.length; i++)
		{
			var texte = document.createTextNode(nMessage[i]);
			var noeudLigne = document.createElement('span');
			ajouterAttribut('id', noeudLigne, 'alerte_l'+i);
			noeudLigne.appendChild(texte);
			noeudLigne.className = 'elListe';
			elle.noeud.appendChild(noeudLigne);
		}
	}

// Bouton OK
	var texteOK = document.createTextNode("OK");
	var noeudOK = document.createElement('span');
	ajouterAttribut('id', noeudOK, 'alerte_ok');
	noeudOK.appendChild(texteOK);
	noeudOK.className = 'elOK';
	elle.noeud.appendChild(noeudOK);
	
	document.getElementById('alerte_ok').onmouseover = function()
	{
		this.style.backgroundColor = '#660000';
		this.style.color = '#ffcccc';
	}
	
	document.getElementById('alerte_ok').onmouseout = function()
	{
		this.style.backgroundColor = '#ffcccc';
		this.style.color = '#660000';
	}
	
	document.getElementById('alerte_ok').onclick = function()
	{
		lAlerte.masquer();
	}


	// Liste des messages

/*  Paramètres d'affichages CSS
	L'alerte se présente comme un bloc de 500px de larges, centré sur
	la page. Ce bloc est directement inséré dans l'élément 'global' dont
	la largeur est de 834px. L'alerte se situe alors à 167px du bord
	gauche, et 200px du haut de la page
*/
	
	elle.noeud.style.display = "block";
	
	var global = document.getElementById('global');
	var gauche = global.offsetLeft;
	elle.noeud.style.left = (gauche+167) + 'px';
	
	elle.noeud.style.top = '230px';
		
}


/**
 * Fermeture de l'alerte
 * 
 * Le calque de l'alerte est toujours présente sur la page, on joue simplement sur la
 * 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.
 * 
 * @param none
 * @return void
 */
/*-----------------------------------------------------------------------------------------*/
Alerte.prototype.masquer = function ()
{

// Initialisation de la variable elle, contenant l'objet à traiter
	var elle = this;
	
// On supprime tous les éléments <span>
	var box = document.getElementById('alerte');
	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.noeud.style.display = "none";
	
// On initialise les propriétés
	elle.type = null;
	
}


/**
 * Détermination de la position d'un élément par rapport au sommet de la fenêtre
 * 
 * La propriété offsetTop permet de déterminer la position d'un élément par rapport au sommet
 * de la fenêtre. 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.	
 * 
 * @param node noeud noeud dont on cherche la position
 * @return void
 */
/*-----------------------------------------------------------------------------------------*/
Alerte.prototype._realOffsetTop = function (noeud)
{
	if (noeud == undefined) return 0;
	return noeud.offsetTop + this._realOffsetTop(noeud.offsetParent);
}



/**
 * Détermination de la position d'un élément par rapport au bord gauche de la fenêtre
 * 
 * La propriété offsetLeft permet de déterminer la position d'un élément par rapport au bord
 * gauche de la fenêtre. 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.	
 * 
 * @param node noeud noeud dont on cherche la position
 * @return void
 */
/*-----------------------------------------------------------------------------------------*/
Alerte.prototype._realOffsetLeft = function (noeud)
{
	if (noeud == undefined) return 0;
	return noeud.offsetLeft + this._realOffsetLeft(noeud.offsetParent);
}


/**
 * Chargement de l'objet Alerte sur la page
 * 
 * Au moment du chargement de la page HTML, l'objet Alerte doit être créé, et le calque
 * ajouté à la page.
 * 
 * @param none
 * @return void
 */
/*-----------------------------------------------------------------------------------------*/
function chargerAlerte()
{
	lAlerte = new Alerte();
}


