// retourne un objet xmlHttpRequest.
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 { alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); }
  return xhr;
}

var _documentForm=null;
var _Country=null;
var _City=null;
var _submitButton=null;
var _oldCountryValue="";
var _currentCountryValue="";
var _oldCityValue="";
var _currentCityValue="";
var _resultCacheCountry=new Object();
var _resultCacheCity=new Object();
var _xmlHttp = null;
var _adresseRechercheCountry = "countryXml" 
var _adresseRechercheCity = "cityXml" 
var _lastKeyCode=null;
var _eventKeycode = null;
var _completeDivRows = 0;
var _completeDivCountryRows = 0;
var _completeDivCityRows = 0;
var _completeDivCountryList = null;
var _completeDivCityList = null;
var _highlightedSuggestionIndexCountry = -1;
var _highlightedSuggestionIndexCity = -1;
var _highlightedSuggestionDivCountry = null;
var _highlightedSuggestionDivCity = null;
var _mouseHighlightedSuggestionDivCity = null;
var _cursorUpDownPressed = null;


function initAutoComplete(form,country,city,submit){
  _documentForm=form;
  _submitButton=submit;
  _Country=country;
  _Country.autocomplete="on";
  _City=city;
  _City.autocomplete="on";

  creeAutocompletionDivCountry();
  creeAutocompletionDivCity();

  _currentCountryValue=_Country.value;
  _oldCountryValue=_currentCountryValue;
  _currentCityValue=_City.value;
  _oldCityValue=_currentCityValue;

  cacheResultsCountry("",new Array())
  cacheResultsCity("",new Array())
  document.onkeydown=onKeyDownHandler;
  _Country.onkeyup=onKeyUpHandlerCountry;
  _Country.onblur=onBlurHandlerCountry;
  _City.onkeyup=onKeyUpHandlerCity;
  _City.onblur=onBlurHandlerCity;  
  window.onresize=onResizeHandler;

  setTimeout("mainLoop()",200)
}



function mainLoop(){
  if(_oldCountryValue!=_currentCountryValue){
    _currentCountryValue=_currentCountryValue.toUpperCase();
    _Country.value=_currentCountryValue;
    var valeur=escapeURI(_currentCountryValue);
    var suggestionsCountry=_resultCacheCountry[_currentCountryValue];
    if(suggestionsCountry){
      metsEnPlaceCountry(valeur,suggestionsCountry)
    }else{
      callSuggestionsCountry(valeur) // appel distant
    }
    _Country.focus()
  }
  
  // Changement dans la box ville
  if(_oldCityValue!=_currentCityValue){
    _currentCityValue=_currentCityValue.toUpperCase();
    _City.value=_currentCityValue;
    var valeur=escapeURI(_currentCityValue);
    var suggestionsCity=_resultCacheCity[_currentCityValue];
    if(suggestionsCity){
      metsEnPlaceCity(valeur,suggestionsCity)
    }else{
      callSuggestionsCity(valeur,_Country.value) // appel distant
    }
    _City.focus()
  }
  
  _oldCountryValue=_currentCountryValue;
  _oldCityValue=_currentCityValue;
  setTimeout("mainLoop()",200);
  return true
}










// Fonctions génériques

// echappe les caract�re sp�ciaux
function escapeURI(La){
  if(encodeURIComponent) {
    return encodeURIComponent(La);
  }
  if(escape) {
    return escape(La)
  }
}

// Handler pour le keydown du document
var onKeyDownHandler=function(event){
  if(!event&&window.event) {
    event=window.event;
  }
  // on enregistre la touche ayant d�clench� l'evenement
  if(event) {
    _lastKeyCode=event.keyCode;
  }
}

// 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)
  }
}


// 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)
}

// 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
}

// Handler de resize de la fenetre
var onResizeHandler=function(event){
  // recalcule la taille des suggestions
  setCompleteDivSizeCountry();
  setCompleteDivSizeCity();
}

// declenchee quand la sourie quitte une div de possiblite. La div repasse a l'etat normal
var divOnMouseOut = function(){
  setStylePourElement(this,"AutoCompleteDiv");
};

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
}



