// Librairie MyAJAX customisée SNCM
// NICOLAS TAMBON
//  http://RetD.sgdfmarseille.fr/myWeb2LibsDev/myWeb2Libs/
// Révisions:
// 1.0: première release
// 1.1: ajout gestion FIFO de connexions
// 1.2: gestion de l'erreur 404
// 1.3: gestion du JS dans les fragments
//
// classe singleton statique
// NE PAS INSTANCIER
// cette classe permet de ne pas multiplier les objets ajax
// [voir la documentation.txt à l'adresse http://RetD.sgdfmarseille.fr/myWeb2LibsDev/myWeb2Libs/documentation.txt ]
//

var MyAjax = function () {
	// l'objet de communication
	var _http_request;
	// FIFO de connexion : dans le cas d'ajax asynchrone, les demandes en parralleles peuvent poser pb (écrasement d'une réponse par une autre demande)
	var _fifo = new Array();
	// seuil limite de connexion en attente. SI trop grand, ce n'est pas normal
	var _fifoMax = 5;
	// debug de controle
	var _debug = false;
	// astuce du this & that
	var _that = {
		// PUBLIC: fonction permettant de faire la demande d'une page
		makeRequest : function (url,typeReponse,handler,isAsynchrone) {
			 if (document.getElementById('capAjxLoadingImg'))
				document.getElementById('capAjxLoadingImg').style.display = "block";
			else if (_debug)
				alert("MyAjax - capAjxLoadingImg inexistante");
			 // protection anti blocage: si le nombre de connexions en file d'attende est trop important, ce n'est pas normal
			 if (_fifo.length > _fifoMax) {
				// on fait sauter la requete la plus vieille pour laisser place aux autres...
				_fifo.pop();
				if (_fifo.length>0) {
					send();
				}
			 }
			 // enregistrement de la demande dans le fifo des connexions
			 _fifo.unshift({url:url,typeReponse:typeReponse,handler:handler,isAsynchrone:isAsynchrone});
			 //log("makeRequest - fifo="+_fifo);
			 // Si la demande faite est la seule en cours, on peut la traiter.
			 if (_fifo.length==1) {
				send();
			 }
			 // sinon elle est simplement conservée dans le fifo des connexions pour être traité lorsque les requetes précédentes
			 // aient elles-même été traitées (putain comme c'est astucieux! Nico t'es grave au top!)	 
		},
		setFifoMax : function (max) {
			_fifoMax = max;
		},
		enableDebugMode : function () {
			_debug = true;
		},
		disableDebugMode : function () {
			_debug = false;
		},	
		INNER_DIV : "inner.div",
		JS_EVAL   : "js.evaluated",
		XML       : "xml"
	}
	
	// PRIVATE:  gère un envoi
	function send() {	
		 var objToSend = _fifo[_fifo.length-1];
		 var url = objToSend.url;
		 var typeReponse = objToSend.typeReponse;
		 var handler = objToSend.handler;
		 var isAsynchrone = objToSend.isAsynchrone;
		 //log("send - url="+url);
		 // il faut forcer une url aléatoire pour que le cache d'IE se recharge...pffff
		 /*
		 if (url.indexOf("?")=='-1') {
				url=url+'?aleat='+new Date().valueOf();
		 }
		 else {
			url=url+'&aleat='+new Date().valueOf();
		 }
		 */
	   if (window.XMLHttpRequest) { // Mozilla, Safari,...
		  _http_request = new XMLHttpRequest();
		  if (_http_request.overrideMimeType) {
			if (typeReponse == _that.XML)
				_http_request.overrideMimeType('text/xml');
			else
				_http_request.overrideMimeType('text/plain');
		  }
	   } else if (window.ActiveXObject) { // IE
		  try {
			   _http_request = new ActiveXObject("Msxml2.XMLHTTP");
		  } catch (e) {
				   alert('MyAjax: erreur 1 : '+e);
			   try {
					_http_request = new ActiveXObject("Microsoft.XMLHTTP");
			   } catch (e) {alert('erreur 2 : '+e);}
			}
		 }
		 if (!_http_request) {
			  alert('MyAjax: Abandon - Impossible de créer une instance XMLHTTP');
			  return false;
		 }
		 if (isAsynchrone == null || isAsynchrone == true) { // mode asynchrone
			 _http_request.onreadystatechange = function() { _traiteReponseAsynchrone(_http_request,typeReponse,handler,url); };
			 _http_request.open('GET', url, true);
			 //_http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=tis-620"); // à vérifier
			 _http_request.send(null);
		}
		else { // mode synchrone
			_http_request.open('GET', url, false);
			alert("Mode asynchrone non pris en charge\n"+_http_request.responseText);
		}
	}
	
	// PRIVATE: traite la réponse d'une requete
	function _traiteReponseAsynchrone(reponse,typeReponse,handler,url) {
	   if (_http_request.readyState == 4) {
	      /*page d'erreur gérée dans le CMS if (_http_request.status == 404) {
				alert("MyAjax: URL incorrecte:\n"+url);
				// effacement de l'url inexistante
				_fifo.pop();
		  }*/
	      if (_http_request.status == 200 || 404 /* page d'erreur gérée dans le CMS*/) {
				//log("traiteReponse - handler="+handler);
	    		// _debug
				if (_debug && typeReponse != _that.XML)
					alert("MyAjax: typeReponse: "+typeReponse+"\ncible: "+handler+"\n"+reponse.responseText);
				if (typeReponse == _that.JS_EVAL)
					eval(_http_request.responseText);
				if (typeReponse == _that.INNER_DIV) {
					if (handler==null)
						alert("MyAjax: Erreur: handler non définie. Vous devez définir un container.");
					else {
						// remplissage du fragment
						document.getElementById(handler).innerHTML = reponse.responseText;
						// récupération des définitions JS pour pouvoir les exécuter (en les déclarant dans le contexte global)
						var allScripts = document.getElementById(handler).getElementsByTagName('script');
						for(var i=0; i<allScripts.length; i++){
							if (allScripts[i].id != "autoRedirect4HumansScript") {
								var newScript = document.createElement("script");
								newScript.text = allScripts[i].text;
								document.body.appendChild(newScript);
								//eval(newScript);
							}
					    }			
					}
				}
				if (typeReponse == _that.XML) {				
					if (typeof(MyXML) != "undefined") { // nécessite la librairie myXML.js
						var myXML = new MyXML(reponse.responseXML);
						if (_debug)
							alert("typeReponse: "+typeReponse+"\ncible: "+handler+"\n"+myXML.toString());
						if (typeof(handler) != "undefined")
							handler(myXML);
						else
							alert("MyAjax: Erreur: handler non définie.\nVous devez définir une fonction de callback dans votre document.");
					}
					else
						alert("MyAjax: L'utilisation de la librairie myXML est obligatoire");
				}
				//log("traiteReponse - fin");
				//log("traiteReponse - fifo avant pop="+_fifo);
				_fifo.pop();
				//log("traiteReponse - fifo apres pop="+_fifo);
				if (_fifo.length>0) {
					send();
				}
			}
	   }
	   if (document.getElementById('capAjxLoadingImg') && _fifo.length == 0)
			document.getElementById('capAjxLoadingImg').style.display = "none";
		else if (_debug)
			alert("MyAjax - capAjxLoadingImg inexistante");
	}
	
	return _that;
}();


