
/*************
* NOYAU AJAX *
*************/

var liste_requetes = Array();
var ajax_busy = false;

//Crée un objet XmlHttpRequest
function createXmlHttpRequest()	{
	try { return new XMLHttpRequest(); }					catch (e) {}
	try { return new ActiveXObject("Msxml2.XMLHTTP"); }		catch (e) {}
	try { return new ActiveXObject("Microsoft.XMLHTTP"); }	catch (e) {}
	alert("XMLHttpRequest not supported");
	return null;
}


//TODO: Remplacer les appels à envoyerRequete par ajaxRequete
function envoyerRequete (dest_div, ajax_function, params, return_function, return_params) {
	ajaxRequete(dest_div, ajax_function, params, return_function, return_params);
}


//Fonction pour enregistrer les détails d'une requête AJAX
function ajaxRequeteDetails(dest_div, return_function, return_params, priorite) {
	if (!priorite)	priorite = false;

	this.dest_div			= dest_div;
	this.return_function	= return_function;
	this.return_params		= return_params;
	this.priorite			= priorite;
	this.xhr				= createXmlHttpRequest();
}


//Prépare et envoie une requête AJAX
function ajaxRequete(dest_div, ajax_function, params, return_function, return_params, priorite) {
	var requete = new ajaxRequeteDetails(dest_div, return_function, return_params, priorite);
	
	//Quoi faire lors d'une réponse...
	requete.xhr.onreadystatechange = function() { ajaxTraiterReponse(requete) };
	
	query = "ajax_function=" + ajax_function;
	if (params)
		query += "&" + params;
	
	//TODO: encodeURIComponent() sur chaque paramètre au besoin
	requete.params = query;

	//Ajoute la requête à la file d'attente
	ajaxFileAjout(requete);
}


//Ajoute une nouvelle requête à la file d'attente
function ajaxFileAjout(requete) {
	
	//Si la requête est prioritaire, la mettre au début de la liste
	if (requete.priorite)
		liste_requetes.unshift(requete);
	else
		liste_requetes.push(requete);

	//Vérifie si la requêtre peut être traitée dès maintenant
	ajaxFileEnvoi();
}


//Lance une nouvelle requête AJAX
function ajaxFileEnvoi() {
	if (ajax_busy == false && liste_requetes.length > 0) {
		ajax_busy = true;
		requete = liste_requetes.shift();

		url = "ajax.php";					//paramètres GET
		requete.xhr.open ("POST", url);		//GET ou POST
		requete.xhr.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
		requete.xhr.send (requete.params);	//paramètres POST
	}
}


//Fonction appelée lors d'une modification d'état
function ajaxTraiterReponse(requete) {
	//Détection d'une fin de transmission
	if (requete.xhr.readyState == 4) {
		//Détection d'une réponse valide
		if (requete.xhr.status == 200) {
			//Affichage des données reçues
			dest_div_elem = document.getElementById(requete.dest_div);
			if (dest_div_elem)
				setInnerHTML(document.getElementById(requete.dest_div), requete.xhr.responseText);
			//Exécution d'une fonction au retour si demandé
			if (requete.return_function) {
				if (requete.return_params && requete.return_params != '')
					eval(requete.return_function(requete.return_params));
				else
					eval(requete.return_function + "(" + requete.return_params + ")");
				//requete.return_function = '';
				//requete.return_params = '';
			}
		} else {
			//En cas d'échec, afficher une erreur
			document.getElementById(requete.dest_div).innerHTML = "La requête HTTP a retourné " + requete.xhr.statusText + "(" + requete.xhr.status + ")";
		}
		//Passe à la prochaine requête en attente
		ajax_busy = false;
		ajaxFileEnvoi();
	}
}


//Set the inner content of a DIV
//(Useful to execute Javascript during an AJAX call)
function setInnerHTML (divContent, HTML) {
	divContent.innerHTML = HTML; 
	var All = divContent.getElementsByTagName("*");
	for (var i = 0; i < All.length; i++) {
		All[i].id		= All[i].getAttribute("id");
		All[i].name		= All[i].getAttribute("name");
		var elementClass = All[i].getAttribute("class");
		if (elementClass == null) {
			elementClass = All[i].getAttribute("className");
		}
		All[i].className = elementClass;
	}
	var AllScripts = divContent.getElementsByTagName("script")
	for (var i = 0; i < AllScripts.length; i++) {
		var s = AllScripts[i];
		if (s.src && s.src != "") {
			// Précédement asynchrone, mis en synchrone pour éviter des problèmes de dépendances de scripts
			eval(getFileContent(s.src))
		} else {
			eval(s.innerHTML)
		}
	}
}

/*
//OLD structure - to be deleted
var this_dest_div;
var this_return_function;
var this_return_params;


//Initialisation de la requête
xhr = createXmlHttpRequest();

//Prpare et envoie une requête AJAX
function envoyerRequete (dest_div, ajax_function, params, return_function, return_params) {
	this_dest_div = dest_div;
	if (return_function)	this_return_function = return_function;
	if (return_params)		this_return_params = return_params;
	
	//Si une requête est en cours, l'annuler
	xhr.abort();

	//Quoi faire lors d'une réponse...
	xhr.onreadystatechange = traiterReponse;
	
	query = "ajax_function=" + ajax_function;
	if (params)
		query += "&" + params;
	
	xhr.open ("POST", url);
	xhr.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded');
	xhr.send (query);
}


//Fonction appele lors d'une modification d'tat
function traiterReponse() {
	//Détection d'une fin de transmission
	if (xhr.readyState == 4) {
		//alert(ajax_function);
		//Détection d'une réponse valide
		if (xhr.status == 200) {
			//Affichage des donnes reçues
			document.getElementById(this_dest_div).innerHTML = xhr.responseText;
			//Exécution d'une fonction au retour si demandé
			if (this_return_function) {
				this_return_function(this_return_params);
				this_return_function = '';
				this_return_params = '';
			}
		} else {
			//En cas d'échec, afficher une erreur
			document.getElementById(this_dest_div).innerHTML = "La requête HTTP a retourné " + xhr.statusText + "(" + xhr.status + ")";
		}
	}
}
*/


/*****************
* MISC FUNCTIONS *
*****************/

function startDisplayLoading(div) {
	if (document.getElementById(div))
		document.getElementById(div).innerHTML = '<img src="images/loading.gif" alt="Loading" />';
}

function stopDisplayLoading(div) {
	if (document.getElementById(div))
		document.getElementById(div).innerHTML = '';
}