// Fonctions necessaires pour la DIV PAYS 

function callSuggestionsCountry(valeur){
  if(_xmlHttp&&_xmlHttp.readyState!=0){
    _xmlHttp.abort()
  }
  _xmlHttp=getXMLHTTP();
  if(_xmlHttp){
    _xmlHttp.open("GET",_adresseRechercheCountry+"?debut="+valeur,true);
    _xmlHttp.onreadystatechange=function() {
      if(_xmlHttp.readyState==4&&_xmlHttp.responseXML) {
        var liste = traiteXmlSuggestionsCountry(_xmlHttp.responseXML)
        cacheResultsCountry(valeur,liste)
        metsEnPlaceCountry(valeur,liste)
      }
    };
    // envoi de la requete
    _xmlHttp.send(null)
  }
}

// Transformation XML en tableau
function traiteXmlSuggestionsCountry(xmlDoc) {
  var options = xmlDoc.getElementsByTagName('country');
  var optionsListe = new Array();
  for (var i=0; i < options.length; ++i) {
    optionsListe.push(options[i].firstChild.data);
  }
  return optionsListe;
}

// calcule la largeur du champ
function calculateWidthCountry(){
  return _Country.offsetWidth-2*1
}

function setCompleteDivSizeCountry(){
  if(_completeDivCountry){
    _completeDivCountry.style.left=calculateOffsetLeft(_Country)+"px";
    _completeDivCountry.style.top=calculateOffsetTop(_Country)+_Country.offsetHeight-1+"px";
    _completeDivCountry.style.width=calculateWidthCountry()+"px"
  }
}

function creeAutocompletionDivCountry() {
  _completeDivCountry=document.createElement("DIV");
  _completeDivCountry.id="completeDivCountry";
  var borderLeftRight=1;
  var borderTopBottom=1;
  _completeDivCountry.style.borderRight="black "+borderLeftRight+"px solid";
  _completeDivCountry.style.borderLeft="black "+borderLeftRight+"px solid";
  _completeDivCountry.style.borderTop="black "+borderTopBottom+"px solid";
  _completeDivCountry.style.borderBottom="black "+borderTopBottom+"px solid";
  _completeDivCountry.style.zIndex="1";
  _completeDivCountry.style.paddingRight="0";
  _completeDivCountry.style.paddingLeft="0";
  _completeDivCountry.style.paddingTop="0";
  _completeDivCountry.style.paddingBottom="0";
  setCompleteDivSizeCountry();
  _completeDivCountry.style.visibility="hidden";
  _completeDivCountry.style.position="absolute";
  _completeDivCountry.style.backgroundColor="white";
  document.body.appendChild(_completeDivCountry);
  setStylePourElement(_completeDivCountry,"AutoCompleteDivListeStyle");
}

function metsEnPlaceCountry(valeur, liste){
  while(_completeDivCountry.childNodes.length>0) {
    _completeDivCountry.removeChild(_completeDivCountry.childNodes[0]);
  }
  // mise en place des suggestions
  for(var f=0; f<liste.length; ++f){
    var nouveauDiv=document.createElement("DIV");
    nouveauDiv.onmousedown=divOnMouseDownCountry;
    nouveauDiv.onmouseover=divOnMouseOverCountry;
    nouveauDiv.onmouseout=divOnMouseOut;
    setStylePourElement(nouveauDiv,"AutoCompleteDiv");
    var nouveauSpan=document.createElement("SPAN");
    nouveauSpan.innerHTML=liste[f]; // le texte de la suggestion
    nouveauDiv.appendChild(nouveauSpan);
    _completeDivCountry.appendChild(nouveauDiv)
  }
  PressActionCountry();
  if(_completeDivCountryRows>0) {
    _completeDivCountry.height=16*_completeDivCountryRows+4;
  } else {
    hideCompleteDivCountry();
  }

}

