
var tabIdSpan_voiture = new Array(); // contient la liste des identifiants ville pays des listes

var _xmlHttp_voiture = getHTTPObject(); //l'objet xmlHttpRequest utilisé pour contacter le serveur
var _adresseRecherche_voiture = dossier_v2+"/ajax/autocomplete_voiture_villes.php" //l'adresse à interroger pour trouver les suggestions



var _documentForm_voiture=null; // le formulaire contenant notre champ texte
var _inputField_voiture=null; // le champ texte lui-même
var _submitButton_voiture=null; // le bouton submit de notre formulaire


var _oldInputFieldValue_voiture=""; // valeur précédente du champ texte
var _currentInputFieldValue_voiture=""; // valeur actuelle du champ texte
var _resultCache_voiture=new Object(); // mécanisme de cache des requetes


var _lastKeyCode_voiture=null;
var _eventKeycode_voiture = null;

var _completeDivRows_voiture = 0;
var _completeDivDivList_voiture = null;
var _highlightedSuggestionIndex_voiture = -1;
var _highlightedSuggestionDiv_voiture = null;

// retourne un objet xmlHttpRequest.
// méthode compatible entre tous les navigateurs (IE/Firefox/Opera)



function initAutoComplete_voiture(form,field,submit){
  _documentForm_voiture=form;
  _inputField_voiture=field;
  _submitButton_voiture=submit;
 
  _inputField_voiture.autocomplete="off";
  
  creeAutocompletionDiv_voiture();
   
  _currentInputFieldValue_voiture=_inputField_voiture.value;
  _oldInputFieldValue_voiture=_currentInputFieldValue_voiture;
    
  document.onkeydown=onKeyDownHandler_voiture;
  _inputField_voiture.onkeyup=onKeyUpHandler_voiture;
  _inputField_voiture.onblur=onBlurHandler_voiture;
  window.onresize=onResizeHandler_voiture;
  
  // Premier déclenchement de la fonction dans 200 millisecondes
  tabIdSpan_voiture = new Array(); 
  setTimeout("mainLoop_voiture()",1000);
 
  
}


// tourne en permanence pour suggerer suite à un changement du champ texte
function mainLoop_voiture(){
  if(_oldInputFieldValue_voiture!=_currentInputFieldValue_voiture){
	  selec = false;
    var valeur=escapeURI_voiture(_currentInputFieldValue_voiture);
    var suggestions=_resultCache_voiture[_currentInputFieldValue_voiture];
    if(suggestions){ // la réponse était encore dans le cache
      metsEnPlace_voiture(valeur,suggestions)
    }else{
      callSuggestions_voiture(valeur) // appel distant
    }
    _inputField_voiture.focus()
  }
  _oldInputFieldValue_voiture=_currentInputFieldValue_voiture;
  setTimeout("mainLoop_voiture()",1000); // la fonction se redéclenchera dans 1000 ms
  return true
}

// echappe les caractère spéciaux
function escapeURI_voiture(La){
  if(encodeURIComponent) {
    return encodeURIComponent(La);
  }
  if(escape) {
    return escape(La)
  }
}


function callSuggestions_voiture(valeur){
	if(_xmlHttp_voiture &&_xmlHttp_voiture.readyState!=0){
		_xmlHttp_voiture.abort()
	}
 
	//appel à l'url distante
				//window.open(_adresseRecherche_voiture+"?destination="+valeur);
	_xmlHttp_voiture.open("GET",_adresseRecherche_voiture+"?destination="+valeur,true);
	_xmlHttp_voiture.onreadystatechange=function() {
	if(_xmlHttp_voiture.readyState==4&&_xmlHttp_voiture.responseXML) {
		var liste = traiteXmlSuggestions_voiture(_xmlHttp_voiture.responseXML,valeur)
			//cacheResults(valeur,liste)
			metsEnPlace_voiture(valeur,liste)
		}
	};
	// envoi de la requete
	_xmlHttp_voiture.send(null)
  
}

// Mecanisme de caching des réponses
function cacheResults_voiture(debut,suggestions){
  _resultCache_voiture[debut]=suggestions
}

// Transformation XML en tableau
function traiteXmlSuggestions_voiture(xmlDoc,valeur) {
  var options = xmlDoc.getElementsByTagName('option');
  var optionsListe = new Array();
  for (var i=0; i < options.length; ++i) {
	var txttemp = options[i].firstChild.data;
	txttemp = txttemp.toUpperCase();
	sp_txttemp = txttemp.split("||");
	txttemp = sp_txttemp[0];

	valtemp  = valeur;
	valtemp = str_replace("%20"," ",valtemp);
	valtemp =valtemp.toUpperCase();
	if(txttemp.search(valtemp)!=-1) {
		optionsListe.push(options[i].firstChild.data);
	}
  }
  return optionsListe;
}

