/*
 * XHRequest : 
 * 
 * Cette classe est une enveloppe et une interface pour l'objet XMLHttpRequest 
 * et ses différentes implémentations dans les navigateurs modernes
 * 
 * Navigateurs supportés : 
 * 
 * Internet Explorer on Windows, Safari on Mac OS-X, Mozilla on all platforms, 
 * Konqueror in KDE, IceBrowser on Java, and Opera on all platforms including Symbian
 * 
 * Il s'agit d'une interface, c'est à dire que cet objet ne peut pas être utilisé seul et tel quel.
 * 
 * Pour utiliser cette interface, il faut créer un autre objet qui aura deux propriétés :
 * 
 * 1) il contiendra une instance d'XHRequest
 * 2) il implémentera une méthode nommée parse(reponse) qui sera chargée de l'analyse de la réponse reçue.
 * 
 * La seconde condition est nécessaire parce que l'analyse de la réponse reçue dépend entièrement 
 * de ce qui est attendu. Elle ne peut pas être confié à l'objet XHRequest, mais doit être confié
 * à un objet de plus haut niveau qui sait ce qui est attendu.
 * 
 * L'objet XHRequest se charge simplement des opérations de bas niveau :
 * 
 * - création de l'objet XMLHttpRequest (qui est dépendante des navigateurs)
 * - contrôle et initialisation des paramètres de la requête
 * - lancement de la requête
 * - gestion des différents états de la requête à travers la méthode getContent()
 * - appel de la méthode parse de l'objet appelant en fin de réception.
 *  
 * Paramètres de construction : 
 * 
 * - type   : type de réponse attendue par XMLHttpRequest ("text" ou "xml")
 * - async  : requête synchrone (async == false) ou asynchrone (async == true)
 * - method : méthode de requête (GET, POST, HEAD...)
 * - url    : url de la ressource demandée par la requête
 * - caller : objet surchargeant l'objet XHRequest (DOIT DISPOSER D'UNE METHODE DE RAPPEL nommée parse(reponse))
 * 
 * Utilisation de l'objet : 
 * 
 * Cet objet ne pouvant être utilisé seul. voici un exemple d'objet qui surcharge la méthode parse(reponse)
 * 
 * MyRequest = function(type, async, method, url) {
 * 
 *   this.request = new XHRequest(type, async, method, url, this); // objet XHRequest
 *   this.method = method; // méthode de requête (GET, POST, HEAD...)
 *   this.url = url;       // url de requête
 *   
 *   // cette méthode sera automatiquement appelée en fin de réception
 *   this.parse = function(reponse) {
 *     alert(reponse); // aucun parsing ici, juste pour demo
 *   }
 * }
 * 
 * var myRequest = new MyRequest("text", true, "GET", "test.txt");
 * myRequest.execute();
 * 
 */
function XHRequest(url) {
	this.xhr    = null;   // l'objet XmlHttpRequest
	this.etat   = false;  // texte d'état en cours de communication, peut servir à afficher un message dynamique
	this.url = url;
	
	/**
	 * Construction de l'objet XMLHttpRequest en fonction des navigateurs
	 */
	
	// Tout ce qui est entre commentaires javascript est pour ie
	// source : http://www.jibbering.com/2002/4/httprequest.html
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
	// JScript gives us Conditional compilation, we can cope with old IE versions.
	// and security blocked creation of the objects.
	try {
		this.xhr = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (e) {
		try {
			this.xhr = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (E) {}
	}
	@end @*/
	
	// Mozilla, Safari, Konqueror, Opera
	if (this.xhr == null) {
		try {
			this.xhr = new XMLHttpRequest();
		} catch (e) {
			// Ice browser (le browser en swing payant)
			// Attention ce navigateur ne supporte pas encore les réponses de type xml
			// http://support.icesoft.com/jive/entry.jspa?entryID=471&categoryID=21
			if (!this.xhr && window.createRequest) {
				try {
					this.xhr = window.createRequest();
				} catch (e) {}
			}
		}
	}

	/**
	 * Méthode pour l'éxecution d'une requête à l'aide de la méthode GET sur l'url donnée.
	 * 
	 * @return true si la requête a pu être démarrée, sinon false
	 */
	this.get=function(){
		if (this.xhr) {
			this.xhr.open("GET", this.url, true); // ouvrir la communication en GET pour l'url donnée (en mode asynchrone)
			this.xhr.send(""); // envoi de la requête, sans paramètre
			return true;
		}
		return false;
	}

	/**
	 * Méthode pour l'éxecution d'une requête à l'aide de la méthode POST sur l'url donnée.
	 * 
	 * @param _data : données à ajouter en paramètre à la requête (chaine de caractères)
	 * @return true si la requête a pu être démarrée, sinon false
	 */
	this.post=function(_data){
		if (this.xhr) {
			this.xhr.open("POST", this.url, true); // ouvrir la communication en POST pour l'url donnée (en mode asynchrone)
			this.xhr.send(_data); // envoi de la requête, avec paramètres
			return true;
		}
		return false;
	}

	/**
	 * Méthode pour l'éxecution d'une requête à l'aide de la méthode GET sur l'url cible
	 * @deprecated FIXME utiliser #get() ou #post()
	 */
	this.execute = function() {
		if (this.xhr) {
			this.xhr.open("GET", this.url, true);  // ouvrir la communication pour l'url cible en mode asynchrone
			this.xhr.send(""); // envoi de la requête
			return true;
		}
		return false;
	}
}	