var onKeyUpHandlerCountry=function(event){
  // acc�s evenement compatible IE/Firefox
  if(!event&&window.event) {
    event=window.event;
  }
  _eventKeycode=event.keyCode;
  // Dans les cas touches touche haute(38) ou touche basse (40)
  if(_eventKeycode==40||_eventKeycode==38) {
    // on autorise le blur du champ (traitement dans onblur)
    blurThenGetFocusCountry();
  }
  // taille de la selection
  var N=rangeSize(_Country);
  // taille du texte avant la selection (selection = suggestion d'autocompl�tion)
  var v=beforeRangeSize(_Country);
  // contenu du champ texte
  var V=_Country.value;
  //_Country.value=V.toUpperCase();
  if(_eventKeycode!=0){
    if(N>0&&v!=-1) {
      // on recupere uniquement le champ texte tap� par l'utilisateur
      V=V.substring(0,v);
    }
    // 13 = touche entr�e
    if(_eventKeycode==13||_eventKeycode==3){
      var d=_Country;
      // on mets en place l'ensemble du champ texte en repoussant la selection
      if(_Country.createTextRange){
        var t=_Country.createTextRange();
        t.moveStart("character",_Country.value.length);
        _Country.select()
      } else if (d.setSelectionRange){
        _Country.setSelectionRange(_Country.value.length,_Country.value.length)
      }
      _City.focus();
    } else {
      // si on a pas pu agrandir le champ non selectionn�, on le mets en place violemment.
      if(_Country.value!=V) {
        _Country.value=V
      }
    }
  }
  // si la touche n'est ni haut, ni bas, on stocke la valeur utilisateur du champ
  if(_eventKeycode!=40&&_eventKeycode!=38) {
    // le champ courant n est pas change si key Up ou key Down
  	_currentCountryValue=V;
  }
  if(handleCursorUpDownEnterCountry(_eventKeycode)&&_eventKeycode!=0) {
    // si on a pr�ss� une touche autre que haut/bas/enter
    PressActionCountry();
  }
}

function PressActionCountry(){
  _highlightedSuggestionIndexCountry=-1;
  var suggestionList=_completeDivCountry.getElementsByTagName("DIV");
  var suggestionLongueur=suggestionList.length;
  // on stocke les valeurs pr�c�dentes
  // nombre de possibilit�s de compl�tion
  _completeDivCountryRows=suggestionLongueur;
  // possiblit�s de compl�tion
  _completeDivCountryList=suggestionList;
  // si le champ est vide, on cache les propositions de compl�tion
  if(_currentCountryValue==""||suggestionLongueur==0){
    hideCompleteDivCountry()
  }else{
    showCompleteDivCountry()
  }
  var trouve=false;
  // si on a du texte sur lequel travailler
  if(_currentCountryValue.length>0){
    var indice;
    // T vaut true si on a dans la liste de suggestions un mot commencant comme l'entr�e utilisateur
    for(indice=0; indice<suggestionLongueur; indice++){
      if(getSuggestion(suggestionList.item(indice)).toUpperCase().indexOf(_currentCountryValue.toUpperCase())==0) {
        trouve=true;
        break
      }
    }
  }
  // on d�s�lectionne toutes les suggestions
  for(var i=0; i<suggestionLongueur; i++) {
    setStylePourElement(suggestionList.item(i),"AutoCompleteDiv");
  }
  // si l'entr�e utilisateur (n) est le d�but d'une suggestion (n-1) on s�lectionne cette suggestion avant de continuer
  if(trouve){
    _highlightedSuggestionIndexCountry=indice;
    _highlightedSuggestionDivCountry=suggestionList.item(_highlightedSuggestionIndexCountry);
  }else{
    _highlightedSuggestionIndexCountry=-1;
    _highlightedSuggestionDivCountry=null
  }
  var supprSelection=false;
  switch(_eventKeycode){
    // cursor left, cursor right, page up, page down, others??
    case 8:
    case 33:
    case 34:
    case 35:
    case 35:
    case 36:
    case 37:
    case 39:
    case 45:
    case 46:
      // on supprime la suggestion du texte utilisateur
      supprSelection=true;
      break;
    default:
      break
  }
  // si on a une suggestion (n-1) s�lectionn�e
  if(!supprSelection&&_highlightedSuggestionDivCountry){
    setStylePourElement(_highlightedSuggestionDivCountry,"AutoCompleteDivAct");
    var z;
    if(trouve) {
      z=getSuggestion(_highlightedSuggestionDivCountry).substr(0);
    } else {
      z=_currentCountryValue;
    }
    if(z!=_Country.value){
      if(_Country.value!=_currentCountryValue) {
        return;
      }
      // si on peut cr�er des range dans le document
      if(_Country.createTextRange||_Country.setSelectionRange) {
        _Country.value=z;
      }
      // on s�lectionne la fin de la suggestion
      if(_Country.createTextRange){
        var t=_Country.createTextRange();
        t.moveStart("character",_currentCountryValue.length);
        t.select()
      }else if(_Country.setSelectionRange){
        _Country.setSelectionRange(_currentCountryValue.length,_Country.value.length)
      }
    }
  }else{
    // sinon, plus aucune suggestion de s�lectionn�e
    _highlightedSuggestionIndexCountry=-1;
  }
}

