/*-*****************************************************************************
ECHO > JS > Gestion de l'AJAX

  Objet Ajax
  - charger  ()
  - executer (div, url, donnees, chargement)
  - tester   (div, url, donnees, chargement)

fonctions diverses
 - ajax_popup_afficher (idPopup, idMasque)
 - ajax_popup_masquer  (idPopup, idMasque)

*******************************************************************************/

/**
@class			Classe de gestion de l'Ajax
@author			ECHO © - BACHELIER Morgan
@since			2008
*/
function AJAX()
{
	/** DIV à écraser par le résultat d'une requête. */
	this.div = "";

	/** Ferme le div automatiquement à la fin du traitement. */
	this.fermer = "";

	/** Adresse du formulaire à exécuter. */
	this.url = "";
  
  /** affiche "veuillez patienter en popup */
  this.divPopup = false;  
  
  /** actions à exécuter en fin de traitement. */
  this.actions = "";              

	/** Va contenir les élements "paramètre=valeur" à passer au formulaire. */
	this.donnees = new Array();

	/** Le chargement de cette requête est-il asynchrone du reste de la page ? */
	this.async = true;

	/**  */
	this.response = "";

	/**  */
	this.responseXML = "";

	// Initialisation de la classe
	try
	{
		this.objet = new ActiveXObject('Microsoft.XMLHTTP');
	}
	catch (err1)
	{
		try
		{
			this.objet = new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch (err2)
		{
			try
			{
				this.objet = new XMLHttpRequest();
			}
			catch (err3)
			{
				this.objet = false;
			}
		}
	}

	//---------------------------------------------------------------------------

	/**
	@description	Ajoute des paramètres à l'objet Ajax
	@param			parametre	Le nom du paramètre
	@param			valeur		La valeur qu'il contient
	*/
	this.parametrer = function(parametre, valeur)
	{
		this.donnees.push(parametre + "=" + escape(valeur));
	}

	//---------------------------------------------------------------------------

	/**
	@author			BACHELIER Matthieu
	@description	Parcours une collection de variables et extrait dans la page courante les valeurs. Les variables admises sont de type chaîne de caractère
	ou des map (un nom en String et une liste de valeurs). Appelle la sous-fonction parametrer().
	@since			juillet 2009
	@throws			Une erreur affichant les paramètres fautifs
	*/
	this.genererParametres = function(collectionVariables)
	{
		var parametresBienGeneres = true; 			// Supposée à vrai, puis valeur modifiée en cours de traitement en cas d'erreur
		var msgErreur = "Erreur lors de la génération des paramètres :\n";
		for (i = 0; i < collectionVariables.length; i++)
		{
			var param = collectionVariables[i]; 	// Nom du paramètre
			if (typeof param == "string")			// Un seul élément à récupérer. Exemple : clé = "nomNature" => document.getElementById("nomNature").value, ce qui donne "Générateur d'hémodialyse"
			{
				if (typeof document.getElementById(param) == "object" && document.getElementById(param) == null)
				{
					parametresBienGeneres = false;
					msgErreur += "Attendu : '" + param + "' \tmais introuvable via document.getElementById(" + param + ")\n";
			  }
				else
					this.parametrer(param, document.getElementById(param).value);
	    }
			else if (typeof param == "object")	// Collection d'éléments à récupérer
			{
				if (typeof param[1] == "string")	// Si on a un couple "clé_string" => "valeur_unique_string"
				{
					this.parametrer(param[0], param[1]);
			  }
				else								// Sinon on a un couple "clé_string" => Array("chaine1", "chaine2", ..., "chaine_n")
				{
					this.parametrer(param[0], param[1].join('|'));
				}
		  }
			else
			{
				parametresBienGeneres = false;
				msgErreur += "'" + param + "' est de type inconnu : " + typeof param + "\n";
			}
		}
		if (!parametresBienGeneres) throw new Error(msgErreur);
	}

	//---------------------------------------------------------------------------

	/**
	@param	parametre	
	*/
	this.parametrerId = function(parametre)
	{
		var p = document.getElementById(parametre);
		if (p && p.value)
			this.donnees.push(parametre + "=" + escape(p.value));
	}

	//---------------------------------------------------------------------------

	/**
	@description	Retourne un message d'attente
	*/
	this.charger = function() {
		return "Veuillez patienter...";
	}

	//---------------------------------------------------------------------------

	/**
	@description	Remplace un div par le résultat d'une page ASP
	*/
	this.executer = function() {
	    if (this.objet) {
	        var reponse = "";
	        var base = this;

	        this.objet.open("POST", this.url, this.async);

	        this.objet.onreadystatechange = function() {
	            switch (base.objet.readyState) {
	                case 1:
	                case 2:
	                case 3:
	                    if (base.div) base.div.innerHTML = base.charger();
	                    if (document.getElementById("divAjaxPatienter") && base.divPopup == true) document.getElementById("divAjaxPatienter").style.display = "block";
	                    break;

	                case 4:
	                    if (base.objet.status == 200) {
	                        reponse = base.objet.responseText;
	                        if (base.div) base.div.innerHTML = reponse;
	                        base.response = base.objet.responseText;
	                        base.responseXML = base.objet.responseXML;
	                        // veuillez patienter si action
	                        if (document.getElementById("divAjaxPatienter")) document.getElementById("divAjaxPatienter").style.display = "none";
	                        if (base.actions != "") base.actions();
	                    }
	                    else {
	                        alert(base.objet.responseText);
	                        alert("Code erreur ajax " + base.objet.status);
	                    }
	            }
	        }

	        var p = "";
	        for (var i = 0; i < this.donnees.length; i++) {
	            p += this.donnees[i];
	            if (i < this.donnees.length - 1) p += "&";
	        }

	        this.objet.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	        this.objet.send(p);
	    }
	}
  
  
	//---------------------------------------------------------------------------

	/**
	@description	Remplace un div par le résultat d'une page ASP
	*/
	this.evaluer = function()
	{
		var o = this.objet;
		var r = "";

		this.objet.open("POST", this.url, this.async);
		this.objet.onreadystatechange = function()
		{
			switch (o.readyState)
			{
				case 1:
				case 2:
				case 3:
					break;
				case 4:
					self.response = o.responseText;
					eval(o.responseText);
			}
		}

		var p = "";
		for (var i = 0; i < this.donnees.length; i++)
		{
			p += this.donnees[i];
			if (i < this.donnees.length - 1) p += "&";
		}

		this.objet.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		this.objet.send(p);
	}

	//---------------------------------------------------------------------------

	/**
	@description	Remplace un div par le résultat d'une page ASP et affiche le résultat dans une fenêtre javascript (window.alert)
	*/
	this.tester = function()
	{
		var d = this.div;
		var o = this.objet;
		var c = this.charger;
		var r = "";

		this.objet.open("POST", this.url, this.async);
		this.objet.onreadystatechange = function()
		{
			if (o.readyState == 4)
			{
				r = o.responseText;
				//alert(r);
				if (d) d.innerHTML = r;
			}
			else if (d) d.innerHTML = c();
		}

		var p = "";
		for (var i = 0; i < this.donnees.length; i++)
		{
			p += this.donnees[i];
			if (i < this.donnees.length - 1) p += "&";
		}
		
		this.objet.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		this.objet.send(p);
	}

	//---------------------------------------------------------------------------

	/**
	@author			BACHELIER Matthieu
	@description	Fonction de debug
	@since			juillet 2009
	*/
	this.afficherParametres = function()
	{
		var msg = "Contenu des paramètres à envoyer : \n";
		for (i = 0; i < this.donnees.length; i++)
		{
			msg += unescape(this.donnees[i]) + "\n";
		}
		alert(msg);
	}
} // fin AJAX




/*******************************************************************************
 - ajax_creer          ()
 - ajax_donnees        (ajax)
 - ajax_attente        ()
 - ajax_executer       (ajax, div, url, donnees, chargement)
 - ajax_popup_afficher (idPopup, idMasque)
 - ajax_popup_masquer  (idPopup, idMasque)
*******************************************************************************/

/*------------------------------------------------------------------------------
  renvoie un objet "AJAX" (XMLHTTP) en fonction du navigateur
  = objet XMLHTTP
------------------------------------------------------------------------------*/
function ajax_creer()
{
  var objet = false;
  try
  {
    objet = new ActiveXObject('Msxml2.XMLHTTP');
  }
  catch (err1)
  {
    try
    {
      objet = new ActiveXObject('Microsoft.XMLHTTP');
    }
    catch (err2)
    {
		  try
      {
			  objet = new XMLHttpRequest();
		  }
		  catch (err3)
		  {
			  objet = false;
		  }
    }
  }
  return objet;
}


/*------------------------------------------------------------------------------
  retourne une chaine correspondant à un liste de paramètres et leur valeur
  @ objet      : objet  : objet XMLHTTP
------------------------------------------------------------------------------*/
function ajax_donnees(ajax)
{
  var donnees = "ajax=true"; // premier paramètre bidon pour traiter les suivants de façon auto (avec "&" devant)
  if (ajax && ajax.donnees)
    for (var i = 0; i < ajax.donnees.length; i++)
      donnees += "&" + ajax.donnees[i].name + "=" + escape(ajax.donnees[i].value);
  return donnees;
}


/*------------------------------------------------------------------------------
  retourne un message d'attente
  = chaine
------------------------------------------------------------------------------*/
function ajax_attente()
{
  return "Veuillez patienter... <img align='absmiddle' src='chargement.gif'>";
}


/*------------------------------------------------------------------------------
 modifie le div le script situé à l'url donnée (méthode post)
 @ ajax       : objet  : objet XMLHTTP
 @ div        : div    : objet div dont le contenu va être modifié
 @ url        : chaine : url de la page d'action AJAX (ASP)
 @ donnees    : chaine : paramètres pour la page d'action AJAX
 @ chargement : true = dynamique, false = on recharge la page
------------------------------------------------------------------------------*/
function ajax_executer(ajax, div, url, donnees, chargement)
{
  ajax.open("POST", url, chargement);
  ajax.onreadystatechange = function()
  {
    if (ajax.readyState == 4)
      div.innerHTML = ajax.responseText;
    else
      div.innerHTML = ajax_attente();
  }
  ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  ajax.send(donnees);
}


//------------------------------------------------------------------------------
// affiche une "popup"
//------------------------------------------------------------------------------
function ajax_popup_afficher(idPopup, idMasque)
{
  var objPopup = document.getElementById(idPopup);
  var objMasque = document.getElementById(idMasque);

  var x = document.body.scrollLeft;
  var y = document.body.scrollTop;
  var l = document.body.clientWidth;
  var h = document.body.clientHeight;
  
  if (objPopup && objPopup.style)
  {
    objPopup.style.display = "block";
    objPopup.style.left = l / 2 + x;
    if(objPopup.style.left == "")
    {
      objPopup.style.left = "629px"; 
    }
    objPopup.style.top = h / 2 + y;
    if(objPopup.style.top == "")
    {
      objPopup.style.top = "393px";
    }
  }

  if (objMasque && objMasque.style)
  {
    objMasque.style.display = "block";
    objMasque.style.left = x;
    objMasque.style.top = y;

    /*
    objMasque.style.left   = 0;
    objMasque.style.top    = 0;
    objMasque.style.width  = window.screen.availWidth;
    objMasque.style.height = window.screen.availHeight;
    */
  }

  window.onscroll = function() { window.scrollTo(x, y); }

  // specifique menu
  var barreMenu = document.getElementById("barreMenu");
  var udm = document.getElementById("udm");
  if (barreMenu) { barreMenu.style.display = "none"; }
  if (udm) { udm.style.display = "none"; }

  return false;
}


//------------------------------------------------------------------------------
// masque la "popup"
//------------------------------------------------------------------------------
function ajax_popup_masquer(idPopup, idMasque)
{
  var objPopup = document.getElementById(idPopup);
  var objMasque = document.getElementById(idMasque);

  if (objPopup) objPopup.style.display = "none";
  if (objMasque) objMasque.style.display = "none";

  // specifique menu
  var barreMenu = document.getElementById("barreMenu");
  if (barreMenu) { barreMenu.style.display = "block"; }

  var udm = document.getElementById("udm");
  if (udm)
  {
    udm.style.display = "block";
    udm.style.zIndex = objMasque.style.zIndex + 1;   // ?
  }

  window.onscroll = "";

  return false;
}
