// wnd est l'objet fenetre popup overt.
wnd						= false;

// tabCptStatus permet de gerer les taches en instance par numéro de job.
var tabCptStatus		= new Array(0,0,0,0,0,0,0,0,0,0);

// chemin des images et du répertoire www.
var cheminImagesCarnet;
var cheminWWW = "/www/"

// Enleve les messages de la zone retourvalidation et de la zone avertissement.
function fctEnleverMessage() {
	var zone = document.getElementById('zone_retourvalidation');
	if ( zone && zone.firstChild) {
		zone.removeChild(zone.firstChild);
	}
	
	var zone = document.getElementById('zone_avertissement');
	if (zone && zone.firstChild) {
		zone.removeChild(zone.firstChild);
	}
}

// Affiche un message dans la zone avertissement
function fctAfficherAvertissement(pstrMessage, pstrTypeMessage) {
	fctEnleverMessage();
	objDiv				= document.getElementById('zone_avertissement');
	
	if (objDiv) {
		objP			= document.createElement('p');
		objP.className	= pstrTypeMessage;
		objP.appendChild(document.createTextNode(pstrMessage));
		objDiv.appendChild(objP);
	}
}

// Affiche un message dans la zone retourvalidation
function fctAfficherRetourValidation(pstrMessage, pstrTypeMessage) {
	fctEnleverMessage();
	objDiv				= document.getElementById('zone_retourvalidation');
	if (objDiv) {
		if (typeof(pstrMessage) == "string") {
			objP			= document.createElement('p');
			objP.className	= pstrTypeMessage;
			
			objP.appendChild(document.createTextNode(pstrMessage));
			objDiv.appendChild(objP);
		} else {
			objDiv.appendChild(pstrMessage);
		}
	}
}

// AFfiche un message dans la zone correspondante selon les porpriétés de pobjResultat.
function fctAfficherMessage (pobjResultat) {
	var zone = document.getElementById('zone_avertissement');
	var booZoneAvertissement = (zone !== null);
	if (pobjResultat.strMessage != "") {
		fctEnleverMessage();
		if (pobjResultat != null) {
			if (pobjResultat.booSucces) {
				fctAfficherRetourValidation (pobjResultat.strMessage, "succes");
			} else {
				if (pobjResultat.booException && booZoneAvertissement) {
					fctAfficherAvertissement (pobjResultat.strMessage, "erreur");
				} else {
					fctAfficherRetourValidation (pobjResultat.strMessage, "erreur");
				}
			}
		}
	}
}

// Fixe le chemin des images.
function fctSetCheminImages(strChemin) {
	cheminImagesCarnet=strChemin;
}

// Retrouve le parent d'un objet du DOM en fonction de la balise de son parent.
function fctGetParent(objElement, strParentTagName) {
	var strLowerParentTagName = strParentTagName.toLowerCase()
	if (! objElement)
		return null;
	else if (objElement.nodeType == 1 && objElement.parentNode.tagName.toLowerCase() == strLowerParentTagName)
		return objElement.parentNode;
	else
		return fctGetParent(objElement.parentNode, strParentTagName);
}

