

/**
 * Closure oo0 !_! 0oo
 */
(function() {
	var window = this;

	/**
	 * 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)
	 *
	 * window.MyRequest = function(type, async, method, url) {
	 *
	 *   this.request = new window.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) {
	 *     window.alert(reponse); // aucun parsing ici, juste pour demo
	 *   }
	 * }
	 *
	 * var myRequest = new window.MyRequest("text", true, "GET", "test.txt");
	 * myRequest.execute();
	 *
	 * @param {!string} url URL de la requete à lancer.
	 */
	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 window.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 (e2) {
						//FIXME message ?
					}
				}
			}
		}

		/**
		 * 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;
		};
	}

	window.XHRequest = XHRequest;
}());

