/**
* Fonctions utilisées par la pile de formulaires. On entend par pile, le système comportant plusieurs formulaires virtuellement placés en pile, et
* dont un seul est affiché, la sélection s'effectuant par un système d'onglets.
* L'utilisation de ce script nécessite tout d'abord la présence de la librairie de fonctions contenue dans le fichier de script tools.js.
* Il est indispensable de disposer aussi pour la page du fichier CSS form.css
* On active la gestion de la pile de formulaires par l'invocation de la fonction 
* 	initForm() 
* que l'on peut placer dans l'attribut onload de la balise body de la page, et qui va gérer l'initialisation de la pile, mais aussi
* des initialisations spécifiques de chaque type de formulaire (MEV, MEH, MEC, et MEP). Il est bien évident que pour cela on devra se référer aux 
* documentations de référence liées aux scripts formMEV.js, formMEH.js, formMEC.js, et formMEP.js, la présence de ces scripts dans la page dépendant 
* évidemement de la présence du formulaire associé. IL EST INUTILE D'INCLURE DANS UNE PAGE LES SCRIPTS ET CSS POUR UN FORMULAIRE QUI N'EST PAS UTILISE
* DANS LA PILE DE CETTE PAGE
*
* Les onglets doivent être contenus dans une structure de liste comme suit:
* 	<!-- Le conteneur ul doit posséder la classe onglet -->
* 	<ul class="onglet">
* 		<!-- Chaque onglet doit avoir un id dont le nom commence par la chaine "onglet" -->
* 		<li id="ongletXXX">1er onglet</li>
* 		<li id="ongletYYY">2eme onglet</li>
*		<!-- L'onglet disposant de la classe selected détermine quel formulaire est affiché par défaut -->
* 		<li id="ongletZZZ" class="selected">3eme onglet</li>
* 		     ...
* 	</ul>
* 
* Les formulaires sont alors définis par des tags block comme suit:
* 	<!-- Chaque formulaire doit avoir un id dont le nom commence par la chaine "form" -->
* 	<form id="formXXX"></form>
* 	<form id="formYYY"></form>
* 	<form id="formZZZ"></form>
* 		...
* 
* Il faut bien noter la correspondance entre les onglets et les formulaires ongletXXX <-> formXXX. La syntaxe utilisée ici à la place de XXX est libre.
**/

/**
 * La fonction qui ne fait rien.
 */
var NF=function(){},

/**
 * Pré-définition de méthodes (afin d'éviter que certaines soient absentes et génèrent des erreurs ; même si elles sont catchées)
 */
initFormMEV=NF,
initFormMEH=NF,
initFormMEC=NF,
initFormMEP=NF,

/**
 * Pré-définition de méthodes (afin d'éviter que certaines soient absentes et génèrent des erreurs ; même si elles sont catchées)
 */
readURLMEV=NF,
readURLMEH=NF,
readURLMEC=NF,
readURLMEP=NF,

/**
* Variables globales utilisées par toggle()
**/
fadeToElement,
fadeFromElement,

/**
 * Tableau permettant de stocker tous les objets
 * formulaires (DOM) d'une même page.
 */
formsPile=[];

/**
* Fonction permettant de déterminer le formulaire initialement affiché, et initialisant la variable globale formsPile qui contient les éléments de type
* FORM constituant la pile.
* La sélection de ce formulaire s'effectue par la lecture des classes définies sur les onglets. Si l'onglet "ongletXXX"
* possède la classe "selected" son formulaire associé ("formXXX")est affiché par défaut
* initialise aussi les javascript onclick sur les onglets
**/

