// ***********************************************************************************************
// Fonctions pour la gestion de popin
// ***********************************************************************************************
// @uteur Jean-Philippe RIVET

// Largeur (en px) par défaut de la PopIn si la taille n'est pas spécifier
var popInLargeurParDefaut = 485;
var popInLargeurMin = 200;
var popInLargeurMax = 1000;
var popInTailleOuvertureFermeture = 20;
var popInCheminEnCours = "";

// Vitesse (en ms) d'ouverture ou de fermeture
var popInVitesseOuvertureFermeture = 300;

// Vitesse (en ms) d'apparition et de disparition des contenus
var popInVitesseMasquage = 200;

var requeteContenuPopIn;

// ---------------------------------------------------------
function iniPopIn(){
	initialisationLiensPourPopIn();
}

// ---------------------------------------------------------
function initialisationLiensPourPopIn(){
	//alert("--initialisationLiensPourPopIn");

	var listeObj = $cn("JS_ouvrirPopIn");

	var i;
	for(i=0; _A = listeObj[i]; i++){
		// Si une URL est indiquée
		if(_A.href.indexOf("javascript") < 0){
			// Alors on initialise la balise A
			// On applique la fonction pour la lancer par action de souris ou du bouton enter
			_A.setAttribute("href", "javascript: declencherAppelContenuPopIn('" + _A.href + "&popin=1')");
			_A.setAttribute("target", "");
		}
	}
	
	var listeObj = $cn("JS_fermerPopIn");
	var i;
	for(i=0; _Element = listeObj[i]; i++){
		
		// On supprime la classe pour faire apparaitre les liens de fermeture
		supprimerUneClasse(_Element, "JS_fermerPopIn");
		
		// Si l'élément n'est pas une balise A direct
		if(_Element.tagName != "A"){
			// Alors on recherche la première balise A du parent
			_Element = _Element.getElementsByTagName("A")[0];
		}
		
		// On applique la fonction pour la lancer par action de souris ou du bouton enter
		_Element.setAttribute("href", "javascript: fermerPopIn()");
	}
}

// ---------------------------------------------------------
function creationTemplatePopIn(resultatRequete){
	//alert("--creationTemplatePopIn");

	var _DIVPopIn = document.createElement("DIV");
	_DIVPopIn.setAttribute("id", "popInConteneur");
	
	/*var _BODY = document.body;
	_BODY.appendChild(_DIV);*/
	
	//var _DIVSiteEntier = $id("siteEntier");
	//_DIVSiteEntier.appendChild(_DIVPopIn);
	document.body.appendChild(_DIVPopIn);
	
	
				
	// Récupération du template entier de la PopIn
	var popInTemplate = extraireDuTexte(resultatRequete, "<!--popInTemplate_Debut-->", "<!--popInTemplate_Fin-->");
	
	// On injecte le template de la PopIn
	var _DIVPopInConteneur = $id("popInConteneur");	
	_DIVPopInConteneur.style.position = "absolute";
	_DIVPopInConteneur.style.left = "-9999px";
	_DIVPopInConteneur.style.height = "100%";
	
	//alert("--injecterCodeHTML(_DIVPopInConteneur, popInTemplate)");
	injecterCodeHTML(_DIVPopInConteneur, popInTemplate);
	
	masquerPopIn();	
	initialiserStructurePopInPremierAppel();
}

function initialiserStructurePopInPremierAppel(){
	var _TD = $id("popInConteneurCentreTab");
	
	// Application les tailles d'origines pour la toute première ouverture de la PopIn
	_TD.largeurDebut = popInTailleOuvertureFermeture;
	_TD.hauteurDebut = popInTailleOuvertureFermeture;
	
	_TD.style.width = _TD.largeurDebut + "px";
	_TD.style.height = _TD.hauteurDebut + "px";
	
	//alert("--initialiserStructurePopInPremierAppel | largeurDebut = " + _TD.largeurDebut + " - hauteurDebut = " + _TD.hauteurDebut);
	
	// Définition de l'interpolation d'apparition et de disparition du masque de mesure
	interpolationDefinition("popInMasqueMesure", "opacity", "regulier", 0, 100, popInVitesseMasquage);
}