// Retourne un objet XMLHttpRequest permettant d'effectuer des requetes HTTP en javascript.
function fctGetXhr(){
	if(window.XMLHttpRequest) { // Firefox et autres
		xhr = new XMLHttpRequest();
	}
	else if(window.ActiveXObject){ // Internet Explorer 
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	else { // XMLHttpRequest non supporté par le navigateur 
		alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
		xhr = false; 
	}
	return xhr;
}

// Affiche le status des job dans la bar de status (Permet de debugger)
function fctAfficherStatus() {
	strMessage = "";
	for (i=0; i<tabCptStatus.length; i++) {
		strMessage += i + " : " + tabCptStatus[i] + (i!=tabCptStatus.length-1 ? '   /   ' : '');
	}
	window.status = strMessage;
}

// Affiche le status  occupé et increment d'une tache le job passé en paramètre.
function fctAfficherOccupe(pintNumJob) {
	if (isNaN(pintNumJob)) {
		pintNumJob = 0;
	}
	tabCptStatus[pintNumJob]++;
	//~ fctAfficherStatus ();
	if (document.getElementById('statusZone')) {
		document.getElementById('statusZone').style.visibility = 'visible';
	}
}

// Décrémente d'une tache le job concerné et cache le status si tous les jobs n'ont plus de tâches en instance.
function fctLibererOccupe(pintNumJob) {
	if (isNaN(pintNumJob)) {
		pintNumJob = 0;
	}
	tabCptStatus[pintNumJob]--;
	//~ fctAfficherStatus ();
	var intSomme = 0;
	for (intCpt in tabCptStatus) {
		if(typeof(tabCptStatus[intCpt]) == 'number'){
  		intSomme += tabCptStatus[intCpt];
		}
	}
	if (intSomme == 0 && document.getElementById('statusZone')) {
		document.getElementById('statusZone').style.visibility = 'hidden';
	}
	return (tabCptStatus[pintNumJob] == 0);
}

// Retourne le chemin pour accéder à www par http. 
function fctGetRacine() {
	var strURL = cheminWWW;
	return strURL;
}

// Fonction permettant d'ajouter un champs caché à un objet Formulaire pour être posté ou dans une cahine de type URI.
function fctAjouterChampsCache(pobjFormulaire, pstrNom, pstrValeur) {
	if (pobjFormulaire != null) {
		objContenu = document.createElement('input');
		objContenu.setAttribute('type','hidden');
		objContenu.setAttribute('name', pstrNom);
		objContenu.setAttribute('value',pstrValeur);
		pobjFormulaire.appendChild(objContenu);
	}
	return pstrNom + "=" + pstrValeur + "&";
}

// Traite le retour d'une requête ajax.
function fctTraitementRequete (pxhr, pintNumJob, pfctTraitementReussi, pfctTraitementEchoue, pfctFinTraitement) {
	var booSucces = false;
	// L'état 4 siginifie que la reqête est terminée. On peut donc traiter son retour.
	if(pxhr.readyState == 4 && pxhr.status == 200){
		//alert(pxhr.responseText);
		var booPlusDeTraitement = fctLibererOccupe(pintNumJob);
		try {
			// Le retour d'une requete contient du code javascript, alors on l'éxécute. il va créer un objet objResultat
			//alert(pxhr.responseText);
			eval(pxhr.responseText);
			// indiquant si le traitement de la requête à reussi
			booSucces = objResultat.booSucces;
			if (objResultat.booSucces) {
				if (pfctTraitementReussi) {
					pfctTraitementReussi(booPlusDeTraitement,objResultat);
				}
			} else {
				if (pfctTraitementEchoue) {
					pfctTraitementEchoue(booPlusDeTraitement,objResultat);
				}
			}
			// et le cas échéant si c'est a cause d'une exception.
			fctAfficherMessage (objResultat);
		}
		catch (e) {
			if (e.stack == null)
				e.stack = pxhr.responseText;
			fctLogErreur (e);
			// le code javascript peut aussi contenir des erreurs (de syntaxe par exmple)
			fctAfficherAvertissement("Erreur lors de l'éxecution de la requête : " + e.message, "erreur");
			if (pfctTraitementEchoue) {
				pfctTraitementEchoue(booPlusDeTraitement,objResultat);
			}
		}
	
		if (pfctFinTraitement) {
			pfctFinTraitement ();
		}
	} else if (pxhr.readystate == 4 && pxhr.status != 200) {
		fctAfficherAvertissement('Impossible d\'effectuer la requête demandée.',"erreur");
		booPlusDeTraitement = fctLibererOccupe(pintNumJob);
		if (pfctTraitementEchoue) {
			pfctTraitementEchoue(booPlusDeTraitement,objResultat);
		}
	
		if (pfctFinTraitement) {
			pfctFinTraitement ();
		}
	}
	return booSucces;
}

// Exécute une requete HTTP et execute les fonction pfctTraitementReussi en cas de succes, pfctTraitementEchoue en cas d'echec et pfctFinTraitement en fin de traitement.
// pbooSynchrone permet de faire une requete synchrone => pb d'affichage lors d'une requete synchrone.
function fctRequeteAjax (pstrURL, pstrParams, pintNumJob, pfctTraitementReussi, pfctTraitementEchoue, pfctFinTraitement, pbooSynchrone) {
	if (pintNumJob == null) {
		pintNumJob = 5;
	}
	
	if (pbooSynchrone == null) {
		pbooSynchrone = false;
	}
	
	fctEnleverMessage();
	fctAfficherOccupe(pintNumJob);
	
	var xhr = fctGetXhr();
	if (xhr !== false) {
		if (!pbooSynchrone) {
			xhr.onreadystatechange = function () {
				fctTraitementRequete(xhr, pintNumJob, pfctTraitementReussi, pfctTraitementEchoue,pfctFinTraitement);
			}
		}
		
		xhr.open("POST",pstrURL,!pbooSynchrone);
		xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		xhr.send(pstrParams);
		
		if (pbooSynchrone) {
			return fctTraitementRequete(xhr, pintNumJob, pfctTraitementReussi, pfctTraitementEchoue,pfctFinTraitement);
		}
	} else {
		fctAfficherAvertissement('Impossible de se connecter au serveur.',"erreur");
	}
}

// une fonction pour ne rien faire : très utile.
function fctRien(){}

// Arrondi à 2 décimale.
function fctCertify(somme) 
{ 

testleftm = parseInt(somme);
testright = somme - testleftm;
fixright = (Math.round(testright*100))/100;
if (fixright)
	{ 
	  if (fixright*100 % 10)
		{ 
		  return ( eval(testleftm)+eval(fixright) ); 
		} 
	  else
		{ 
		  return (eval(testleftm)+eval(fixright) ); 
		} 
	} 
  else
	{ 
	return (eval(testleftm)+eval(fixright) + '.00'); 
	} 
}

// Ferme la fenêtre popup s'il y en a une d'ouverte.
function fctFermerFenetre() {
	if (wnd != false) {
		wnd.close();
	}
}

// Envoi l'erreur javascript au serveur pour l'ajouter au fichier de log.
function fctLogErreur (pobjErreur) {
	// Numéro de requete
	strParams = fctAjouterChampsCache(null, "intNumRequete", 1001);
	
	// Message de l'erreur.
	strParams += fctAjouterChampsCache(null, "strMsgErr", pobjErreur.message);
	
	// Numéro de ligne.
	strParams += fctAjouterChampsCache(null, "intNumLigne", pobjErreur.lineNumber);
	
	// Fichier Source de l'erreur
	strParams += fctAjouterChampsCache(null, "strFilename", pobjErreur.fileName);
	
	// Stack.
	strParams += fctAjouterChampsCache(null, "strStack", pobjErreur.stack);
	
	// Envoi de la requete.
	fctRequeteAjax(fctGetRacine()+'chargerTable.php',strParams)
}