function initForm(){
	var forms=document.getElementsByTagName("FORM"), i, form;
	if(!forms.length){
		ev.log.error('Aucun formulaire (FORM) trouvé dans le document !');
		return;
	}
	for(i=0;i<forms.length;i++){
		form=forms[i];
		if(typeof(form.id)!=='string'){continue;}
		var onglet=ev.dom.element("onglet"+form.id.substring(4));
		if(!onglet){continue;}
		formsPile.push(form);
		addJavascriptToAttribute(
			onglet,
			"onclick",
			"displayForm(ev.dom.element('"+form.id+"'));"
		);
		if(hasClass(onglet,"selected")){
			showForm(form);
		}
		else{
			hideForm(form);
			addClass(onglet,"unselected");
		}
	}
	try{
		initFormMEV();
	}
	catch(e){}
	try{
		initFormMEH();
	}
	catch(e){}
	try{
		initFormMEC();
	}
	catch(e){}
	try{
		initFormMEP();
	}
	catch(e){}

	// on lit l'url pour tester si elle contient des parametres existants (defini dans formMEV.js formMEH.js formMEC.js)
	// servant a preremplir les champs des formulaires. Si ils existent, la valeur de ces parametres va preremplir le formulaire.
	readURL();
}

/**
* Initialise automatiquement le selecteur de jours avec toutes ses valeurs, et définit comme jour par défaut 
* celui défini sur l'ordinateur client
*	- select: l'élément select à modifier
**/
function initJours(select) {
	removeOptionInSelect(select);
	for(var j=1;j<=31;j++){
		var option=document.createElement("OPTION");
		var value=""+j;
		if(value<10){
			value="0"+j;
		}
		var text=""+j;
		addOptionInSelect(select,createOption(value,text));
	}
}

/**
* Initialise automatiquement le selecteur de mois avec toutes ses valeurs, et définit comme mois par défaut 
* celui défini sur l'ordinateur client
*	- select: l'élément select à modifier
**/
function initMois(select) {
	removeOptionInSelect(select);
	var now=new Date();
	var mois=now.getMonth()+1;
	var an=now.getFullYear();
	for(var j=0;j<=12;j++){
		var value="";
		if(mois<10) value="0"+mois+"/"+an;
		else value=mois+"/"+an;
		var label=getMoisTexteCourt(mois)+" "+an;
		addOptionInSelect(select,createOption(value,label));
		mois++;
		if(mois>12){
			mois=1;
			an++;
		}
	}
}

/**
* Affiche un formulaire défini par son élément, en mettant à jour l'onglet associé avec la classe selected
*	- element: element form à montrer
**/		
function showForm(element) {
	var onglet=ev.dom.element("onglet"+element.id.substring(4));
	if(onglet){
		removeClass(onglet,"unselected");
		addClass(onglet,"selected");
	}
	if(!element.style||element.style.display!="block") {
		element.style.display="block";
	}
}

/**
* Cache un formulaire défini par son élément, en mettant à jour l'onglet associé avec la classe unselected
*	- id: l'élément form à cacher
**/		
function hideForm(element) {
	var onglet=ev.dom.element("onglet"+element.id.substring(4));
	if(onglet){
		addClass(onglet,"unselected");
		removeClass(onglet,"selected");
	}
	if(!element.style||element.style.display!="none"){
		element.style.display="none";
	}
}

/**
* Fait disparaitre le formulaire actuel en fade out, et apparaitre le nouveau formulaire dans un fade in
*	- element: element form à faire apparaitre
**/
var doFade=true; //par défaut le fadeout/fadein est activé
function displayForm(element) {
	// Si le formulaire à afficher est bien en display none on va lancer le toggle, sinon c'est inutile.
	if(element.style.display!="block") {
		try{
			calendarPool.closeAll();
		}catch(e){}
		// L'identifiant passé détermine le fadeToElement (variable globale)
		fadeToElement=element;
		// On s'assure que l'élément fadeToElement est bien effacé et d'opacité zéro
		hideForm(fadeToElement);
		setOpacity(fadeToElement,0);
		// On recherche l'élément actuellement affiché |-> fadeFromElement,
		// et on cache les autres éléments que fadeFromElement et fadeToElement et on les cache
		for(var i=0;i<formsPile.length;i++){
			var form=formsPile[i];
			if(form!=element){
				if(form.style.display=="block"){
					fadeFromElement=form;
				}
				else{
					hideForm(form);
					setOpacity(form,0);
				}
			}
		}
		// On s'assure que l'élément fadeFromElement est bien visible et d'opacité un
		if(fadeFromElement){
			showForm(fadeFromElement);
			setOpacity(fadeFromElement,1);
			if(doFade) { // On lance le toggle
				toggle(2000);// Le paramètre est optionnel
			}
			else { // On cache le formulaire actuel et on affiche le formulaire voulu
				hideForm(fadeFromElement);
				setOpacity(fadeFromElement,0);
				showForm(fadeToElement);
				setOpacity(fadeToElement,1);
			}
		}
		else{
			showForm(fadeToElement);
			setOpacity(fadeToElement,1);
		}
	}
}