function blurThenGetFocusCountry(){
  _cursorUpDownPressed=true;
  _Country.blur();
  setTimeout("_Country.focus();",10);
  return
}

// Cache completement les choix de completion
function hideCompleteDivCountry(){
  _completeDivCountry.style.visibility="hidden"
}

// Rends les choix de completion visibles
function showCompleteDivCountry(){
  _completeDivCountry.style.visibility="visible";
  setCompleteDivSizeCountry()
}

// Handler de blur sur le champ texte
var onBlurHandlerCountry=function(event){
  if(!_cursorUpDownPressed){
    // si le blur n'est pas caus� par la touche haut/bas
    hideCompleteDivCountry();
    // Si la derni�re touche pr�ss� est tab, on passe au bouton de validation
    if(_lastKeyCode==9){
      //_submitButton.focus();
      _lastKeyCode=-1
    }
  }
  _cursorUpDownPressed=false
};

// declenchee quand on clique sur une div contenant une possibilite
var divOnMouseDownCountry=function(){
  _Country.value=getSuggestion(this);
  //_documentForm.submit()
};

// declenchee quand on passe sur une div de possibilite. La div pr�c�dente est passee en style normal
var divOnMouseOverCountry=function(){
  if(_highlightedSuggestionDivCountry) {
    setStylePourElement(_highlightedSuggestionDivCountry,"AutoCompleteDiv");
  }
  setStylePourElement(this,"AutoCompleteDivAct")
};


// Change la suggestion en surbrillance
function highlightNewValueCountry(C){
  if(!_completeDivCountryList||_completeDivCountryRows<=0) {
    return;
  }
  showCompleteDivCountry();
  if(C>=_completeDivCountryRows){
    C=_completeDivCountryRows-1
  }
  if(_highlightedSuggestionIndexCountry!=-1&&C!=_highlightedSuggestionIndexCountry){
    setStylePourElement(_highlightedSuggestionDivCountry,"AutoCompleteDiv");
    _highlightedSuggestionIndexCountry=-1
  }
  if(C<0){
    _highlightedSuggestionIndexCountry=-1;
    _Country.focus();
    return
  }
  _highlightedSuggestionIndexCountry=C;
  _highlightedSuggestionDivCountry=_completeDivCountryList.item(C);
  setStylePourElement(_highlightedSuggestionDivCountry,"AutoCompleteDivAct");
  _Country.value=getSuggestion(_highlightedSuggestionDivCountry);
}

// Mecanisme de caching des r�ponses
function cacheResultsCountry(debut,suggestions){
  _resultCacheCountry[debut]=suggestions
}

// Change la suggestion selectionn�.
function handleCursorUpDownEnterCountry(eventCode){
  if(eventCode==40){
    highlightNewValueCountry(_highlightedSuggestionIndexCountry+1);
    return false
  }else if(eventCode==38){
    highlightNewValueCountry(_highlightedSuggestionIndexCountry-1);
    return false
  }else if(eventCode==13||eventCode==3){
    return false
  }
  return true
}