//insère une règle avec son nom
function insereCSS_voiture(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_voiture(){
  var AutoCompleteDivListeStyle_voiture="font-size: 11px; font-family: arial,sans-serif; word-wrap:break-word; ";
  var AutoCompleteDivStyle_voiture="display: block; padding-left: 5px; padding-right: 5px; border-bottom:1px dotted #bfbfbf; height: 15px; overflow: hidden; background-color:#f5f5f5; cursor:pointer;";
  var AutoCompleteDivActStyle_voiture="padding-left: 5px; background-color: #20badb; border-bottom:1px dotted #bfbfbf; height: 15px; color: #FFFFFF; cursor:pointer; ";
  insereCSS_voiture(".AutoCompleteDivListeStyle_voiture",AutoCompleteDivListeStyle_voiture);
  insereCSS_voiture(".AutoCompleteDiv_voiture",AutoCompleteDivStyle_voiture);
  insereCSS_voiture(".AutoCompleteDivAct_voiture",AutoCompleteDivActStyle_voiture);
}



function setStylePourElement_voiture(c,name){
  c.className=name;
}

// calcule le décalage à gauche
function calculateOffsetLeft_voiture(r){
  return calculateOffset_voiture(r,"offsetLeft")
}

// calcule le décalage vertical
function calculateOffsetTop_voiture(r){
  return calculateOffset_voiture(r,"offsetTop")
}

function calculateOffset_voiture(r,attr){
  var kb=0;
  while(r){
    kb+=r[attr];
    r=r.offsetParent
  }
  return kb
}

// calcule la largeur du champ
function calculateWidth_voiture(){
  return _inputField_voiture.offsetWidth
}

function setCompleteDivSize_voiture(){

  if(_completeDiv_voiture){
    _completeDiv_voiture.style.left=calculateOffsetLeft_voiture(_inputField_voiture)+"px";
    _completeDiv_voiture.style.top=calculateOffsetTop_voiture(_inputField_voiture)+_inputField_voiture.offsetHeight-1+"px";
    _completeDiv_voiture.style.width=calculateWidth_voiture()+"px";
		//alert(_completeDivRows_voiture);
	
	if(15*_completeDivRows_voiture+4>200){
		_completeDiv_voiture.style.height="200px";
	}else{
		_completeDiv_voiture.style.height=15*(_completeDivRows_voiture+1)+4+"px";
	}
	
	/*
	leDiv = document.getElementById("monIFrame_voiture");
	leDiv.style.left=calculateOffsetLeft_voiture(_inputField_voiture)+"px";
	leDiv.style.top=calculateOffsetTop_voiture(_inputField_voiture)+_inputField_voiture.offsetHeight-1+"px";
	leDiv.style.width=calculateWidth_voiture()+"px"
	
	if(15*_completeDivRows_voiture+4>200){
		leDiv.style.height=200+"px";
	}else{
		leDiv.style.height=15*(_completeDivRows_voiture+1)+4+"px";
	}
	*/
  }
}

function creeAutocompletionDiv_voiture() {
  initStyle_voiture();
 
  _completeDiv_voiture=document.createElement("DIV");
  _completeDiv_voiture.id="completeDiv";
  var borderLeftRight=1;
  var borderTopBottom=1;
  _completeDiv_voiture.style.borderRight="#20badb "+borderLeftRight+"px solid";
  _completeDiv_voiture.style.borderLeft="#20badb "+borderLeftRight+"px solid";
  _completeDiv_voiture.style.borderTop="#20badb "+borderTopBottom+"px solid";
  _completeDiv_voiture.style.borderBottom="#20badb "+borderTopBottom+"px solid";
  _completeDiv_voiture.style.zIndex="10";
  _completeDiv_voiture.style.paddingRight="0";
  _completeDiv_voiture.style.paddingLeft="0";
  _completeDiv_voiture.style.paddingTop="0";
  _completeDiv_voiture.style.paddingBottom="0";


  setCompleteDivSize_voiture();
  _completeDiv_voiture.style.overflow="auto";
  _completeDiv_voiture.style.overflowX="hidden";
  _completeDiv_voiture.style.overflowY="auto";
  _completeDiv_voiture.style.display="none";
  _completeDiv_voiture.style.position="absolute";
  _completeDiv_voiture.style.backgroundColor="#F5F5F5";
  _completeDiv_voiture.onmousedown=divPrincipaleOnMouseDown_voiture;
   
  document.body.appendChild(_completeDiv_voiture);
  
  setStylePourElement_voiture(_completeDiv_voiture,"AutoCompleteDivListeStyle_voiture");
  
}

function metsEnPlace_voiture(valeur, liste){
  while(_completeDiv_voiture.childNodes.length>0) {
    _completeDiv_voiture.removeChild(_completeDiv_voiture.childNodes[0]);
  }
  // mise en place des suggestions
  tabIdSpan_voiture = new Array(); 
  for(var f=0; f<liste.length; ++f){
    var nouveauDiv=document.createElement("DIV");
    nouveauDiv.onmouseup=divOnMouseUp_voiture;
    nouveauDiv.onmouseover=divOnMouseOver_voiture;
    nouveauDiv.onmouseout=divOnMouseOut_voiture;
    setStylePourElement_voiture(nouveauDiv,"AutoCompleteDiv_voiture");
    var nouveauSpan=document.createElement("SPAN");
	nouveauSpan.id = "spanSuggest" + f;
	tmp2=liste[f];
	sp_txttemp = tmp2.split("||");
	tmp2 = sp_txttemp[0];
	tabIdSpan_voiture[f] = sp_txttemp[1];
	tmp2 = tmp2.replace(valeur.toUpperCase(),"<b>" + valeur.toUpperCase() + "</b>");
	//tmp2 = tmp2.replace(valeur.toUcWords(),"<b>" + valeur.toUcWords() + "</b>");
	tmp2 = tmp2.replace(valeur,"<b>" + valeur + "</b>");
    nouveauSpan.innerHTML=tmp2; // le texte de la suggestion

	nouveauDiv.appendChild(nouveauSpan);
    _completeDiv_voiture.appendChild(nouveauDiv)
  }
  
  PressAction_voiture();
  if(_completeDivRows_voiture>0) {
    _completeDiv_voiture.height=15*_completeDivRows_voiture+4;
	/*
	leDiv = document.getElementById("monIFrame_voiture");
	leDiv.style.display = "block";
	*/
	showCompleteDiv_voiture();
	
  } else {
    hideCompleteDiv_voiture();
  }
}


// Handler pour le keydown du document
var onKeyDownHandler_voiture=function(event){
  // accès evenement compatible IE/Firefox
  if(!event&&window.event) {
    event=window.event;
  }
  // on enregistre la touche ayant déclenché l'evenement
  if(event) {
    _lastKeyCode_voiture=event.keyCode;
  }
}




// Handler pour le keyup de lu champ texte
var onKeyUpHandler_voiture=function(event){
  // accès evenement compatible IE/Firefox
  if(!event&&window.event) {
    event=window.event;
  }
  _eventKeycode_voiture=event.keyCode;
  // Dans les cas touches touche haute(38) ou touche basse (40)
  if(_eventKeycode_voiture==40||_eventKeycode_voiture==38) {
    // on autorise le blur du champ (traitement dans onblur)
    blurThenGetFocus_voiture();
  }
  // taille de la selection
  var N=rangeSize_voiture(_inputField_voiture);
  // taille du texte avant la selection (selection = suggestion d'autocomplétion)
  var v=beforeRangeSize_voiture(_inputField_voiture);
  // contenu du champ texte
  var V=_inputField_voiture.value;
  if(_eventKeycode_voiture!=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_voiture==13||_eventKeycode_voiture==3){
      var d=_inputField_voiture;
      // on mets en place l'ensemble du champ texte en repoussant la selection
      if(_inputField_voiture.createTextRange){
        var t=_inputField_voiture.createTextRange();
        t.moveStart("character",_inputField_voiture.value.length);
        _inputField_voiture.select()
      } else if (d.setSelectionRange){
        _inputField_voiture.setSelectionRange(_inputField_voiture.value.length,_inputField_voiture.value.length)
      }
    } else {
      // si on a pas pu agrandir le champ non selectionné, on le mets en place violemment.
      if(_inputField_voiture.value!=V) {
			_inputField_voiture.value=V;
      }
    }
  }
  // si la touche n'est ni haut, ni bas, on stocke la valeur utilisateur du champ
  if(_eventKeycode_voiture!=40&&_eventKeycode_voiture!=38) {
    // le champ courant n est pas change si key Up ou key Down
  	_currentInputFieldValue_voiture=V;
  }
  if(handleCursorUpDownEnter_voiture(_eventKeycode_voiture)&&_eventKeycode_voiture!=0) {
    // si on a préssé une touche autre que haut/bas/enter
    PressAction_voiture();
  }
}

