/**********************************************************
** (C) Copyright CNI
** DESCRIPTION : Javacript Autocomplete Aeroports 
**********************************************************/

// retourne un objet xmlHttpRequest.
// méthode compatible entre tous les navigateurs (IE/Firefox/Opera)
var _documentForm2=null; // le formulaire contenant notre champ texte
var _inputField2=null; // le champ texte lui-même

function initAutoCompleteDest(form,field){
  _documentForm2=form;
  _inputField2=field;
 
  _inputField2.autocomplete="off";
  creeAutocompletionDiv2();
  _currentInputField2Value=_inputField2.value;
  _oldInputField2Value=_currentInputField2Value;
  cacheResults2("",new Array())
  _inputField2.onkeydown=onKeyDownHandler2;
  _inputField2.onkeyup=onKeyUpHandler2;
  _inputField2.onblur=onBlurHandler2;
  window.onresize=onResizeHandler2;
  // Premier déclenchement de la fonction dans 200 millisecondes
  setTimeout("mainLoop2()",200)
}


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


// tourne en permanence pour suggerer suite à un changement du champ texte
function mainLoop2(){
  if(_oldInputField2Value!=_currentInputField2Value){
	  selec2=false;
    var valeur=escapeURI2(_currentInputField2Value);
    var suggestions2=_resultCache2[_currentInputField2Value];
    if(suggestions2){ // la réponse était encore dans le cache
      metsEnPlace2(valeur,suggestions2)
    }else{
      callsuggestions2(valeur) // appel distant
    }
    _inputField2.focus()
  }
  _oldInputField2Value=_currentInputField2Value;
  setTimeout("mainLoop2()",200); // la fonction se redéclenchera dans 200 ms
  return true
}


// echappe les caractère spéciaux
function escapeURI2(La){

  if(encodeURIComponent) {
    return encodeURIComponent(La);
  }
  if(escape) {
    return escape(La)
  }
}

var http_request2 = null; //l'objet xmlHttpRequest utilisé pour contacter le serveur
var _adresseRecherche = "/ajax/AutoIata.php" //l'adresse à interroger pour trouver les suggestions

function callsuggestions2(valeur){
	document.getElementById('LoaderDest').display='';
   	var http_request2 = false;
	if (window.XMLHttpRequest) { //POUR MOZILLA
		http_request2 = new XMLHttpRequest();
		if (http_request2.overrideMimeType) {
			http_request2.overrideMimeType('text/xml');
		}
	} else if (window.ActiveXObject) { // POUR INTERNET EXPLORER
	
		try {
			http_request2 = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				http_request2 = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e) {}
		}
	}
	if (!http_request2) {
		alert('Giving up :( Cannot create an XMLHTTP instance');
		return false;
	}
	http_request2.onreadystatechange = function() { 
		if (http_request2.readyState == 4&&http_request2.responseXML) {
			var liste = traiteXmlsuggestions2(http_request2.responseXML,valeur);
			metsEnPlace2(valeur,liste);
			document.getElementById("LoaderDest").style.display='none';
		}
	};
	http_request2.open('GET', _adresseRecherche+"?nomville="+valeur, true);
	http_request2.send(null);
}


// Mecanisme de caching des réponses
function cacheResults2(debut,suggestions2){
  _resultCache2[debut]=suggestions2
}

// Transformation XML en tableau
function traiteXmlsuggestions2(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();
	valtemp  = valeur;
	valtemp = str_replace("%20"," ",valtemp);
	valtemp =valtemp.toUpperCase();
	if(txttemp.search(valtemp)!=-1) {
		//test pour savoir si pays (si pays : pas de parentheses dans la chaine)
		var parenthetical = "\\\(";
		if(txttemp.search(parenthetical)!=-1) {
			optionsListe.push(options[i].firstChild.data);
		}
	}
  }
  return optionsListe;

}