// Fonctions necessaires pour la DIV VILLE 

function callSuggestionsCity(valeur, country){
  if(_xmlHttp&&_xmlHttp.readyState!=0){
    _xmlHttp.abort()
  }
  _xmlHttp=getXMLHTTP();
  if(_xmlHttp){
    //appel � l'url distante
    _xmlHttp.open("GET",_adresseRechercheCity+"?cityPrefix="+valeur+"&country="+country,true);
    _xmlHttp.onreadystatechange=function() {
      if(_xmlHttp.readyState==4&&_xmlHttp.responseXML) {
        var liste = traiteXmlSuggestionsCity(_xmlHttp.responseXML)
        cacheResultsCity(valeur,liste)
        metsEnPlaceCity(valeur,liste)
      }
    };
    // envoi de la requete
    _xmlHttp.send(null)
  }
}

// Transformation XML en tableau
function traiteXmlSuggestionsCity(xmlDoc) {
  var options = xmlDoc.getElementsByTagName('city');
  var optionsListe = new Array();
  for (var i=0; i < options.length; ++i) {
    optionsListe.push(options[i].firstChild.data);
  }
  return optionsListe;
}

function calculateWidthCity(){
  return _City.offsetWidth-2*1
}

function setCompleteDivSizeCity(){
  if(_completeDivCity){
    _completeDivCity.style.left=calculateOffsetLeft(_City)+"px";
    _completeDivCity.style.top=calculateOffsetTop(_City)+_City.offsetHeight-1+"px";
    _completeDivCity.style.width=calculateWidthCountry()+"px"
  }
}

function creeAutocompletionDivCity() {
  _completeDivCity=document.createElement("DIV");
  _completeDivCity.id="completeDiv";
  var borderLeftRight=1;
  var borderTopBottom=1;
  _completeDivCity.style.borderRight="black "+borderLeftRight+"px solid";
  _completeDivCity.style.borderLeft="black "+borderLeftRight+"px solid";
  _completeDivCity.style.borderTop="black "+borderTopBottom+"px solid";
  _completeDivCity.style.borderBottom="black "+borderTopBottom+"px solid";
  _completeDivCity.style.zIndex="1";
  _completeDivCity.style.paddingRight="0";
  _completeDivCity.style.paddingLeft="0";
  _completeDivCity.style.paddingTop="0";
  _completeDivCity.style.paddingBottom="0";
  setCompleteDivSizeCity();
  _completeDivCity.style.visibility="hidden";
  _completeDivCity.style.position="absolute";
  _completeDivCity.style.backgroundColor="white";
  document.body.appendChild(_completeDivCity);
  setStylePourElement(_completeDivCity,"AutoCompleteDivListeStyle");
}

function metsEnPlaceCity(valeur, liste){
  while(_completeDivCity.childNodes.length>0) {
    _completeDivCity.removeChild(_completeDivCity.childNodes[0]);
  }
  // mise en place des suggestions
  for(var f=0; f<liste.length; ++f){
    var nouveauDiv=document.createElement("DIV");
    nouveauDiv.onmousedown=divOnMouseDownCity;
    nouveauDiv.onmouseover=divOnMouseOverCity;
    nouveauDiv.onmouseout=divOnMouseOut;
    setStylePourElement(nouveauDiv,"AutoCompleteDiv");
    var nouveauSpan=document.createElement("SPAN");
    nouveauSpan.innerHTML=liste[f]; // le texte de la suggestion
    nouveauDiv.appendChild(nouveauSpan);
    _completeDivCity.appendChild(nouveauDiv)
  }
  PressActionCity();
  if(_completeDivCityRows>0) {
    _completeDivCity.height=16*_completeDivCityRows+4;
  } else {
    hideCompleteDivCity();
  }
}

