/**
*@addtogroup COMPOSANT
*
*Comp_Fenetre
*Script permettant de gérer les effets sur les fenêtres (faux popup).
*
*@author François Béliveau <fbeliveau@mexup-soft.com>
*@copyright 2006 MEXUP <http://www.mexup-soft.com>
*@license GNU General Public License <http://www.gnu.org/copyleft/gpl.html>
*@version 0.1.1
*@todo gestion externe de la langue ?
*@todo mettre en premier plan la fenêtre active
*/
function Comp_Fenetre()
{
	//singleton
	obj_Pointeur = this.constructor;
	if(obj_Pointeur.obj_Instance == undefined)
	{
		//propriétés
		this.bool_Compatible = null;
		this.array_Requis = new Array(
			document.getElementById,
			document.getElementsByTagName,
			document.createElement,
			document.createTextNode,
			Bib_Elements.get_ElementsByClassName,
			Bib_Elements.get_Cible,
			Bib_Elements.set_Action,
			Bib_Elements.unset_Action,
			Bib_Elements.exec_StopAction
		);

		this.str_UrlImageTheme = null;
		this.bool_AnalyseCss = false;
		this.str_Classe = 'fenetre';
		this.str_ClasseActif = 'comp_fenetre';
		this.str_ImageReduire = 'fenetre_reduire.png';
		this.str_ImageRestaurer = 'fenetre_restaurer.png';
		this.str_ImageFermer = 'fenetre_fermer.png';

		obj_Pointeur.obj_Instance = this;
	}
	else
		return obj_Pointeur.obj_Instance;
}

/*------------------------------------------------------------
METHODES PRIVEES
------------------------------------------------------------*/

/**
*check_Compatible
*Spécifit si le navigateur du client est compatible ou non avec le code de la classe.
*Un système de "cache" est utilisé pour stocker le résultat dans une variable.
*Ce qui permet d'appeler autant de fois que l'on souhaite la fonction sans pour autant refaire le test complètement
*
*@return     boolean
*/
Comp_Fenetre.prototype.check_Compatible = function()
{
	if(this.bool_Compatible != true && this.bool_Compatible != false)
	{
		this.bool_Compatible = true;
		try
		{
			var int_NbRequis = this.array_Requis.length - 1;
			for(var int_I = 0; int_I<int_NbRequis; int_I++)
			{
				if(!this.array_Requis[int_I])
				{
					this.bool_Compatible = false;
					break;
				}
			}
		}
		catch(obj_Erreur)
		{
			this.bool_Compatible = false;
		}
	}
	return this.bool_Compatible;
};

/**
*get_UrlImageTheme
*Retourne l'url du dossier image du theme en cours.
*
*@return     void
*/
Comp_Fenetre.prototype.get_UrlImageTheme = function()
{
	if(this.str_UrlImageTheme === null)
	{
		this.str_UrlImageTheme = '';
		var int_NbCss = document.styleSheets.length;
		for(var int_I=0; int_I < int_NbCss; int_I++)
		{
			var str_UrlCss = document.styleSheets[int_I].href;
			var int_IndiceSlash = str_UrlCss.lastIndexOf('/');
			var str_FichierCss = str_UrlCss;
			if(int_IndiceSlash > 0)
			{
				int_IndiceSlash += 1;
				var int_Longueur = str_UrlCss.length
				str_FichierCss = str_UrlCss.substring(int_IndiceSlash, int_Longueur);
			}

			if(str_FichierCss === 'style.css')
			{
				this.str_UrlImageTheme = str_UrlCss.substring(0, int_IndiceSlash)+'images/';
				break;
			}
		}
	}
	return this.str_UrlImageTheme;
}

