//_____________________________________________________________________________
//
//  XML_HTTP_REQUEST
//_____________________________________________________________________________

// Fonction exécutée à l'état 1 - pour exemple
// Affiche l'état de la connexion dans un bloc div
function fpj_init() {
	document.getElementById('blcSpy').innerHTML = '<p>Connexion en état 1</p>';
}

// Fonction exécutée à l'état 2 - pour exemple
// Affiche l'état de la connexion dans un bloc div
function fpj_contact() {
	document.getElementById('blcSpy').innerHTML += '<p>Connexion en état 2</p>';
}

// Fonction exécutée à l'état 3 - pour exemple
// Affiche l'état de la connexion dans un bloc div
function fpj_encours() {
	document.getElementById('blcSpy').innerHTML += '<p>Connexion en état 3</p>';
}

// Fonction exécutée en cas d'erreur
function fpj_erreur(ErrNum, ErrTexte) {
	alert('Erreur dans la connexion au serveur Web\n' + ErrNum + ' : ' + ErrTexte);
}


// OBJET Client HTTP
function fp_oClientHTTP() {
	this.XmlHttp = null;	// Objet XMLHTTPRequest
	if (window.XMLHttpRequest) {
		this.XmlHttp = new XMLHttpRequest();
	} else if (window.ActiveXObject) {
		var msxmls = new Array('Msxml2.XMLHTTP.5.0', 
								'Msxml2.XMLHTTP.4.0', 
								'Msxml2.XMLHTTP.3.0',
								'Msxml2.XMLHTTP',
								'Microsoft.XMLHTTP');
		
		for (var i = 0; i < msxmls.length; i++) {
			try {
				this.XmlHttp = new ActiveXObject(msxmls[i]);
			} catch (e) {
				this.XmlHttp = null;
			}
		}
    }
	if (this.XmlHttp == null) {
		throw("Pas d'objet XMLHttpRequest supporté par le navigateur.");
	}
	
	this.RequeteEnCours = false;
	this.ErreurFct = null;	// Fonction à exécuter en cas d'erreur
	// Fonctions mappées aux changements d'état de la connexion.
	// Il semble que seuls les états 1 et 4 soient toujours gérés par tous les navigateurs
	this.InitFct = null;	// Fonction à exécuter à l'initialisation de la liaison - etat 1
	this.ContactFct = null;	// Fonction à éxécuter quand le serveur est contacté - etat 2
	this.EnCoursFct = null;	// Fonction à exécuter au cours de la lisaison - etat 3
	this.FiniFct = null;	// Fonction à exécuter quand la liaison est terminée - etat 4
	
	return this;
}


fp_oClientHTTP.prototype.GET = function (sUrl, bAsynchrone) {
	if (this.RequeteEnCours) throw "En cours ...";
	this.XmlHttp.open('GET', sUrl, bAsynchrone);
	// Bidouille pour fonction closure
	var Lui = this;
	this.XmlHttp.onreadystatechange = function() {
		Lui.Change(Lui);
	}
	this.XmlHttp.send(null);
}

fp_oClientHTTP.prototype.POST = function (sUrl, sContenu, bAsynchrone) {
	if (this.RequeteEnCours) throw "En cours ...";
	this.XmlHttp.open('POST', sUrl, bAsynchrone);
	// Bidouille pour fonction closure
	var Lui = this;
	this.XmlHttp.onreadystatechange = function() {
		Lui.Change(Lui);
	}
	this.XmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");	
	this.XmlHttp.send(sContenu);
}


fp_oClientHTTP.prototype.Change = function (Client) {
	switch (Client.XmlHttp.readyState) {
	case 1:	// Requête pas commencée
		try {	// Appel de la fonction liée pour le traitement dans la page
			Client.InitFct();
		} catch (e) {
			// Pas de gestion d'erreur définie
			// Permet de gérer si il n'y a pas de fonction mappée à l'état
		}
		break;
		
	case 2:  // Contact établi avec le serveur
		try {	// Appel de la fonction liée pour le traitement dans la page
			if (Client.XmlHttp.status == 200) {
				Client.ContactFct();
			} else {
				Client.abort();
				Client.RequeteEnCours = false;
			}
		} catch (e) {
			// Pas de gestion d'erreur définie
			// Permet de gérer si il n'y a pas de fonction mappée à l'état
		}
		break;
		
	case 3:  // Appel multiple pendant le téléchargement
		try {	// Appel de la fonction liée pour le traitement dans la page
			if (Client.XmlHttp.status == 200) Client.EnCoursFct();
		} catch (e) {
			// Pas de gestion d'erreur définie
			// Permet de gérer si il n'y a pas de fonction mappée à l'état
		}
		break;

	case 4:  // Traitement terminé sur le serveur
		try {	// Appel de la fonction liée pour le traitement dans la page
			if (Client.XmlHttp.status == 200) Client.FiniFct(Client.XmlHttp.responseText);
			else Client.ErreurFct(Client.XmlHttp.status, Client.XmlHttp.statusText);
		} catch (e) {
			// Pas de gestion d'erreur définie
		} finally {
			Client.RequeteEnCours = false;
		}
		break;
	}
}