//insère une règle avec son nom
function insereCSS2(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 initStyle2(){
  var AutoCompleteDivListeStyle2="font-size:14px; font-family: arial,sans-serif; word-wrap:break-word;";
  var AutoCompleteDivStyle2="display:block; padding:2px; border-bottom:1px dotted #0087E1; overflow:hidden; background-color:#C6E7FF; cursor:pointer;";
  var AutoCompleteDivActStyle2="padding:2px; background-color:#0087E1; border-bottom:1px dotted #0087E1; color: #FFFFFF; cursor:pointer;";
  
  insereCSS2(".AutoCompleteDivListeStyle2",AutoCompleteDivListeStyle2);
  insereCSS2(".AutoCompleteDiv2",AutoCompleteDivStyle2);
  insereCSS2(".AutoCompleteDivAct2",AutoCompleteDivActStyle2);
}


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


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


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


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


// calcule la largeur du champ
function calculateWidth2(){
  return 350;
}


function setCompleteDivSize2(){
  if(_completeDiv2){
	  
    _completeDiv2.style.position = "absolute";
	_completeDiv2.style.margin = "5px 0 0 0";
    _completeDiv2.style.left=calculateOffsetLeft2(_inputField2)+"px";
    _completeDiv2.style.top=calculateOffsetTop2(_inputField2)+_inputField2.offsetHeight-1+"px";
    _completeDiv2.style.width=calculateWidth2()+"px"
	if(21*_completeDiv2Rows>200){
		_completeDiv2.style.height=200+"px";
	}else{
		_completeDiv2.style.height=21*(_completeDiv2Rows);
	}
  }
}


function creeAutocompletionDiv2() {
  initStyle2();
  _completeDiv2=document.createElement("DIV");
  _completeDiv2.id="completeDiv2";
  var borderLeftRight=1;
  var borderTopBottom=1;
  _completeDiv2.style.borderRight="#0087E1 "+borderLeftRight+"px solid";
  _completeDiv2.style.borderLeft="#0087E1 "+borderLeftRight+"px solid";
  _completeDiv2.style.borderTop="#0087E1 "+borderTopBottom+"px solid";
  _completeDiv2.style.borderBottom="#0087E1 "+borderTopBottom+"px solid";
  _completeDiv2.style.zIndex="2";
  _completeDiv2.style.paddingRight="0";

  _completeDiv2.style.paddingLeft="0";
  _completeDiv2.style.paddingTop="0";
  _completeDiv2.style.paddingBottom="0";
  setCompleteDivSize2();
  _completeDiv2.style.overflow="auto";
  _completeDiv2.style.overflowX="hidden";
  _completeDiv2.style.overflowY="auto";
  _completeDiv2.style.display="none";
  _completeDiv2.style.position="absolute";
  _completeDiv2.style.backgroundColor="#f5f5f5";
  _completeDiv2.onmousedown=divPrincipaleOnMouseDown2;
  //document.body.appendChild(_completeDiv2);

  document.body.appendChild(_completeDiv2);
  setStylePourElement2(_completeDiv2,"AutoCompleteDivListeStyle2");
}


function metsEnPlace2(valeur, liste){
  while(_completeDiv2.childNodes.length>0) {
    _completeDiv2.removeChild(_completeDiv2.childNodes[0]);
  }
  // mise en place des suggestions2
  for(var f=0; f<liste.length; ++f){
    var nouveauDiv=document.createElement("DIV");
	nouveauDiv.onmouseup=divOnMouseUp2;
    nouveauDiv.onmouseover=divOnMouseOver2;
    nouveauDiv.onmouseout=divOnMouseOut2;
    setStylePourElement2(nouveauDiv,"AutoCompleteDiv2");
    var nouveauSpan=document.createElement("SPAN");
	tmp2=liste[f];
	tmp2 = tmp2.replace(valeur.toUpperCase(),"<b>" + valeur.toUpperCase() + "</b>");
	tmp2 = tmp2.replace(valeur.toUcWords(),"<b>" + valeur.toUcWords() + "</b>");
	tmp2 = tmp2.replace(valeur.toLowerCase(),"<b>" + valeur.toLowerCase() + "</b>");
	tmp2 = tmp2.replace(valeur,"<b>" + valeur + "</b>");
	
    nouveauSpan.innerHTML=tmp2; // le texte de la suggestion
	
    nouveauDiv.appendChild(nouveauSpan);
    _completeDiv2.appendChild(nouveauDiv)
  }
  PressAction2();
  
  if(_completeDiv2Rows>0) {
    _completeDiv2.height=15*_completeDiv2Rows+4;
	showCompleteDiv2();
  } else {
    hideCompleteDiv2();
  }
}


var _lastKeyCode2=null;


// Handler pour le keydown du document
var onKeyDownHandler2=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) {
    _lastKeyCode2=event.keyCode;
  }
}


var _eventKeycode2 = null;


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


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


var _completeDiv2Rows = 0;
var _completeDiv2DivList = null;
var _highlightedSuggestionIndex2 = -1;
var _highlightedSuggestionDiv2 = null;


