// ***************************************************************************************************************
// ***************************************************************************************************************
// Librairie HTTPRequest
// ***************************************************************************************************************
// ***************************************************************************************************************
// effectue des communications avec un serveur web sans recharger la page courante
// ATTENTION : nécessite dom.js pour la fonction "ajouter_evenement"
// ***************************************************************************************************************
// ***************************************************************************************************************
// code pour conserver le codage UTF-8 dans C-génie : éàè




//---------------------------------------------------------------------------------------
// VARIABLES GLOBALES :
//		@httprequest__communication (object) : pointeur vers le calque de notification de communication
//		@httprequest__nombre_de_communication (int) : nombre de communication en cours
//				permet de savoir quand supprimer le calque de notification de communication
//---------------------------------------------------------------------------------------
var httprequest__communication = null;
var httprequest__nombre_de_communication = 0;




//---------------------------------------------------------------------------------------
// NOM FONCTION : httprequest
// DESCRIPTION COURTE :	initialise le calque de notification de communication
// DESCRIPTION :	
//		crée un élément HTML contenu le code HTML du calque de notification de communication puis insère cet élément en tant que premier fils de BODY.
// ENTREES :
// NECESSITES :
//		La balise BODY doit exister.
// SORTIES :
// VALEURS DE RETOUR :	
//		* 0 : aucune erreur
// AUTEUR : DANIEL Eric
// DERNIERE MODIF : 10/12/2005
// ETAT : ok
// RESTE A FAIRE :
//		*
// REMARQUES :
// VOIR AUSSI : httprequest__communiquer
//---------------------------------------------------------------------------------------
function httprequest()
{
	// --------------
	// initialisation
	// --------------
	var element_html = null;


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------


	// -----------
	// traitements
	// -----------
	element_html = document.createElement( "DIV" );
	element_html.innerHTML = '<div style="z-index: 500; position: absolute; top: 0px; right: 0%; width: 370px height: 150px; background-image: url(/ressources/images/com_serveur.gif); display: none;"><img src="/ressources/images/com_serveur.gif"></div>';
	httprequest__communication = element_html.firstChild;
	document.body.insertBefore( httprequest__communication, document.body.firstChild );


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// 0 : aucune erreur
	return 0;
}




//---------------------------------------------------------------------------------------
// NOM FONCTION : httprequest__communiquer
// DESCRIPTION COURTE :	transmet des informations à une URL et récupère la réponse
// DESCRIPTION :	
//		interroge un script sur un serveur web en transmettant les informations spécifiées et récupère la réponse sous forme de chaine de caractères.
// ENTREES :
//		@url (string) : url à appeler (avec le http:// et le nom de domaine)
//		@methode (string) : GET ou POST (transmission des informations dans l'URL [GET] ou dans le header HTTP [POST])
//		@fonction (function) : pointeur vers la fonction a utiliser lors du retour des informations en mode asynchrone
//		@infos (array) : informations à transmettre en méthode POST
// NECESSITES :
// SORTIES :
// VALEURS DE RETOUR :	
//		* null : aucun contenu
//		* (string) : contenu de la réponse
// AUTEUR : DANIEL Eric
// DERNIERE MODIF : 10/12/2005
// ETAT : ok
// RESTE A FAIRE :
//		* ajouter un test sur le code de retour de la page web
// REMARQUES :
// VOIR AUSSI : httprequest
//---------------------------------------------------------------------------------------
function httprequest__communiquer( url, methode, fonction, infos )
{
	// --------------
	// initialisation
	// --------------
	var httprequest__ptr = false;
	var vars = null;


	// ------------------------------------
	// vérification des paramètres d'entrée
	// ------------------------------------
	// vérification du paramètre url
	if( url == "" )
		return null;

	// vérification du paramètre methode
	if( ( methode != "GET" ) && ( methode != "POST" ) )
		methode = "GET";

	// vérification du paramètre infos
	if( ( typeof( infos ) != "array" ) && ( typeof( infos ) != "object" ) )
		infos = new Array();


	// -----------
	// traitements
	// -----------
	if( httprequest__communication == null )
		httprequest();

	// création de l'objet httprequest
	/*@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
		{
		httprequest__ptr = new ActiveXObject("Msxml2.XMLHTTP");
		}
	catch( e )
		{
		try
			{
			httprequest__ptr = new ActiveXObject("Microsoft.XMLHTTP");
			}
		catch( E )
			{
			httprequest__ptr = false;
			}
		}
	@end @*/
	if( !httprequest__ptr
		&& ( typeof( XMLHttpRequest ) != "undefined" ) )
		httprequest__ptr = new XMLHttpRequest();
	
	// communication synchrone (attente de la réponse avant de sortir de la fonction)
	if( typeof( fonction ) != "function" )
		httprequest__ptr.open( methode, url, false );
	// communication asynchrone (sortie immédiate de la fonction et l'objet httprequest poursuit son action tout seul)
	else
		{
		// gestion du calque de communication
		httprequest__nombre_de_communication++;
		httprequest__communication.style.display = "block";

		// création de la requete en précisant la fonction anonyme de traitement de la réponse
		httprequest__ptr.open( methode, url, true );
		httprequest__ptr.onreadystatechange = function()
			{
				// si la communication est finie (etat=4)
				if( httprequest__ptr.readyState == 4 )
					{
					// gestion du calque de communication
					httprequest__nombre_de_communication--;
					if( httprequest__nombre_de_communication == 0 )
					httprequest__communication.style.display = "none";

					// si le code de réponse est bien 200
					if( httprequest__ptr.status == 200 )
						// on appelle la fonction de traitement avec la réponse
						fonction( httprequest__ptr.responseText );
					else
						// on appelle la fonction de traitement avec une chaine vide
						fonction( '""' );
					}
			}
		}

	if( methode == "POST" )
		{
		// on crée le header indiquant le codage des éléments fournis
		httprequest__ptr.setRequestHeader( "Method", "POST " + url + " HTTP/1.0" );
		httprequest__ptr.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
		vars = "";

		// ajout des différents éléments dans le header (en codant les éléments)
		for( var i in infos )
			vars += encodeURI( i ) + "=" + encodeURI( infos[i] ) + "&";
		}

	// envoi du header
	httprequest__ptr.send( vars );

	// communication synchrone (attente de la réponse avant de sortir de la fonction)
	if( typeof( fonction ) != "function" )
// ajouter un test sur le code de retour de la page web
		return httprequest__ptr.responseText;


	// ---------------------
	// sortie de la fonction
	// ---------------------
	// null : aucune erreur
	return null;
}
