﻿//Package de fonctions JAVASCRIPTS permettant d'utiliser la technologie AJAX

/* A mettre dans le fichier appelant
	<script language="javascript" src="../framework/javascript/fwk_ajax.js"></script>

	LES FONCTIONS SONT PRÉFIXÉES PAR "ajax_" POUR INDIQUER QU'ELLE SE TROUVENT DANS CE FRAMEWORK
*/

/* CONTENU :

1 - Fonctions privées du framework => Appelées uniquement par les fonctions publiques du framework.
	ajax_Response

2 - Fonctions publiques du framework => Appelées dans les pages web.
	ajax_Request
*/

/*
que peut prendre l'attribut "readystate " de l'objet httprequest :
	0 non initialisée
	1 en chargement
	2 chargée
	3 en cours de traitement
	4 terminée

Valeurs que peut prendre l'attribut "status " de l'objet httprequest :
	100 Continue
	101 Switching protocols
	200 OK
	201 Created
	202 Accepted
	203 Non-Authoritative Information
	204 No Content
	205 Reset Content
	206 Partial Content
	300 Multiple Choices
	301 Moved Permanently
	302 Found
	303 See Other
	304 Not Modified
	305 Use Proxy
	307 Temporary Redirect
	400 Bad Request
	400 Bad Request
	401 Unauthorized
	402 Payment Required
	403 Forbidden
	404 Not Found
	405 Method Not Allowed
	406 Not Acceptable
	407 Proxy Authentication Required
	408 Request Timeout
	409 Conflict
	410 Gone
	411 Length Required
	412 Precondition Failed
	413 Request Entity Too Large
	414 Request-URI Too Long
	415 Unsupported Media Type
	416 Requested Range Not Suitable
	417 Expectation Failed
	500 Internal Server Error
	501 Not Implemented
	502 Bad Gateway
	503 Service Unavailable
	504 Gateway Timeout
	505 HTTP Version Not Supported
*/

/**************************************************************************************************************************
***************************************************************************************************************************
1 - FONCTIONS PRIVEES DU FRAMEWORK ==> NE DOIVENT ETRE APPELEES QUE PAR LES FONCTIONS PUBLIQUES DU FRAMEWORK
***************************************************************************************************************************
**************************************************************************************************************************/

/**************************************************************************************************************************/
// Fonction permettant de récupérer le résultat d'une requête faite au serveur en utilisant AJAX
// Cette fonction fera ensuite appel à ajax_Process qui doit être définie dans la page HTML ayant fait la requête
function ajax_Response(request_id,httpRequest,i_resp_type,arg_user){
/*	Arguments	: request_id		-> Valeur identifiante de la requête
			: httpRequest	-> Objet request
			: int i_resp_type	-> 1 = Réponse Xml ; 2 = Réponse texte
			: arg_user		-> argument libre passé par l'utilisateur. Cet argument sera passé à la fonction ajax_Process
	Retour	: aucun
*/
	var reponse = null;
	//Gestion exception si, par exemple, erreur de communication
	try{
		if(httpRequest.readyState == 4){
			if (httpRequest.status == 200){
				if(i_resp_type == 1){
					//reponse = httpRequest.responseXML;
					if (window.XMLHttpRequest){ // Mozilla, Safari, IE >= 7...
						reponse = httpRequest.responseXML;
					}else if (window.ActiveXObject) { // IE <= 6
						reponse = new ActiveXObject("Microsoft.XMLDOM");
						reponse.loadXML(httpRequest.responseText);
					}
				}else{
					reponse = httpRequest.responseText;
				}
				//Fonction qui doit être créée
				ajax_Process(request_id,reponse,arg_user);
			}else{
				alert('Un problème est survenu au cours de la requête. Status : '+ httpRequest.status);
			}
		}
	}
	catch(e){
		alert("Une exception s'est produite : " + e.description);
	}
}


/**************************************************************************************************************************
***************************************************************************************************************************
2 - FONCTIONS PUBLIQUES DU FRAMEWORK ==> APPELEES DANS LES PAGES WEB
***************************************************************************************************************************
**************************************************************************************************************************/


/**************************************************************************************************************************/
// Fonction permettant de faire une requête au serveur en utilisant AJAX
function ajax_Request(request_id,i_req_type,b_asynchro,i_resp_type,s_url,s_arg,arg_user){
/*	Arguments	: request_id		-> Valeur identifiante de la requête
			: int i_req_type	-> 1=Request GET ; 2=Request POST
			: bool b_asynchro	-> TRUE=Réponse asynchrone ; FALSE=Réponse synchrone
			: int i_resp_type	-> 1=Réponse Xml ; 2 = Réponse texte
			: string s_url	-> url de la page à interroger (ne doit pas contenir la liste des paramètres à passer)
			: string s_arg	-> chaine d'argument à passer à la page à appeler (sous la forme argument1=valeur1&argment2=valeur2...)
			: arg_user		-> argument libre passé par l'utilisateur. Cet argument sera passé à la fonction ajax_Process
	Retour	: Retour de la requête (texte ou XML suivant i_resp_type) ou FALSE si erreur
*/

	var httpRequest = false;
	var s_type;

	var xhr = false;
	//créer une instance (un objet) de la classe désirée fonctionnant sur plusieurs navigateurs
      if (window.ActiveXObject) { // IE
           try {
               xhr = new ActiveXObject("Msxml2.XMLHTTP");
           } catch (e) {
               try {
                   xhr = new ActiveXObject("Microsoft.XMLHTTP");
               } catch (e) {}
           }
       }
       else if (window.XMLHttpRequest) { // Mozilla, Safari,...
           xhr = new XMLHttpRequest();
           if (xhr.overrideMimeType) {
               xhr.overrideMimeType('text/xml');//un appel de fonction supplémentaire pour écraser l'en-tête envoyé par le serveur, juste au cas où il ne s'agit pas de text/xml, pour certaines versions de navigateurs Mozilla
           }
       }
    	if (!xhr) {
            return false;
        }

     httpRequest=xhr;

	//Méthode d'envoi des données au serveur
	if(i_req_type == 2){
		s_type = 'POST';
	}else{
		s_type = 'GET';
		//Si GET, alors il faut concaténer l'URL avec la liste d'argument
		if(s_arg != '' && s_arg != null){
			s_url = s_url + '?' + s_arg;
		}
	}
	//Pour éviter l'erreur 411
	if(s_arg == '' || s_arg==null) s_arg = " ";
	//Dans le cas d'une réponse asynchrone, il faut programmer la fonction à appeler
	if(b_asynchro){
		httpRequest.onreadystatechange = function(){ajax_Response(request_id,httpRequest,i_resp_type,arg_user);};
	}
	//Interrogation du serveur
	httpRequest.open(s_type,s_url,b_asynchro);
	if(i_req_type == 2){
		httpRequest.setRequestHeader('Content-type','application/x-www-form-urlencoded');
		httpRequest.setRequestHeader('Content-length','0');
		//httpRequest.setRequestHeader('Connection','close');
	}
	httpRequest.send(s_arg);

	//Dans le cas d'une réponse synchrone, il faut exécuter la fonction immédiatement
	if(!b_asynchro){
		ajax_Response(request_id,httpRequest,i_resp_type,arg_user);
	}
}
