/**
 * La classe AjaxHandler sert à effectuer les appels asynchrones (Ajax) vers le serveur.
 * Les appels suivants sont gérés :
 *  - récupération d'un circuit
 *  - soumission d'un résultat de course (temps + télémétrie)
 */
 
/**
 * Crée un AjaxHandler et initialise l'objet XMLHTTPRequest qui
 * sera utilisé pour les appels
 */
function AjaxHandler() 
{
	this.xhr = null;
	if(window.XMLHttpRequest) {
		this.xhr = new XMLHttpRequest();
	}
	else if(window.ActiveXOject)
	{
		try {
			this.xhr = new ActiveXObject("Msxml2.XMLHTTP");
		}    
		catch(e) {
			try {
				this.xhr = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e1) {
			}
		}
	}
	if (this.xhr) {
		this.xhr.handler = this;
		
		this.xhr.onreadystatechange = function() 
		{
			this.handler.updateProgress(this.readyState);
			if (this.readyState == 4) {
				this.handler.success = (this.status == 200 || this.status == 0);
				this.handler.failure = (this.status != 200 && this.status != 0);
				this.handler.errorMessage = this.statusText;
				this.handler.response = this.responseText;
				
				this.handler.context.ajaxCallCompleted();
			}
		}
	}
}

AjaxHandler.prototype = {

	/**
	 * Remet à zéro les variables d'état et définit la callback
	 * Préalablement à la préparation et à l'envoi d'une requête
	 * L'objet context doit présenter les méthodes suivantes :
	 *  - updateAjaxProgress(val : [0,100]) -> mise à jour sur changement d'état Ajax
	 *  - ajaxCallCompleted() -> appel terminé sur réussite ou échec
	 */
	initialize : function(context)
	{
		this.success = false;
		this.failure = false;
		this.context = context;
		this.context.updateAjaxProgress(0);
	},
	

	/**
	 * Envoie une requête Ajax pour demander la description d'un circuit
	 */
	retrieveRoad : function(mode, level, car, ghostId, context) {
		this.initialize(context);
		var params = "level="+level+"&mode="+mode+"&car="+car;
		if (ghostId != '') {
			params += "&ghost="+ghostId;
		}
		this.xhr.open('POST', 'http://renaissanceracer.com/demojs/ajax/circuit.php', true);
		this.xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		this.xhr.setRequestHeader('Content-length', params.length);
		this.xhr.setRequestHeader('Connection', 'close');
		this.xhr.send(params);
	},

	/**
	 * Envoie une requête Ajax pour soumettre un temps de course
	 */	
	submitRaceTime : function(mode, level, car, time, recording, context) {
		this.initialize(context);
		var params = "mode="+mode+"&level="+level+"&time="+time+"&car="+car+"&record="+recording;
		this.xhr.open('POST', 'http://renaissanceracer.com/demojs/ajax/damier.php', true);
		this.xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		this.xhr.setRequestHeader('Content-length', params.length);
		this.xhr.setRequestHeader('Connection', 'close');
		this.xhr.send(params);
	},
	
	/**
	 * Callback sur la progression de l'appel Ajax
	 *  - value : progression, entre 0 et 4
	 */
	updateProgress : function(progress) {
		this.context.updateAjaxProgress(25*progress);
	}

}