// Change la suggestion selectionné.
// cette méthode traite les touches haut, bas et enter
function handleCursorUpDownEnter_voiture(eventCode){
  if(eventCode==40){
    highlightNewValue_voiture(_highlightedSuggestionIndex_voiture+1);
    return false
  }else if(eventCode==38){
    highlightNewValue_voiture(_highlightedSuggestionIndex_voiture-1);
    return false
  }else if(eventCode==13||eventCode==3){
    return false
  }
  return true
}


// gère une touche pressée autre que haut/bas/enter
function PressAction_voiture(){
  _highlightedSuggestionIndex_voiture=-1;
  var suggestionList=_completeDiv_voiture.getElementsByTagName("DIV");
  var suggestionLongueur=suggestionList.length;
  // on stocke les valeurs précédentes
  // nombre de possibilités de complétion
  _completeDivRows_voiture=suggestionLongueur;
  // possiblités de complétion
  _completeDivDivList_voiture=suggestionList;
  // si le champ est vide, on cache les propositions de complétion
  if(_currentInputFieldValue_voiture==""||suggestionLongueur==0){
    hideCompleteDiv_voiture()
  }else{
    showCompleteDiv_voiture()
  }
  var trouve=false;
  // si on a du texte sur lequel travailler
  if(_currentInputFieldValue_voiture.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_voiture(suggestionList.item(indice)).toUpperCase().indexOf(_currentInputFieldValue_voiture.toUpperCase())==0) {
        trouve=true;
        break
      }
    }
  }
  // on désélectionne toutes les suggestions
  for(var i=0; i<suggestionLongueur; i++) {
    setStylePourElement_voiture(suggestionList.item(i),"AutoCompleteDiv_voiture");
  }
  // 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){
    _highlightedSuggestionIndex_voiture=indice;
    _highlightedSuggestionDiv_voiture=suggestionList.item(_highlightedSuggestionIndex_voiture);
  }else{
    _highlightedSuggestionIndex_voiture=-1;
    _highlightedSuggestionDiv_voiture=null
  }
  var supprSelection=false;
  switch(_eventKeycode_voiture){
    // 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&&_highlightedSuggestionDiv_voiture){
    setStylePourElement_voiture(_highlightedSuggestionDiv_voiture,"AutoCompleteDivAct_voiture");
    var z;
    if(trouve) {
      z=getSuggestion_voiture(_highlightedSuggestionDiv_voiture).substr(0);
    } else {
      z=_currentInputFieldValue_voiture;
    }
    if(z!=_inputField_voiture.value){
      if(_inputField_voiture.value!=_currentInputFieldValue_voiture) {
        return;
      }
      // si on peut créer des range dans le document
      if(_inputField_voiture.createTextRange||_inputField_voiture.setSelectionRange) {
		_inputField_voiture.value=z;
		getSuggestionId_voiture(_highlightedSuggestionDiv_voiture);
      }
      // on sélectionne la fin de la suggestion
      if(_inputField_voiture.createTextRange){
        var t=_inputField_voiture.createTextRange();
        t.moveStart("character",_currentInputFieldValue_voiture.length);
        t.select()
      }else if(_inputField_voiture.setSelectionRange){
        _inputField_voiture.setSelectionRange(_currentInputFieldValue_voiture.length,_inputField_voiture.value.length)
      }
    }
  }else{
    // sinon, plus aucune suggestion de sélectionnée
    _highlightedSuggestionIndex_voiture=-1;
  }
}