/**
* Fonction récursive servant à passer d'un formulaire à l'autre (fadeToElement à fadeFromElement) par un fade
*	- time: (optionnel) durée totale du processus de fade out & in, défaut 1000ms
*	- fade: (optionnel) si true fade out, si false fade in, default true
**/
function toggle(time,fade) {
	// Si les paramètres ne sont pas définis, on définit les valeurs par défaut
	if(fade===undefined) fade=true; // default fade out
	if(!time) time=1000; // default 1s
	var delay=100; // interval 100ms
	var delta=2.0*delay/time; // multiplié par deux car time est la durée du fade+appear
	// Si on est en phase de fade out
	if(fade) {
		// On récupère l'opacité de l'élément fadeFromElement et on la met à jour (-delta)
		var opacity=parseFloat(fadeFromElement.style.opacity);
		opacity-=delta;
		// Si l'opacité est supérieure à delta (presque zéro)
		if(opacity>delta) {
			// On fixe la nouvelle valeur d'opacité, et on lance toggle récursivement
			setOpacity(fadeFromElement,opacity);
			window.setTimeout("toggle("+time+",true)",delay);
		}
		// Si l'opacité est inférieure à delta (presque zéro)
		else{
			// On fixe l'opacité à zéro, et on passe au fade in (récursivité par toggle())
			setOpacity(fadeFromElement,0);
			hideForm(fadeFromElement);
			showForm(fadeToElement);
			window.setTimeout("toggle("+time+",false)",delay);
		}
	}
	// Si on est en phase de fade in
	else {
		// On récupère l'opacité de l'élément fadeToElement et on la met à jour (+delta)
		var opacity=parseFloat(fadeToElement.style.opacity);
		opacity+=delta;
		// Si l'opacité est presque à 1 (à delta près)
		if(opacity<(1-delta)) {
			// On fixe la nouvelle valeur d'opacité, et on lance toggle récursivement
			setOpacity(fadeToElement,opacity);
			window.setTimeout("toggle("+time+",false)",delay);
		}
		// Si l'opacité est inférieure à 1 (à delta près)
		else{
			// On s'assure que l'élément fadeFromElement est invisible et fadeToElement est visible
			// avec les opacités idoines
			setOpacity(fadeToElement,1);
			showForm(fadeToElement);
			setOpacity(fadeFromElement,0);
			hideForm(fadeFromElement);
		}
	}
}

/**
 * Effectue l'analyse de l'URL d'appel de la page afin de pré-charger les champs input text 
 * correspondants dans une pile de formulaires.
 */
function readURL() {
	try{
		readURLMEV();
	}catch(e){}
	try{
		readURLMEH();
	}catch(e){}
	try{
		readURLMEC();
	}catch(e){}
	try{
		readURLMEP();
	}catch(e){}
}



function setTargetForm (targetForm) {
	try {
		setTargetFormMEV (targetForm)
	}
	catch(e) {}
	
	try {
		setTargetFormMEH (targetForm)
	}
	catch(e) {}
	
	try {
		setTargetFormMEC (targetForm)
	}
	catch(e) {}
}