// ---------------------------------------------------------
function declencherAppelContenuPopIn(cheminFichier){
	//alert("--declencherAppelContenuPopIn");
	
	// Si le nouveau chemin pointé et différent de celui en cours
	if(cheminFichier != popInCheminEnCours){
		// Alors on charge le nouveau contenu
		
		// Récupération du lien pointé
		popInCheminEnCours = cheminFichier;
		
		// Récupération en AJAX du prochain contenu
		chargerNouveauContenuPopIn(cheminFichier);
	}
}

// ---------------------------------------------------------
function ouvrirPopIn(cheminFichier){
	//alert("--cheminFichier");
	
	// Si le nouveau chemin pointé et différent de celui en cours
	if(cheminFichier != popInCheminEnCours){
		// Alors on charge le nouveau contenu
		
		// Récupération du lien pointé
		popInCheminEnCours = cheminFichier;
		
		// Récupération en AJAX du prochain contenu
		chargerNouveauContenuPopIn(cheminFichier);
	}
}

// ---------------------------------------------------------
function fermerPopIn(){
	
	requeteContenuPopIn.abort();
	
	popInCheminEnCours = "";
	
	var _TD = $id("popInConteneurCentreTab");
	
	// On détermine un temps de fermeture proportionnel à la taille de la popIn
	var temp = Math.abs(_TD.largeurFin + _TD.hauteurFin) / 15;
	temp = 600;
	if(temp > popInVitesseOuvertureFermeture)
		temp = popInVitesseOuvertureFermeture;
	
	interpolationDefinition(_TD, "width", "decelerer",  connaitreLargeur(_TD), popInTailleOuvertureFermeture, temp);
	interpolationDefinition(_TD, "height", "decelerer", connaitreHauteur(_TD), popInTailleOuvertureFermeture, temp);
	interpolationDefinition("popInConteneur", "opacity", "decelerer", 100, 0, popInVitesseMasquage);
	
	//alert("--fermerPopIn : " + connaitreLargeur(_TD));
	
	_TD.interpolation.height.finSeqLectureNormale = function(){
		//alert("--_TD.interpolation.height.finSeqLectureNormale : lecture");
		$id("popInConteneur").interpolation.opacity.lecture();
	};
	
	$id("popInConteneur").interpolation.opacity.finSeqLectureNormale = function(){
		//alert("--$id('popInConteneur').interpolation.opacity.finSeqLectureNormale : masquerPopIn");
		masquerPopIn();
	};
	
	
	$id("popInMasqueMesure").interpolation.opacity.finSeqLectureInverse = function(){
		//alert("--$id('popInMasqueMesure').interpolation.opacity.finSeqLectureInverse");
		masquerContenuPopInEnCSS();
		
		//alert("--injecterCodeHTML($id('popInContenu'), '')");
		injecterCodeHTML($id("popInContenu"), "");

		$id("popInConteneurCentreTab").interpolation.height.lecture();
		$id("popInConteneurCentreTab").interpolation.width.lecture();
	};
			
	annulerAdaptationPopInAuContenuEnCSS();	
	$id("popInMasqueMesure").interpolation.opacity.lectureInverse();
}

// ---------------------------------------------------------
function masquerPopIn(){
	//alert("--masquerPopIn");
	
	var _DIV = $id("popInConteneur");
	appliquerTransparence(_DIV, 100);
	_DIV.visible = false;
	_DIV.style.left = "-9999px";
	//_DIV.style.left = "0";
	_DIV.style.top = "0";
	
	// On rend la taille de la PopIn indépendante de son contenu
	annulerAdaptationPopInAuContenuEnCSS();	
}

// ---------------------------------------------------------
function chargerNouveauContenuPopIn(cheminFichier){
	//alert("--chargerNouveauContenuPopIn");
	
	// Création et envoi de la requete pour récupérer le prochain fichier du contenu
	requeteContenuPopIn = new ajaxRequeteAsynchroneGet(cheminFichier);
	requeteContenuPopIn.onreadystatechange = requeteContenuPopIn_StateChange;
	requeteContenuPopIn.send(null);
}

function requeteContenuPopIn_StateChange(){
	if(requeteContenuPopIn.readyState == 4){
		if(requeteContenuPopIn.status == 200){
			
			//alert("--requeteContenuPopIn_StateChange : nouveau contenu chargé");
			
			// Si le template n'est pas encore chargé
			if($id("popInConteneur") == null){
				//alert("--Pas de template PopIn");
				// Alors on créé le conteneur de la structure
				creationTemplatePopIn(requeteContenuPopIn.responseText);
			}
			
			// Récupération de la valeur de la requête
			$id("popInContenu").contenu = requeteContenuPopIn.responseText;
			
			
			// On fait disparaitre l'ancien contenu
			masquerContenuPopInInterpolation();
			
		}else if(requeteContenuPopIn.status != 0){
			alert("Erreur lors de la recherche du contenu de PopIn - Erreur de serveur N°" + requeteContenuPopIn.status);	
		}
	}
}