/**
*exec_Fermer
*Ferme une fenetre.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Fenetre.prototype.exec_Fermer = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	//on remonte jusqu'au conteneur principal de la fenêtre
	var obj_Fenetre = obj_Cible;
	while(obj_Fenetre && obj_Fenetre.className != 'comp_fenetre')
	{
		obj_Fenetre = obj_Fenetre.parentNode;
	}
	if(obj_Fenetre)
		obj_Fenetre.style.display = 'none';

	return Bib_Elements.exec_StopAction(obj_Evenement);
}

/**
*exec_ReduireRestaurer
*Réduit ou restore une fenetre.
*
*@param     object[Evenement]
*
*@return     boolean
*/
Comp_Fenetre.prototype.exec_ReduireRestaurer = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	//on remonte jusqu'au conteneur principal de la fenêtre
	var obj_Fenetre = obj_Cible;
	while(obj_Fenetre && obj_Fenetre.className != 'comp_fenetre')
	{
		obj_Fenetre = obj_Fenetre.parentNode;
	}
	if(obj_Fenetre)
	{
		var array_Contenu = Bib_Elements.get_ElementsByClassName(obj_Fenetre, '*', 'fenetre_contenu');
		if(array_Contenu.length < 1)
			return;
		var obj_Contenu = array_Contenu[0];
		if(obj_Contenu.style.display == 'none')
		{
			var array_Image = obj_Cible.getElementsByTagName('img');
			if(array_Image.length > 0)
			{
				var obj = new Comp_Fenetre();
				array_Image[0].src = obj.get_UrlImageReduire();
				array_Image[0].alt = 'Réduire';
				array_Image[0].title = 'Réduire';
			}
			else
				obj_Cible.firstChild.nodeValue = 'Réduire';
			obj_Contenu.style.display = 'block';
		}
		else
		{
			var array_Image = obj_Cible.getElementsByTagName('img');
			if(array_Image.length > 0)
			{
				var obj = new Comp_Fenetre();
				array_Image[0].src = obj.get_UrlImageRestaurer();
				array_Image[0].alt = 'Restaurer';
				array_Image[0].title = 'Restaurer';
			}
			else
				obj_Cible.firstChild.nodeValue = 'Restaurer';
			obj_Contenu.style.display = 'none';
		}
	}
	return Bib_Elements.exec_StopAction(obj_Evenement);
}

/**
*exec_ActionClavier
*Effectue l'action demandé via le clavier.
*
*@param     object[Evenement]
*
*@return     void
*/
Comp_Fenetre.prototype.exec_ActionClavier = function(obj_Evenement)
{
	var obj_Cible = Bib_Elements.get_Cible(obj_Evenement);
	//on remonte jusqu'au conteneur principal de la fenêtre
	var obj_Fenetre = obj_Cible;
	while(obj_Fenetre && obj_Fenetre.className != 'comp_fenetre')
	{
		obj_Fenetre = obj_Fenetre.parentNode;
	}

	int_Touche = window.Event?obj_Evenement.which:event.keyCode;

	//Déplacer la fenêtre avec les flèches
	if(int_Touche==40 || int_Touche==98)
	{
		obj_Fenetre.style.top = obj_Fenetre.offsetTop + 50 + 'px';
		return false;
	}else if(int_Touche==38 || int_Touche==104)
	{
		obj_Fenetre.style.top = obj_Fenetre.offsetTop - 50 + 'px';
		return false;
	}
	if(int_Touche==37 || int_Touche==100)
		obj_Fenetre.style.left = obj_Fenetre.offsetLeft - 50 + 'px';
	if(int_Touche==39 || int_Touche==102)
		obj_Fenetre.style.left=obj_Fenetre.offsetLeft + 50 + 'px';
	else if(int_Touche==27)
		obj_Fenetre.style.display='none';
}

/*------------------------------------------------------------
METHODES PUBLIQUES
------------------------------------------------------------*/

/**
*get_UrlImageReduire
*Retourne l'url de l'image du bouton réduire.
*
*@return     string
*/
Comp_Fenetre.prototype.get_UrlImageReduire = function()
{
	return this.get_UrlImageTheme()+this.str_ImageReduire;
}

/**
*get_UrlImageRestaurer
*Retourne l'url de l'image du bouton restaurer.
*
*@return     string
*/
Comp_Fenetre.prototype.get_UrlImageRestaurer = function()
{
	return this.get_UrlImageTheme()+this.str_ImageRestaurer;
}

/**
*get_UrlImageFermer
*Retourne l'url de l'image du bouton fermer.
*
*@return     string
*/
Comp_Fenetre.prototype.get_UrlImageFermer = function()
{
	return this.get_UrlImageTheme()+this.str_ImageFermer;
}

