//================================================================
// Client-server communication (AJAX) using only an .js and
// some javascript.
// Feel free to use and modify this code as you want.
// Communication client-serveur (AJAX) utilisant
// uniquement du javascript et un .js .
// Utilisez ou modifiez le script comme bon vous plaira!
// Julien Lamarre, ogregras@gmail.com
// Last update: 2005/10/03
//================================================================
// Modifié par R. Burton - CIRCA - 	circa.asbl sur gmail.com
//================================
// Variables
//================================
// la méthode qui sera utilisée pour communiquer avec le serveur, dépendamment des capacités
// du navigateur.
var m_loadMethod = "" ;
// le handle de la boucle principale, qui demande la réponse au serveur
var m_loopAnswerHandle ;
// le nom de la méthode à exécuter sur le serveur
var m_method ;
// les paramètres pour cette méthode
var m_parameters ;
// l'id de la requête effectuée
var m_requestId ;
// le nombre de millisecondes entre deux tours de boucle principale
var m_intervalLoop = 100 ; //100
// le nombre de tentatives max
var m_nbrTentativesMax = 100 ; //100
// le nombre de fois qu'on a bouclé
var m_nbrTentativesFaites = 0 ;
// chemin et nom du fichier php qui renvoie le .js
var jsphp = "circa_ajaxdirect.php3?" ;
// Méthode pour valider quelle technique sera utilisée pour communiquer
// avec le serveur.
function testJSAJAXCompatibility(){
	if(!document.getElementById){return ;}
	// on désactive les boutons de requête pour éviter deux requêtes simultanées
	disableBtn();		
	// test la méthode direct (#1)
	loadDirect(jsphp+"method=testcompatibility&id=1") ;
	// test la méthode avec innerHTML (#2)
	loadCreateInnerHTML(jsphp+"method=testcompatibility&id=2")
	// test la méthode avec createElement (#3)
	loadCreateEl(jsphp+"method=testcompatibility&id=3") ;
	m_loopAnswerHandle = setInterval("validationLoop()", m_intervalLoop) ;
}
// Boucle pour la validation.
// On va utiliser la première des méthodes que l'on trouvera fonctionnelle.
function validationLoop(){
	if(typeof(_1) != "undefined" || typeof(_2) != "undefined" || typeof(_3) != "undefined"){
		clearInterval(m_loopAnswerHandle) ;
		// réactivation des boutons
		enableBtn();
		// prend la méthode "direct" en premier si fonctionnelle
		if(typeof(_1) != "undefined"){m_loadMethod = "loadDirect" ;}
		else if(typeof(_3) != "undefined"){m_loadMethod = "loadCreateEl" ;}
		else{m_loadMethod = "loadCreateInnerHTML" ;}
		recupdiv();
	}
	else if(m_nbrTentativesFaites < m_nbrTentativesMax){
		m_nbrTentativesFaites++ ;
		// prochain tour de boucle
		return ;
	}
	// Le navigateur semble ne supporter aucune des trois technique ou le test
	// avec le serveur s'est mal déroulé.
	else {
		clearInterval(m_loopAnswerHandle) ;
		alert("Le navigateur ne semble pas supporter ces techniques ou alors la connexion au serveur pour les tests s'est mal déroulée.") ;
	}
}
//================================
// Démarre le processus pour aller chercher la réponse du serveur
//================================
function lanceRequete(){
	m_answer = "" ;
	m_nbrTentativesFaites = 0 ;
	date = new Date() ;
	m_requestId = date.getTime() ;
	// désactive les boutons 
	disableBtn();
	// appel au serveur, on lui indique quelle méthode effectuer
	loadjs(jsphp+"method=" + m_method + "&id=" + m_requestId + m_parameters) ;
	// lance la boucle qui ira chercher la réponse
	m_loopAnswerHandle = setInterval("loopAnswer()", m_intervalLoop) ;
}
//================================
// Boucle principale pour aller chercher la réponse
//================================
function loopAnswer(){
	// .js pas encore loadé, on doit attendre
	typeofResponse = eval('typeof(_' + m_requestId + ')') ;
	if(typeofResponse == "undefined" && m_nbrTentativesFaites < m_nbrTentativesMax){
		m_nbrTentativesFaites++ ;
		// prochain tour de boucle
		return ;
	}
	// pas réussi à laoder la réponse dans les délais
	else if(typeofResponse == "undefined"){
		m_answer = "Réponse non recue. Peut-être m_nbrTentativesMax devrait être augmenté. Essayez à nouveau." ;
	}
	else{
		// m_answer est déjà setté correctement par le .js!
	}
	clearInterval(m_loopAnswerHandle) ;
	// Affiche la réponse à la bonne place voir example      
	affiche();
	// réactive les boutons
	enableBtn();
}
// controleur pour appeler la bonne méthode pour communiquer avec le serveur
function loadjs(jssrc){
	if(m_loadMethod == ""){return ;}
	eval(m_loadMethod + "('" + jssrc + "') ;") ; 
}
// Méthode qui change directement le "src" d'un .js déjà existant.
// Ne fonctionne pas avec Firefox.
function loadDirect(jssrc){
	js = document.getElementById("jsajax") ;
	js.src = jssrc ;
}
// Méthode qui utilise innerHTML pour créer un nouveau .js
// Ne fonctionne pas avec IE.
function loadCreateInnerHTML(jssrc){
	div = document.getElementById("divajax") ;
	div.innerHTML = '<scr' + 'ipt type="text/javascript" id="jsajax2"></sc' + 'ript>' ;
	js = document.getElementById("jsajax2") ;
	// IE ne trouve pas "js" ici!!
	if(js){js.src = jssrc ;}
}
// Méthode qui utilise createElement() pour créer un nouveau .js
// Ne fonctionne pas avec Opera.
function loadCreateEl(jssrc){
	divj = document.getElementById('divajax2');
	var newEl = document.createElement('script');
	//textEl.setAttribute("type","text/javascript");
	//textEl.setAttribute("id","jsajax2");
	newEl.setAttribute("src", jssrc);
	divj.appendChild(newEl);
}
//================================
//Fonction d'appel aux services Web:
//================================
function services(appelmethode){
// fonction appelée par un lien ou un bouton dans l'article qui demande l'appel à un service web made in ajax sans ajax !
// attention de bien veiller à ce que tous les paramètres nécessaire au service
// soit bien disponible dans la page !...
	loadjs(DOSSIER_SQUELETTE+"/js/circa_ajax_"+appelmethode+".js");
}
