
// Handler XMLHttpRequest
var xmlHttp = createXmlHttpRequestObject();

// Handler serveur distant
var serverAddress = "work/classes/validate.php";

// si vrai, alors affiche le detail des erreurs
var showErrors = true;

// initialise le cache de validation des requetes
var cache = new Array();

// Cree une instance XMLHttpRequest
function createXmlHttpRequestObject()
{
  // enregistre la reference a l'objet XMLHttpRequest
  var xmlHttp;
  // Gestion des exceptions pour tous les navigateurs (sauf <=IE6)
  try
  {
    // instantiation de l'objet
    xmlHttp = new XMLHttpRequest();
  }
  catch(e)
  {
    // branchement pour IE6
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                    "MSXML2.XMLHTTP.5.0",
                                    "MSXML2.XMLHTTP.4.0",
                                    "MSXML2.XMLHTTP.3.0",
                                    "MSXML2.XMLHTTP",
                                    "Microsoft.XMLHTTP");
    // essaye chaque Id jusq'a ce que l'un fonctionne
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
    {
      try
      {
        // essaie de creer l'objet XMLHttpRequest
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
      }
      catch(e){} // ignore une possible erreur
    }
  }
  // retourne l'objet cree ou affiche un message d'erreur
  if (!xmlHttp)
    displayError("Error creating the XMLHttpRequest object.");
  else
    return xmlHttp;
}

// fonction qui affiche un message d'erreur
function displayError(message)
{
  // ignore les erreurs si showErrors est a faux
  if (showErrors)
  {
    // rend l'affichage de error a Off
    showErrors = false;
    // affiche un message d'erreur
    alert("Erreur rencontree: \n" + message);
    // reessaye la validation apres 10 sec
    setTimeout("validate();",10000);
  }
}

// Fonction qui prend en charge la validation des champs du formulaire
function validate(inputValue, fieldId)
{
  if (xmlHttp)
  {
    // si nous recevons des parametres non-nuls, nous les ajoutons au cache 
    // sous la forme d'une chaine de caracteres a envoyer au serveur 
    // pour validation
    if (fieldId)
    {
      // encode les valeurs en les ajoutant de maniere sure a une chaine 
      // de requete HTTP
      inputValue = encodeURIComponent(inputValue);
      fieldId = encodeURIComponent(fieldId);
      // ajout des valeurs a la file
      cache.push("inputValue=" + inputValue + "&fieldId=" + fieldId);
    }
    // tente la connexion au serveur
    try
    {
      // continue seulement si l'objet XMLHttpRequest n'est pas occupe
      // et si le cache n'est pas vide
      if ((xmlHttp.readyState == 4 || xmlHttp.readyState == 0) && cache.length > 0)
      {
	// garde un nouvel ensemble de parametres depuis le cache
	var cacheEntry = cache.shift();
	// fait une requete au serveur pour valider la donnee extraite
	xmlHttp.open("POST", serverAddress, true);
	xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	xmlHttp.onreadystatechange = handleRequestStateChange;
	xmlHttp.send(cacheEntry);
      }
    }
    catch(e)
    {
      // affiche une erreur qd il y a echec de la connexion au serveur
//   alert('Erreur');
      displayError(e.toString());
    }
  }
}

// fonction qui prend en charge la reponse HTTP
function handleRequestStateChange()
{
  // quand readyState vaut 4, nous lisons la reponse du serveur
  if (xmlHttp.readyState == 4)
  {
    // continue seulement si le statut http est "OK"
    if (xmlHttp.status == 200)
    {
      try
      {
	// lit la reponse depuis le serveur
	readResponse();
      }
      catch(e)
      {
	// affiche un message d'erreur
	displayError(e.toString());
      }
    } 
    else
    {
      // affiche un message d'erreur
      displayError(xmlHttp.statusText);
    }
  }
}

// lit la reponse du serveur
function readResponse()
{
  // retourne la reponse du serveur
  var response = xmlHttp.responseText;
  // erreur du serveur ?
  if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0)
    throw(response.length == 0 ? "Server error." : response);
  // garde la reponse dans un format XML (suppose que reponse est du XML valide)
  responseXml = xmlHttp.responseXML;
  // garde l'element document
  xmlDoc = responseXml.documentElement;
  result = xmlDoc.getElementsByTagName("result")[0].firstChild.data;
  fieldId = xmlDoc.getElementsByTagName("fieldid")[0].firstChild.data;

  // trouve l'element HTML qui affiche l'erreur
  message = document.getElementById(fieldId + "Failed");

  // montre l'erreur ou cache l'erreur
  message.className = (result == "0")? "error" : "hidden";

  // appelle validate() dans le cas ou il y a des valeurs laissees ds le cache
  setTimeout("validate();", 500);
}

// Focus sur le premier champ de formulaire
function setFocus()
{
  document.getElementById("txtUsername").focus();
}


//====== Specifique Autocompletion ==========

// nombre de caractere minimum 
var minimum_caractere = 1;

// doit-on prendre en compte la casse ?
var case_sensitive = 0 ;

function recup_email(e) {
	var sel = document.completion_form.completion_select ;
	var nb_el = sel.options.length ;
	var selIndex = sel.selectedIndex ;

	if (!document.completion_form.completion_text.value)
	{ 
		sel.style.display = 'none';
	}
	else if (e.keyCode == 40 && nb_el) { // fleche bas
		if (selIndex < sel.options.length - 1) sel.selectedIndex = selIndex + 1 ;
	}
	else if (e.keyCode == 38 && nb_el) { // fleche haut
		if (selIndex > 0) sel.selectedIndex = selIndex - 1 ;
	}
	else if (e.keyCode == 13 && nb_el) { // entr	e
		document.completion_form.completion_text.value = sel.options[selIndex].value ;
		sel.style.display = 'none';
	}
	else { // autre touche --> on recherche les emails
		val = document.completion_form.completion_text.value ;
		if (val.length >= minimum_caractere) {
			xmlHttp.open("GET", "ajax.php?what=completion1&case="+case_sensitive+"&val="+escape(val), true);
			xmlHttp.onreadystatechange = handleHttpResponse_recup_email;
			xmlHttp.send(null);
		}
	}
}

function handleHttpResponse_recup_email()
{
  // retourne la reponse du serveur
  var response = xmlHttp.responseText;

  if (xmlHttp.readyState == 4)
  { 
	emails = eval('(' + response + ')'); // [id1,id2, ...]

	var sel = document.completion_form.completion_select ;
	sel.attributes['size'].value = emails.length;

	// on vide le select
	while(sel.options.length > 0) sel.options[0] = null

	// on rempli avec les nouveaux emails
	for(i=0 ; i<emails.length ; i++)
		sel.options[sel.options.length] = new Option(emails[i],emails[i]);

	if (sel.options.length) {
		sel.selectedIndex = 0 ; // on selection le premier element de la liste
		sel.style.display = 'block';
	}
	else
		sel.style.display = 'none';
  }
}


function recup_mail_click() {
  var sel = document.completion_form.completion_select ;
  document.completion_form.completion_text.value = sel.options[sel.selectedIndex].value ;
  sel.style.display = 'none';
}