/**
*exec_Initialisation
*Execute l'initialisation d'une fenetre.
*
*@param     object[element HTML]
*
*@return     void
*/
Comp_Fenetre.prototype.exec_Initialisation = function(obj_Fenetre)
{
	if(!this.check_Compatible())
		return;

	if(!obj_Fenetre)
		return;

	//récupération du titre de la fenêtre
	var array_Titre = Bib_Elements.get_ElementsByClassName(obj_Fenetre, '*', 'fenetre_titre');
	if(array_Titre.length < 1)
		return;
	var obj_Titre = array_Titre[0];

	//récupération du contenu de la fenêtre
	var array_Contenu = Bib_Elements.get_ElementsByClassName(obj_Fenetre, '*', 'fenetre_contenu');
	if(array_Contenu.length < 1)
		return;
	var obj_Contenu = array_Contenu[0];

	//création du menu de la fenêtre
	var obj_UlTemp = document.createElement('ul');
	obj_Titre.insertBefore(obj_UlTemp, obj_Titre.firstChild);

	//ajout du lien "réduire/restaurer" de la fenêtre
	var obj_LiTemp = document.createElement('li');
	obj_UlTemp.appendChild(obj_LiTemp);
	var obj_ATemp = document.createElement('a');
	obj_LiTemp.appendChild(obj_ATemp);
	obj_ATemp.setAttribute('href', '#reduire_restaurer-Fenetre');
	Bib_Elements.set_Action(obj_ATemp, 'click', this.exec_ReduireRestaurer, false);
	var str_Url = this.get_UrlImageReduire();
	var obj_ImgTemp = document.createElement('img');
	obj_ATemp.appendChild(obj_ImgTemp);
	obj_ImgTemp.setAttribute('src', str_Url);
	obj_ImgTemp.setAttribute('alt', 'Réduire');
	obj_ImgTemp.setAttribute('title', 'Réduire');

	//préchargement de l'autre image
	var obj_Image = new Image();
	obj_Image.src = this.get_UrlImageRestaurer();

	//ajout du lien "fermer" de la fenêtre
	var obj_LiTemp = document.createElement('li');
	obj_UlTemp.appendChild(obj_LiTemp);
	var obj_ATemp = document.createElement('a');
	obj_LiTemp.appendChild(obj_ATemp);
	obj_ATemp.setAttribute('href', '#fermer-Fenetre');
	Bib_Elements.set_Action(obj_ATemp, 'click', this.exec_Fermer, false);
	var obj_SpanTemp = document.createElement('span');
	obj_ATemp.appendChild(obj_SpanTemp);
	var str_Url = this.get_UrlImageFermer();
	var obj_ImgTemp = document.createElement('img');
	obj_ATemp.appendChild(obj_ImgTemp);
	obj_ImgTemp.setAttribute('src', str_Url);
	obj_ImgTemp.setAttribute('alt', 'Fermer');
	obj_ImgTemp.setAttribute('title', 'Fermer');

	//gestion du déplacement de la fenêtre avec la souris
	Mxp_DomDeplacement.init(obj_Titre, obj_Fenetre);

	//gestion du déplacement de la fenêtre avec le clavier
	Bib_Elements.set_Action(obj_Fenetre, 'keydown', this.exec_ActionClavier, false);
	obj_Fenetre.className = this.str_ClasseActif;

	//positionnement initial de la fenêtre au centre de l'écran
	Bib_Elements.exec_Centrer(obj_Fenetre, true);
};

/**
*exec_InitialisationGlobale
*Execute l'initialisation des fenêtres du document.
*
*@return     void
*/
Comp_Fenetre.prototype.exec_InitialisationGlobale = function()
{
	if(!this.check_Compatible())
		return;

	var array_Fenetre = Bib_Elements.get_ElementsByClassName(document, 'div', this.str_Classe);
	var int_NbFenetre = array_Fenetre.length;
	for(var int_I=0; int_I<int_NbFenetre; int_I++)
	{
		this.exec_Initialisation(array_Fenetre[int_I]);
	}
};

if(Mxp_Init.set_NouvelleFonction)Mxp_Init.set_NouvelleFonction(function(){var obj_Temp = new Comp_Fenetre();obj_Temp.exec_InitialisationGlobale();});