var _cursorUpDownPressed_voiture = null;

// permet le blur du champ texte après que la touche haut/bas ai été pressé.
// le focus est récupéré après traitement (via le timeout).
function blurThenGetFocus_voiture(){
  _cursorUpDownPressed_voiture=true;
  _inputField_voiture.blur();
  setTimeout("_inputField_voiture.focus();",10);
  return
}

// taille de la selection dans le champ input
function rangeSize_voiture(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_voiture(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_voiture(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_voiture(uneDiv){
	if(!uneDiv) {
		return null;
	}

	V1 = trimCR_voiture(uneDiv.getElementsByTagName('span')[0].innerHTML);
	id_temp = uneDiv.getElementsByTagName('span')[0].id;
	id_temp = str_replace("spanSuggest","",id_temp);
	id_temp = parseInt(id_temp);
	
	V2 = str_replace("<B>","",V1);
	V3 = str_replace("<b>","",V2);
	V4 = str_replace("</B>","",V3);
	V5 = str_replace("</b>","",V4);
	return V5;
  
}
function getSuggestionId_voiture(uneDiv){
	if(!uneDiv) {
		return null;
	}

	V1 = trimCR_voiture(uneDiv.getElementsByTagName('span')[0].innerHTML);
	id_temp = uneDiv.getElementsByTagName('span')[0].id;
	id_temp = str_replace("spanSuggest","",id_temp);
	id_temp = parseInt(id_temp);
	return tabIdSpan_voiture[id_temp];
}

// supprime les caractères retour chariot et line feed d'une chaine de caractères
function trimCR_voiture(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
}

// Cache completement les choix de completion
function hideCompleteDiv_voiture(){
  	_completeDiv_voiture.style.display="none";
  /*
  leDiv = document.getElementById("monIFrame_voiture");
	leDiv.style.display = "none";
	*/
}

// Rends les choix de completion visibles
function showCompleteDiv_voiture(){
  _completeDiv_voiture.style.display="inline";
  setCompleteDivSize_voiture()
}

// Change la suggestion en surbrillance
function highlightNewValue_voiture(C){
  if(!_completeDivDivList_voiture||_completeDivRows_voiture<=0) {
    return;
  }
  showCompleteDiv_voiture();
  if(C>=_completeDivRows_voiture){
    C=_completeDivRows_voiture-1
  }
  if(_highlightedSuggestionIndex_voiture!=-1&&C!=_highlightedSuggestionIndex_voiture){
    setStylePourElement_voiture(_highlightedSuggestionDiv_voiture,"AutoCompleteDiv_voiture");
    _highlightedSuggestionIndex_voiture=-1
  }
  if(C<0){
    _highlightedSuggestionIndex_voiture=-1;
    _inputField_voiture.focus();
    return
  }
  _highlightedSuggestionIndex_voiture=C;
  _highlightedSuggestionDiv_voiture=_completeDivDivList_voiture.item(C);
  setStylePourElement_voiture(_highlightedSuggestionDiv_voiture,"AutoCompleteDivAct_voiture");
  _inputField_voiture.value=getSuggestion_voiture(_highlightedSuggestionDiv_voiture);
  updt_id_destination_voiture(getSuggestionId_voiture(_highlightedSuggestionDiv_voiture));
}

// Handler de resize de la fenetre
var onResizeHandler_voiture=function(event){
  // recalcule la taille des suggestions
  setCompleteDivSize_voiture();
}

// Handler de blur sur le champ texte
var onBlurHandler_voiture=function(event){
  
  if(!_cursorUpDownPressed_voiture){
    // si le blur n'est pas causé par la touche haut/bas
    hideCompleteDiv_voiture();
    // Si la dernière touche préssé est tab, on passe au bouton de validation
    if(_lastKeyCode_voiture==9){
      _lastKeyCode_voiture=-1
    }
  }
  _cursorUpDownPressed_voiture=false
};

// declenchee quand on clique sur une div contenant une possibilite
var divOnMouseUp_voiture=function(){
	
	_inputField_voiture.value=getSuggestion_voiture(this);
	updt_id_destination_voiture(getSuggestionId_voiture(this));
	hideCompleteDiv_voiture();
	_cursorUpDownPressed_voiture=false;
	setTimeout("_inputField_voiture.focus();",10);
};

// declenchee quand on passe sur une div de possibilite. La div précédente est passee en style normal
var divOnMouseOver_voiture=function(){
  if(_highlightedSuggestionDiv_voiture) {
    setStylePourElement_voiture(_highlightedSuggestionDiv_voiture,"AutoCompleteDiv_voiture");
  }
  setStylePourElement_voiture(this,"AutoCompleteDivAct_voiture")
};

// declenchee quand la sourie quitte une div de possiblite. La div repasse a l'etat normal
var divOnMouseOut_voiture = function(){
  setStylePourElement_voiture(this,"AutoCompleteDiv_voiture");
};

var divPrincipaleOnScroll_voiture = function() {
	//_cursorUpDownPressed=true;
}

var divPrincipaleOnMouseDown_voiture = function() {
	_cursorUpDownPressed_voiture=true;
}