var onKeyUpHandlerCity=function(event){
  if(!event&&window.event) {
    event=window.event;
  }
  _eventKeycode=event.keyCode;
  // Dans les cas touches touche haute(38) ou touche basse (40)
  if(_eventKeycode==40||_eventKeycode==38) {
    // on autorise le blur du champ (traitement dans onblur)
    blurThenGetFocusCity();
  }
  // taille de la selection
  var N=rangeSize(_City);
  // taille du texte avant la selection (selection = suggestion d'autocompl�tion)
  var v=beforeRangeSize(_City);
  // contenu du champ texte
  var V=_City.value;
  if(_eventKeycode!=0){
    if(N>0&&v!=-1) {
      // on recupere uniquement le champ texte tap� par l'utilisateur
      V=V.substring(0,v);
    }
    // 13 = touche entr�e
    if(_eventKeycode==13||_eventKeycode==3){
      var d=_City;
      // on mets en place l'ensemble du champ texte en repoussant la selection
      if(_City.createTextRange){
        var t=_City.createTextRange();
        t.moveStart("character",_City.value.length);
        _City.select()
      } else if (d.setSelectionRange){
        _City.setSelectionRange(_City.value.length,_City.value.length)
      }
    } else {
      // si on a pas pu agrandir le champ non selectionn�, on le mets en place violemment.
      if(_City.value!=V) {
        _City.value=V
      }
    }
  }
  // si la touche n'est ni haut, ni bas, on stocke la valeur utilisateur du champ
  if(_eventKeycode!=40&&_eventKeycode!=38) {
    // le champ courant n est pas change si key Up ou key Down
  	_currentCityValue=V;
  }
  if(handleCursorUpDownEnterCity(_eventKeycode)&&_eventKeycode!=0) {
    // si on a pr�ss� une touche autre que haut/bas/enter
    PressActionCity();
  }
}

function PressActionCity(){
  _highlightedSuggestionIndexCity=-1;
  var suggestionList=_completeDivCity.getElementsByTagName("DIV");
  var suggestionLongueur=suggestionList.length;
  // on stocke les valeurs pr�c�dentes
  // nombre de possibilit�s de compl�tion
  _completeDivCityRows=suggestionLongueur;
  // possiblit�s de compl�tion
  _completeDivCityList=suggestionList;
  // si le champ est vide, on cache les propositions de compl�tion
  if(_currentCountryValue==""||suggestionLongueur==0){
    hideCompleteDivCity()
  }else{
    showCompleteDivCity()
  }
  var trouve=false;
  // si on a du texte sur lequel travailler
  if(_currentCountryValue.length>0){
    var indice;
    // T vaut true si on a dans la liste de suggestions un mot commencant comme l'entr�e utilisateur
    for(indice=0; indice<suggestionLongueur; indice++){
      if(getSuggestion(suggestionList.item(indice)).toUpperCase().indexOf(_currentCountryValue.toUpperCase())==0) {
        trouve=true;
        break
      }
    }
  }
  // on d�s�lectionne toutes les suggestions
  for(var i=0; i<suggestionLongueur; i++) {
    setStylePourElement(suggestionList.item(i),"AutoCompleteDiv");
  }
  // si l'entr�e utilisateur (n) est le d�but d'une suggestion (n-1) on s�lectionne cette suggestion avant de continuer
  if(trouve){
    _highlightedSuggestionIndexCity=indice;
    _highlightedSuggestionDivCity=suggestionList.item(_highlightedSuggestionIndexCity);
  }else{
    _highlightedSuggestionIndexCity=-1;
    _highlightedSuggestionDivCity=null
  }
  var supprSelection=false;
  switch(_eventKeycode){
    // cursor left, cursor right, page up, page down, others??
    case 8:
    case 33:
    case 34:
    case 35:
    case 35:
    case 36:
    case 37:
    case 39:
    case 45:
    case 46:
      // on supprime la suggestion du texte utilisateur
      supprSelection=true;
      break;
    default:
      break
  }
  // si on a une suggestion (n-1) s�lectionn�e
  if(!supprSelection&&_highlightedSuggestionDivCity){
    setStylePourElement(_highlightedSuggestionDivCity,"AutoCompleteDivAct");
    var z;
    if(trouve) {
      z=getSuggestion(_highlightedSuggestionDivCity).substr(0);
    } else {
      z=_currentCountryValue;
    }
    if(z!=_Country.value){
      if(_Country.value!=_currentCountryValue) {
        return;
      }
      // si on peut cr�er des range dans le document
      if(_Country.createTextRange||_Country.setSelectionRange) {
        _Country.value=z;
      }
      // on s�lectionne la fin de la suggestion
      if(_Country.createTextRange){
        var t=_Country.createTextRange();
        t.moveStart("character",_currentCountryValue.length);
        t.select()
      }else if(_Country.setSelectionRange){
        _Country.setSelectionRange(_currentCountryValue.length,_Country.value.length)
      }
    }
  }else{
    // sinon, plus aucune suggestion de s�lectionn�e
    _highlightedSuggestionIndexCity=-1;
  }
}