// ---------------------------------------------------------
function masquerContenuPopInInterpolation(){	
	//alert("--masquerContenuPopInInterpolation");
	
	if($id("popInConteneur").visible){
		// Si la PopIn est déjà ouverte
		//alert("-- PopIn déjà ouverte. Besoin de faire disparaitre l'ancien contenu");
		
		// On fait l'interpolation de transparence pour faire disparaitre l'ancien contenu
		$id("popInMasqueMesure").interpolation.opacity.finSeqLectureInverse = function(){
			//alert("--$id('popInMasqueMesure').interpolation.opacity.finSeqLectureInverse");
			// Quand la disparition est finie, on analyse le prochain contenu
			extractionPourPopIn();
		};
				
		// Lecture de l'interpolation de transparence. On fait disparaitre le contenu
		$id("popInMasqueMesure").interpolation.opacity.lectureInverse();
		
	}else{
		// Si la PopIn est fermée
		//alert("-- PopIn déjà fermée. Pas besoin de faire disparaitre l'ancien contenu");
		
		// On analyse le contenu directement
		extractionPourPopIn();
	}	
}

function masquerContenuPopInEnCSS(){
	//alert("--masquerContenuPopInEnCSS");
	$id("popInMasqueMesure").style.visibility = "hidden";
}

// ---------------------------------------------------------
function extractionPourPopIn(){
	//alert("--extractionPourPopIn");
	
	// On rend invisible le prochain contenu
	masquerContenuPopInEnCSS();
	
	// On rend la taille de la PopIn indépendante de son contenu
	annulerAdaptationPopInAuContenuEnCSS();	
	
	// Extraction du contenu de la PopIn
	var popInContenu = extraireDuTexte($id("popInContenu").contenu, "<!--popInContenu_Debut-->", "<!--popInContenu_Fin-->");
	var _DIV = $id("popInContenu");
	var largeurChoisie;
	
	if(popInContenu){
		// Si le contenu est existant
		
		// On injecte le nouveau contenu dans la PopIn
		//alert("--injecterCodeHTML(_DIV, popInContenu)");
		injecterCodeHTML(_DIV, popInContenu);
		
		// On récupère la largeur de la PopIn spécifiée
		largeurChoisie = popInLargeurParDefaut;		
		
	}else{
		// Si le contenu est inexistant
		
		// On créé un message d'erreur
		var codeHTML = '<div class="erreurPopIn"><p>Ce contenu n\'est pas accessible !</p><p><a href="#" class="JS_fermerPopIn">Fermer la PopIn</a></p></div>'

		// On injecte le nouveau contenu dans la PopIn
		alert("injecterCodeHTML(_DIV, codeHTML d'erreur)");
		injecterCodeHTML(_DIV, codeHTML);
		
		// Application de la taille par défaut du message d'erreur
		largeurChoisie = 200;
	}
	
	// On indique la largeur définitive 
	$id("popInMasqueMesure").largeurChoisie = largeurChoisie;
	
	
	// On reparse tous les contenus pour détecter les nouveaux liens de PopIN 
	initialisationLiensPourPopIn();
	
	// Phase de redimentionnement et d'apparition du contenu
	redimentionnerPopIn();
}