// gère une touche pressée autre que haut/bas/enter
function PressAction2(){
  _highlightedSuggestionIndex2=-1;
  var suggestionList=_completeDiv2.getElementsByTagName("DIV");
  var suggestionLongueur=suggestionList.length;
  // on stocke les valeurs précédentes
  // nombre de possibilités de complétion
  _completeDiv2Rows=suggestionLongueur;
  // possiblités de complétion
  _completeDiv2DivList=suggestionList;
  // si le champ est vide, on cache les propositions de complétion
  if(_currentInputField2Value==""||suggestionLongueur==0){
    hideCompleteDiv2()
  }else{
    showCompleteDiv2()
  }
  var trouve=false;
  // si on a du texte sur lequel travailler
  if(_currentInputField2Value.length>0){
    var indice;
    // T vaut true si on a dans la liste de suggestions2 un mot commencant comme l'entrée utilisateur
    for(indice=0; indice<suggestionLongueur; indice++){
      if(getSuggestion2(suggestionList.item(indice)).toUpperCase().indexOf(_currentInputField2Value.toUpperCase())==0) {
        trouve=true;
        break
      }
    }
  }
  // on désélectionne toutes les suggestions2
  for(var i=0; i<suggestionLongueur; i++) {
    setStylePourElement2(suggestionList.item(i),"AutoCompleteDiv2");
  }
  // 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){
    _highlightedSuggestionIndex2=indice;
    _highlightedSuggestionDiv2=suggestionList.item(_highlightedSuggestionIndex2);
  }else{
    _highlightedSuggestionIndex2=-1;
    _highlightedSuggestionDiv2=null
  }
  var supprSelection=false;
  switch(_eventKeycode2){
    // 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&&_highlightedSuggestionDiv2){
    setStylePourElement2(_highlightedSuggestionDiv2,"AutoCompleteDivAct2");
    var z;
    if(trouve) {
      z=getSuggestion2(_highlightedSuggestionDiv2).substr(0);
    } else {
      z=_currentInputField2Value;
    }
    if(z!=_inputField2.value){
      if(_inputField2.value!=_currentInputField2Value) {
        return;
      }
      // si on peut créer des range dans le document
      if(_inputField2.createTextRange||_inputField2.setSelectionRange) {
        _inputField2.value=z;
      }
      // on sélectionne la fin de la suggestion
      if(_inputField2.createTextRange){
        var t=_inputField2.createTextRange();
        t.moveStart("character",_currentInputField2Value.length);
        t.select()
      }else if(_inputField2.setSelectionRange){
        _inputField2.setSelectionRange(_currentInputField2Value.length,_inputField2.value.length)
      }
    }
  }else{
    // sinon, plus aucune suggestion de sélectionnée
    _highlightedSuggestionIndex2=-1;
  }
}


var _cursorUpDownPressed2 = 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 blurThenGetFocus2(){
  _cursorUpDownPressed2=true;
  _inputField2.blur();
  setTimeout("_inputField2.focus();",10);
  return
}


// taille de la selection dans le champ input
function rangeSize2(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 beforerangeSize2(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 cursorAfterValue2(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 getSuggestion2(uneDiv){
  if(!uneDiv) {
    return null;
  }
  
  	V1 = trimCR(uneDiv.getElementsByTagName('span')[0].innerHTML);
	V2 = str_replace("<B>","",V1);
	V3 = str_replace("<b>","",V2);
	V4 = str_replace("</B>","",V3);
	V5 = str_replace("</b>","",V4);
	return V5;
}


// supprime les caractères retour chariot et line feed d'une chaine de caractères
function trimCR2(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 hideCompleteDiv2(){
  _completeDiv2.style.display="none";
}


// Rends les choix de completion visibles
function showCompleteDiv2(){
  _completeDiv2.style.display="inline";

  setCompleteDivSize2()
}


// Change la suggestion en surbrillance
function highlightNewValue2(C){
  if(!_completeDiv2DivList||_completeDiv2Rows<=0) {
    return;
  }
  showCompleteDiv2();
  if(C>=_completeDiv2Rows){
    C=_completeDiv2Rows-1
  }
  if(_highlightedSuggestionIndex2!=-1&&C!=_highlightedSuggestionIndex2){
    setStylePourElement2(_highlightedSuggestionDiv2,"AutoCompleteDiv2");
    _highlightedSuggestionIndex2=-1
  }
  if(C<0){
    _highlightedSuggestionIndex2=-1;
    _inputField2.focus();
    return
  }
  _highlightedSuggestionIndex2=C;
  _highlightedSuggestionDiv2=_completeDiv2DivList.item(C);
  setStylePourElement2(_highlightedSuggestionDiv2,"AutoCompleteDivAct2");
  _inputField2.value=getSuggestion2(_highlightedSuggestionDiv2);
}


// Handler de resize de la fenetre
var onResizeHandler2=function(event){
  // recalcule la taille des suggestions2
  setCompleteDivSize2();
}


// Handler de blur sur le champ texte
var onBlurHandler2=function(event){
  if(!_cursorUpDownPressed2){
    // si le blur n'est pas causé par la touche haut/bas
    hideCompleteDiv2();
    // Si la dernière touche préssé est tab, on passe au bouton de validation
    if(_lastKeyCode2==9){
      _lastKeyCode2=-1
    }
  }
  _cursorUpDownPressed2=false
};
// declenchee quand on clique sur une div contenant une possibilite
var divOnMouseUp2=function(){
	_inputField2.value=getSuggestion2(this);
	hideCompleteDiv2();
	_cursorUpDownPressed2=false;
	setTimeout("_inputField2.focus();",10);
};
// declenchee quand on clique sur une div contenant une possibilite
var divOnMouseDown2=function(){
  _inputField2.value=getSuggestion2(this);
};


// declenchee quand on passe sur une div de possibilite. La div précédente est passee en style normal
var divOnMouseOver2=function(){
  if(_highlightedSuggestionDiv2) {
    setStylePourElement2(_highlightedSuggestionDiv2,"AutoCompleteDiv2");
  }
  setStylePourElement2(this,"AutoCompleteDivAct2")
};


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




var divPrincipaleOnScroll2 = function() {
	//_cursorUpDownPressed2=true;
}


var divPrincipaleOnMouseDown2 = function() {
	_cursorUpDownPressed2=true;
}