///////////////////////////////////////////////////////////////////////
//		METHODES ET FONCTIONS STATIQUES
//////////////////////////////////////////////////////////////////////
var _documentForm=null; // le formulaire contenant notre champ texte
//var _submitButton=null; // le bouton submit de notre formulaire
var _lastKeyCode=null;
var _eventKeycode = null;

function mainLoop(){
	for(i=0; i<FuncOL.length; i++) {
		var obj = new Object();
		obj = FuncOL[i];
		obj.prototype = AutoComplete.prototype;
		_documentForm = obj._documentForm;
		//_submitButton = obj._submitButton;
		if(obj._oldInputFieldValue!=obj._currentInputFieldValue){
		    var valeur=escapeURI(obj._currentInputFieldValue);
		    var suggestions=obj._resultCache[obj._currentInputFieldValue];
		    if(suggestions){ // la réponse était encore dans le cache
		      obj.metsEnPlace(valeur,suggestions)
		    }else{
		      obj.callSuggestions(valeur,obj._adresseRecherche) // appel distant
		    }
		    obj._inputField.focus()
		}
		obj._oldInputFieldValue=obj._currentInputFieldValue;
	}
	setTimeout("mainLoop()",2000); // la fonction se redéclenchera dans 200 ms
	return true
}



//////////////////////////////////////////////////////////////////////
//		COM SERVEUR
//////////////////////////////////////////////////////////////////////
var _xmlHttp = null; //l'objet xmlHttpRequest utilisé pour contacter le serveur

// Mecanisme de caching des réponses
function cacheResults(cache,debut,suggestions){
  cache[debut]=suggestions
}

function decode(str) {
     return unescape(str.replace(/\+/g, " "));
}

function encode(str) {
	var result = "";
	for (i = 0; i < str.length; i++) {
		if (str.charAt(i) == " ") result += "+";
		else result += str.charAt(i);
	}
	return escape(result);
}

// Transformation XML en tableau
function traiteXmlSuggestions(xmlDoc) {
  var options = xmlDoc.getElementsByTagName('option');
  var optionsListe = new Array();
  for (var i=0; i < options.length; ++i) {
    optionsListe.push(decode(options[i].firstChild.data));
  }
  return optionsListe;
}

// Recupère le controle qui a envoyé la requete XML
function getSenderInputFieldId(xmlDoc) {
	var champ = xmlDoc.getElementsByTagName('champ');
	var sChamp = "";
	for (var i=0; i < champ.length; ++i) {
	    sChamp = champ[i].firstChild.data;
	}
	return sChamp;
}

// Recupère le controle qui a envoyé la requete XML
function getSenderStart(xmlDoc) {
	var debut = xmlDoc.getElementsByTagName('debut');
	var sDebut = "";
	for (var i=0; i < debut.length; ++i) {
	    sDebut = debut[i].firstChild.data;
	}
	return sDebut;
}

// retourne un objet xmlHttpRequest.
// méthode compatible entre tous les navigateurs (IE/Firefox/Opera)
function getXMLHTTP(){
  var xhr=null;
  if(window.XMLHttpRequest) // Firefox et autres
  xhr = new XMLHttpRequest();
  else if(window.ActiveXObject){ // Internet Explorer
    try {
      xhr = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e1) {
        xhr = null;
      }
    }
  }
  else { // XMLHttpRequest non supporté par le navigateur
    alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
  }
  return xhr;
}

/////////////////////////////////////////////////////////////

// echappe les caractère spéciaux
function escapeURI(La){
  if(encodeURIComponent) {
    return encodeURIComponent(La);
  }
  if(escape) {
    return escape(La)
  }
}

function setCompleteDivSize(input,completeDiv){
  if(completeDiv){
    completeDiv.style.left=calculateOffsetLeft(input)+"px";
    completeDiv.style.top=calculateOffsetTop(input)+input.offsetHeight-1+"px";
    completeDiv.style.width=calculateWidth(input)+"px"
  }
}

//insère une règle avec son nom
function insereCSS(nom,regle){
  if (document.styleSheets) {
    var I=document.styleSheets[0];
    if(I.addRule){ // méthode IE
      I.addRule(nom,regle)
    }else if(I.insertRule){ // méthode DOM
      I.insertRule(nom+" { "+regle+" }",I.cssRules.length)
    }
  }
}

function initStyle(){
  var AutoCompleteDivListeStyle="font-size: 13px; font-family: arial,sans-serif; word-wrap:break-word; ";
  var AutoCompleteDivStyle="display: block; padding-left: 3; padding-right: 3; height: 16px; overflow: hidden; background-color: white;";
  var AutoCompleteDivActStyle="background-color: #3366cc; color: white ! important; ";
  insereCSS(".AutoCompleteDivListeStyle",AutoCompleteDivListeStyle);
  insereCSS(".AutoCompleteDiv",AutoCompleteDivStyle);
  insereCSS(".AutoCompleteDivAct",AutoCompleteDivActStyle);
}

function setStylePourElement(c,name){
  c.className=name;
}

// calcule le décalage à gauche
function calculateOffsetLeft(r){
  return calculateOffset(r,"offsetLeft")
}

// calcule le décalage vertical
function calculateOffsetTop(r){
  return calculateOffset(r,"offsetTop")
}

function calculateOffset(r,attr){
  var kb=0;
  while(r){
    kb+=r[attr];
    r=r.offsetParent
  }
  return kb
}

// calcule la largeur du champ
function calculateWidth(input){
  return input.offsetWidth-2*1
}

// supprime les caractères retour chariot et line feed d'une chaine de caractères
function trimCR(chaine){
  for(var f=0,nChaine="",zb="\n\r"; f<chaine.length; f++) {
    if (zb.indexOf(chaine.charAt(f))==-1) {
      nChaine+=chaine.charAt(f);
    }
  }
  return nChaine
}

// Retourne la valeur de la possibilite (texte) contenu dans une div de possibilite
function getSuggestion(uneDiv){
  if(!uneDiv) {
    return null;
  }
  return trimCR(uneDiv.getElementsByTagName('span')[0].firstChild.data)
}

///ELEMENT TEXTE

// taille de la selection dans le champ input
function rangeSize(n){
  var N=-1;
  if(n.createTextRange){
    var fa=document.selection.createRange().duplicate();
    N=fa.text.length
  }else if(n.setSelectionRange){
    N=n.selectionEnd-n.selectionStart
  }
  return N
}

// taille du champ input non selectionne
function beforeRangeSize(n){
  var v=0;
  if(n.createTextRange){
    var fa=document.selection.createRange().duplicate();
    fa.moveEnd("textedit",1);
    v=n.value.length-fa.text.length
  }else if(n.setSelectionRange){
    v=n.selectionStart
  }else{
    v=-1
  }
  return v
}

// Place le curseur à la fin du champ
function cursorAfterValue(n){
  if(n.createTextRange){
    var t=n.createTextRange();
    t.moveStart("character",n.value.length);
    t.select()
  } else if(n.setSelectionRange) {
    n.setSelectionRange(n.value.length,n.value.length)
  }
}