// ---------------------------------------------------------
function redimentionnerPopIn(){
	//alert("--redimentionnerPopIn");
	
	// On analyse la nouvelle taille
	mesurerNouvelleTailleContenuPopIn();
	
	// La PopIn entière peut apparaitre
	demasquerPopIn();
	
	// Animation du redimentionnenent de la PopIn
	var _TD = $id("popInConteneurCentreTab");
	
	// On définie les nouvelles interpolations de taille
	var temp = (Math.abs(_TD.largeurFin - _TD.largeurDebut) + Math.abs(_TD.hauteurFin - _TD.hauteurDebut));
	if(temp > popInVitesseOuvertureFermeture)
		temp = popInVitesseOuvertureFermeture;
	
	interpolationDefinition(_TD, "width", "decelerer",  _TD.largeurDebut, _TD.largeurFin, temp);
	interpolationDefinition(_TD, "height", "decelerer", _TD.hauteurDebut, _TD.hauteurFin, temp);
	
	_TD.interpolation.height.finSeqLectureNormale = function(){
		// Quand l'interpolation est terminée
		//alert("--_TD.interpolation.height.finSeqLectureNormale");
		
		// On fait réapparaitre physiquement le contenu
		//$id("popInMasqueMesure").style.display = "block";
		
		// On élimine les attributs de taille à la PopIn pour qu'elle s'adapte au changement de taille de police
		adaptationPopInAuContenuEnCSS();
		
		// On lance l'interpolation d'apparition du contenu
		demasquerContenuPopInInterpolation();
	};
	
	// On fait disparaitre physiquement le contenu pour l'animation
	//$id("popInMasqueMesure").style.display = "none";
	
	// On lance les interpolations
	_TD.interpolation.height.lecture();
	_TD.interpolation.width.lecture();
}

function mesurerNouvelleTailleContenuPopIn(){
	// On applique la nouvelle largeur au masque de mesure
	var _Masque = $id("popInMasqueMesure");
	_Masque.style.width = _Masque.largeurChoisie + "px";
	
	// On détermine la nouvelle largeur et hauteur de la PopIn en fonction de la taille du masque de mesure
	var _TD = $id("popInConteneurCentreTab");
	_TD.largeurFin = connaitreLargeur(_Masque);
	_TD.hauteurFin = connaitreHauteur(_Masque);
	
	//alert("--mesurerNouvelleTailleContenuPopIn | largeurFin = " + _TD.largeurFin + " - hauteurFin = " + _TD.hauteurFin);
}

function mesurerAncienneTailleContenuPopIn(){
	// On mesure la taille actuelle avant changement de taille
	var _TD = $id("popInConteneurCentreTab");
	_TD.largeurDebut = connaitreLargeur(_TD);
	_TD.hauteurDebut = connaitreHauteur(_TD);
	
	//alert("--mesurerAncienneTailleContenuPopIn | largeurDebut = " + _TD.largeurDebut + " - hauteurDebut = " + _TD.hauteurDebut);
}

function adaptationPopInAuContenuEnCSS(){
	// La PopIn s'adapte maintenant au changement de taille de police
	$id("popInConteneurCentreTab").style.height = "auto";
	$id("popInMasqueMesure").style.position = "relative";
	
	//alert("--adaptationPopInAuContenuEnCSS | popInConteneurCentreTab hauteur = " + connaitreHauteur($id("popInConteneurCentreTab")) + " | popInMasqueMesure hauteur = " + connaitreHauteur($id("popInMasqueMesure")));
}

function annulerAdaptationPopInAuContenuEnCSS(){
	//alert("--annulerAdaptationPopInAuContenuEnCSS");
	
	// Mesure de la taille d'origine avec le contenu dépendant
	mesurerAncienneTailleContenuPopIn();
	
	// On fixe la taille de la PopIn
	var _TD = $id("popInConteneurCentreTab");
	_TD.style.width = _TD.largeurDebut + "px";
	_TD.style.height = _TD.hauteurDebut + "px";
	
	// Le contenu devient indépendant de la PopIn
	$id("popInMasqueMesure").style.position = "absolute";
}

// ---------------------------------------------------------
function demasquerPopIn(){	
	//alert("--demasquerPopIn / On position la contenu par rapport au déplacement par scroll");
	
	// On demasque et centre la PopIn en fonction du déplacement de scroll
	var _DIV = $id("popInConteneur");
	_DIV.style.zIndex = "999";
	_DIV.visible = true;
	_DIV.style.top = connaitrePositionScroll().top + "px";
	_DIV.style.left = "0";	
}

// ---------------------------------------------------------
function demasquerContenuPopInInterpolation(){	
	//alert("--demasquerContenuPopInInterpolation");
	
	// On commence l'interpolation au début
	$id("popInMasqueMesure").interpolation.opacity.teteLectureAuDebut();
	
	// On recadre la PopIn s'il y a eu déplacement par scroll
	demasquerContenuPopInCSS();
	
	// On fait apparaitre le contenu de la PopIn
	$id("popInMasqueMesure").interpolation.opacity.lecture();
	$id("popInCroixFermer").focus();
}

function demasquerContenuPopInCSS(){
	//alert("--demasquerContenuPopInCSS");
	$id("popInMasqueMesure").style.visibility = "visible";
}