function blurThenGetFocusCity(){
  _cursorUpDownPressed=true;
  _City.blur();
  setTimeout("_City.focus();",10);
  return
}

// Cache completement les choix de completion
function hideCompleteDivCity(){
  _completeDivCity.style.visibility="hidden"
}

// Rends les choix de completion visibles
function showCompleteDivCity(){
  _completeDivCity.style.visibility="visible";
  setCompleteDivSizeCity()
}

// Handler de blur sur le champ texte
var onBlurHandlerCity=function(event){
  if(!_cursorUpDownPressed){
    // si le blur n'est pas caus� par la touche haut/bas
    hideCompleteDivCity();
    // Si la derni�re touche pr�ss� est tab, on passe au bouton de validation
    if(_lastKeyCode==9){
      //_submitButton.focus();
      _lastKeyCode=-1
    }
  }
  _cursorUpDownPressed=false
};

var divOnMouseDownCity=function(){
  _City.value=getSuggestion(this);
  //_documentForm.submit()
};

// declenchee quand on passe sur une div de possibilite. La div pr�c�dente est passee en style normal
var divOnMouseOverCity=function(){
  if(_highlightedSuggestionDivCity) {
    setStylePourElement(_highlightedSuggestionDivCity,"AutoCompleteDiv");
  }
  setStylePourElement(this,"AutoCompleteDivAct")
  _mouseHighlightedSuggestionDivCity=this;
};


// Change la suggestion en surbrillance
function highlightNewValueCity(C){
  if(!_completeDivCityList||_completeDivCityRows<=0) {
    return;
  }
  
  showCompleteDivCity();
  if(C>=_completeDivCityRows){
    C=_completeDivCityRows-1
  }
  if(_highlightedSuggestionIndexCity!=-1&&C!=_highlightedSuggestionIndexCity){
    setStylePourElement(_highlightedSuggestionDivCity,"AutoCompleteDiv");
    _highlightedSuggestionIndexCity=-1
  }
  if(C<0){
    _highlightedSuggestionIndexCity=-1;
    _City.focus();
    return
  }
  if (_mouseHighlightedSuggestionDivCity) {
  	setStylePourElement(_mouseHighlightedSuggestionDivCity,"AutoCompleteDiv");
  }
  _highlightedSuggestionIndexCity=C;
  _highlightedSuggestionDivCity=_completeDivCityList.item(C);
  setStylePourElement(_highlightedSuggestionDivCity,"AutoCompleteDivAct");
  _City.value=getSuggestion(_highlightedSuggestionDivCity);
}

// Mecanisme de caching des r�ponses
function cacheResultsCity(debut,suggestions){
  _resultCacheCity[debut]=suggestions
}

// Change la suggestion selectionn�.
function handleCursorUpDownEnterCity(eventCode){
  if(eventCode==40){
    highlightNewValueCity(_highlightedSuggestionIndexCity+1);
    return false
  }else if(eventCode==38){
    highlightNewValueCity(_highlightedSuggestionIndexCity-1);
    return false
  }else if(eventCode==13||eventCode==3){
    return false
  }
  return true
}



