// retourne un objet xmlHttpRequest.
// méthode compatible entre tous les navigateurs (IE/Firefox/Opera)
function getXMLHTTP_recherche_artiste(){
  var xhr_recherche_artiste=null;
  if(window.XMLHttpRequest) // Firefox et autres
  xhr_recherche_artiste = new XMLHttpRequest();
  else if(window.ActiveXObject){ // Internet Explorer
    try {
      xhr_recherche_artiste = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xhr_recherche_artiste = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e1) {
        xhr_recherche_artiste = null;
      }
    }
  }
  else { // XMLHttpRequest non supporté par le navigateur
    alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
  }
  return xhr_recherche_artiste;
}

var _documentForm_recherche_artiste=null; // le formulaire contenant notre champ texte
var _inputField_recherche_artiste=null; // le champ texte lui-même

function initAutoComplete_recherche_artiste(form,field){
  _documentForm_recherche_artiste=form;
  _inputField_recherche_artiste=field;
  _inputField_recherche_artiste.autocomplete="off";
  creeAutocompletionDiv_recherche_artiste();
  _currentInputFieldValue_recherche_artiste=_inputField_recherche_artiste.value;
  _oldInputFieldValue_recherche_artiste=_currentInputFieldValue_recherche_artiste;
  cacheResults_recherche_artiste("",new Array())
  document.onkeydown=onKeyDownHandler_recherche_artiste;
  _inputField_recherche_artiste.onkeyup=onKeyUpHandler_recherche_artiste;
  _inputField_recherche_artiste.onblur=onBlurHandler_recherche_artiste;
  window.onresize=onResizeHandler_recherche_artiste;
  // Premier déclenchement de la fonction dans 200 millisecondes
  setTimeout("mainLoop_recherche_artiste()",200)
}

var _oldInputFieldValue_recherche_artiste=""; // valeur précédente du champ texte
var _currentInputFieldValue_recherche_artiste=""; // valeur actuelle du champ texte
var _resultCache_recherche_artiste=new Object(); // mécanisme de cache des requetes

// tourne en permanence pour suggerer suite à un changement du champ texte
function mainLoop_recherche_artiste(){
  if((_oldInputFieldValue_recherche_artiste!=_currentInputFieldValue_recherche_artiste)&&(_currentInputFieldValue_recherche_artiste.length>2)){
    var valeur_recherche_artiste=escapeURI(_currentInputFieldValue_recherche_artiste);
    var suggestions_recherche_artiste=_resultCache_recherche_artiste[_currentInputFieldValue_recherche_artiste];
    if(suggestions_recherche_artiste){ // la réponse était encore dans le cache
      metsEnPlace_recherche_artiste(valeur_recherche_artiste,suggestions_recherche_artiste)
    }else{
      callSuggestions_recherche_artiste(valeur_recherche_artiste) // appel distant
    }
    _inputField_recherche_artiste.focus()
  }
  _oldInputFieldValue_recherche_artiste=_currentInputFieldValue_recherche_artiste;
  setTimeout("mainLoop_recherche_artiste()",200); // la fonction se redéclenchera dans 200 ms
  return true
}

// echappe les caractère spéciaux
function escapeURI(La){
  if(encodeURIComponent) {
    return encodeURIComponent(La);
  }
  if(escape) {
    return escape(La)
  }
}

var _xmlHttp_recherche_artiste = null; //l'objet xmlHttpRequest utilisé pour contacter le serveur
var _adresseRecherche_recherche_artiste = "ajax_liste_artiste.asp" //l'adresse à interroger pour trouve_recherche_artister les suggestions

function callSuggestions_recherche_artiste(valeur){
  if(_xmlHttp_recherche_artiste&&_xmlHttp_recherche_artiste.readyState!=0){
    _xmlHttp_recherche_artiste.abort()
  }
  _xmlHttp_recherche_artiste=getXMLHTTP_recherche_artiste();
  if(_xmlHttp_recherche_artiste){
    //appel à l'url distante
    _xmlHttp_recherche_artiste.open("GET",_adresseRecherche_recherche_artiste+"?debut="+valeur,true);
    _xmlHttp_recherche_artiste.onreadystatechange=function() {
      if(_xmlHttp_recherche_artiste.readyState==4) {
        var liste = traiteXmlSuggestions_recherche_artiste(_xmlHttp_recherche_artiste.responseText)
        cacheResults_recherche_artiste(valeur,liste)
        metsEnPlace_recherche_artiste(valeur,liste)
      }
    };
    // envoi de la requete
    _xmlHttp_recherche_artiste.send(null)
  }
}

// Mecanisme de caching des réponses
function cacheResults_recherche_artiste(debut,suggestions){
  _resultCache_recherche_artiste[debut]=suggestions
}

// Transformation XML en tableau
function traiteXmlSuggestions_recherche_artiste(xmlDoc) {
  var options_recherche_artiste = xmlDoc;
  var optionsListe_recherche_artiste = new Array();
  optionsListe_recherche_artiste = options_recherche_artiste.split(";");
  return optionsListe_recherche_artiste;
}

//insère une règle avec son nom
function insereCSS_recherche_artiste(nom,regle){
  if (document.styleSheets) {
    var I_recherche_artiste=document.styleSheets[0];
    if(I_recherche_artiste.addRule){ // méthode IE
      I_recherche_artiste.addRule(nom,regle)
    }else if(I_recherche_artiste.insertRule){ // méthode DOM
      I_recherche_artiste.insertRule(nom+" { "+regle+" }",I_recherche_artiste.cssRules.length)
    }
  }
}

function initStyle_recherche_artiste(){
  var AutoCompleteDivListeStyle_recherche_artiste="font-size: 13px; font-family: arial,sans-serif; word-wrap:break-word; ";
  var AutoCompleteDivStyle_recherche_artiste="display: block; padding-left: 3; padding-right: 3; height: 16px; overflow: hidden; background-color: white;";
  var AutoCompleteDivActStyle_recherche_artiste="background-color: #3366cc; color: white ! important; ";
  insereCSS_recherche_artiste(".AutoCompleteDivListeStyle_recherche_artiste",AutoCompleteDivListeStyle_recherche_artiste);
  insereCSS_recherche_artiste(".AutoCompleteDiv",AutoCompleteDivStyle_recherche_artiste);
  insereCSS_recherche_artiste(".AutoCompleteDivAct",AutoCompleteDivActStyle_recherche_artiste);
}

function setStylePourElement_recherche_artiste(c,name){
  c.className=name;
}

// calcule le décalage à gauche
function calculateOffsetLeft_recherche_artiste(r){
  return calculateOffset_recherche_artiste(r,"offsetLeft")
}

// calcule le décalage vertical
function calculateOffsetTop_recherche_artiste(r){
  return calculateOffset_recherche_artiste(r,"offsetTop")
}

function calculateOffset_recherche_artiste(r,attr){
  var kb_recherche_artiste=0;
  while(r){
    kb_recherche_artiste+=r[attr];
    r=r.offsetParent
  }
  return kb_recherche_artiste
}

// calcule la largeur du champ
function calculateWidth_recherche_artiste(){
  return _inputField_recherche_artiste.offsetWidth-2*1
}

function setCompleteDivSize_recherche_artiste(){
  if(_completeDiv_recherche_artiste){
    _completeDiv_recherche_artiste.style.left=calculateOffsetLeft_recherche_artiste(_inputField_recherche_artiste)+"px";
    _completeDiv_recherche_artiste.style.top=calculateOffsetTop_recherche_artiste(_inputField_recherche_artiste)+_inputField_recherche_artiste.offsetHeight-1+"px";
    _completeDiv_recherche_artiste.style.width=calculateWidth_recherche_artiste()+"px"
  }
}

function creeAutocompletionDiv_recherche_artiste() {
  initStyle_recherche_artiste();
  _completeDiv_recherche_artiste=document.createElement("DIV");
  _completeDiv_recherche_artiste.id="completeDiv";
  var borderLeftRight=1;
  var borderTopBottom=1;
  _completeDiv_recherche_artiste.style.borderRight="black "+borderLeftRight+"px solid";
  _completeDiv_recherche_artiste.style.borderLeft="black "+borderLeftRight+"px solid";
  _completeDiv_recherche_artiste.style.borderTop="black "+borderTopBottom+"px solid";
  _completeDiv_recherche_artiste.style.borderBottom="black "+borderTopBottom+"px solid";
  _completeDiv_recherche_artiste.style.zIndex="1";
  _completeDiv_recherche_artiste.style.paddingRight="0";
  _completeDiv_recherche_artiste.style.paddingLeft="0";
  _completeDiv_recherche_artiste.style.paddingTop="0";
  _completeDiv_recherche_artiste.style.paddingBottom="0";
  setCompleteDivSize_recherche_artiste();
  _completeDiv_recherche_artiste.style.visibility="hidden";
  _completeDiv_recherche_artiste.style.position="absolute";
  _completeDiv_recherche_artiste.style.backgroundColor="white";
  document.body.appendChild(_completeDiv_recherche_artiste);
  setStylePourElement_recherche_artiste(_completeDiv_recherche_artiste,"AutoCompleteDivListeStyle_recherche_artiste");
}

function metsEnPlace_recherche_artiste(valeur, liste){
  while(_completeDiv_recherche_artiste.childNodes.length>0) {
    _completeDiv_recherche_artiste.removeChild(_completeDiv_recherche_artiste.childNodes[0]);
  }
  // mise en place des suggestions
  for(var f=0; f<liste.length; ++f){
    var nouveauDiv_recherche_artiste=document.createElement("DIV");
    nouveauDiv_recherche_artiste.onmousedown=divOnMouseDown_recherche_artiste;
    nouveauDiv_recherche_artiste.onmouseover=divOnMouseOver_recherche_artiste;
    nouveauDiv_recherche_artiste.onmouseout=divOnMouseOut_recherche_artiste;
    setStylePourElement_recherche_artiste(nouveauDiv_recherche_artiste,"AutoCompleteDiv");
    var nouveauSpan_recherche_artiste=document.createElement("SPAN");
    nouveauSpan_recherche_artiste.innerHTML=liste[f]; // le texte de la suggestion
    nouveauDiv_recherche_artiste.appendChild(nouveauSpan_recherche_artiste);
    _completeDiv_recherche_artiste.appendChild(nouveauDiv_recherche_artiste)
  }
  PressAction_recherche_artiste();
  if(_completeDivRows_recherche_artiste>0) {
    _completeDiv_recherche_artiste.height=16*_completeDivRows_recherche_artiste+4;
  } else {
    hideCompleteDiv_recherche_artiste();
  }

}

var _lastKeyCode_recherche_artiste=null;

// Handler pour le keydown du document
var onKeyDownHandler_recherche_artiste=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_recherche_artiste=event.keyCode;
  }
}

var _eventKeycode_recherche_artiste = null;

// Handler pour le keyup de lu champ texte
var onKeyUpHandler_recherche_artiste=function(event){
  // accès evenement compatible IE/Firefox
  if(!event&&window.event) {
    event=window.event;
  }
  _eventKeycode_recherche_artiste=event.keyCode;
  // Dans les cas touches touche haute(38) ou touche basse (40)
  if(_eventKeycode_recherche_artiste==40||_eventKeycode_recherche_artiste==38) {
    // on autorise le blur du champ (traitement dans onblur)
    blurThenGetFocus_recherche_artiste();
  }
  // taille de la selection
  var N_recherche_artiste=rangeSize_recherche_artiste(_inputField_recherche_artiste);
  // taille du texte avant la selection (selection = suggestion d'autocomplétion)
  var v_recherche_artiste=beforeRangeSize_recherche_artiste(_inputField_recherche_artiste);
  // contenu du champ texte
  var V_recherche_artiste=_inputField_recherche_artiste.value;
  if(_eventKeycode_recherche_artiste!=0){
    if(N_recherche_artiste>0&&v_recherche_artiste!=-1) {
      // on recupere uniquement le champ texte tapé par l'utilisateur
      V_recherche_artiste=V_recherche_artiste.substring(0,v_recherche_artiste);
    }
    // 13 = touche entrée
    if(_eventKeycode_recherche_artiste==13||_eventKeycode_recherche_artiste==3){
      var d=_inputField_recherche_artiste;
      // on mets en place l'ensemble du champ texte en repoussant la selection
      if(_inputField_recherche_artiste.createTextRange){
        var t=_inputField_recherche_artiste.createTextRange();
        t.moveStart("character",_inputField_recherche_artiste.value.length);
        _inputField_recherche_artiste.select()
      } else if (d.setSelectionRange){
        _inputField_recherche_artiste.setSelectionRange(_inputField_recherche_artiste.value.length,_inputField_recherche_artiste.value.length)
      }
    } else {
      // si on a pas pu agrandir le champ non selectionné, on le mets en place violemment.
     // if(_inputField_recherche_artiste.value!=V_recherche_artiste) {
      //  _inputField_recherche_artiste.value=V_recherche_artiste
     // }
    }
  }
  // si la touche n'est ni haut, ni bas, on stocke la valeur utilisateur du champ
  if(_eventKeycode_recherche_artiste!=40&&_eventKeycode_recherche_artiste!=38) {
    // le champ courant n est pas change si key Up ou key Down
  	_currentInputFieldValue_recherche_artiste=V_recherche_artiste;
  }
  if(handleCursorUpDownEnter_recherche_artiste(_eventKeycode_recherche_artiste)&&_eventKeycode_recherche_artiste!=0) {
    // si on a préssé une touche autre que haut/bas/enter
    PressAction_recherche_artiste();
  }
}

// Change la suggestion selectionné.
// cette méthode traite les touches haut, bas et enter
function handleCursorUpDownEnter_recherche_artiste(eventCode){
  if(eventCode==40){
    highlightNewValue_recherche_artiste(_highlightedSuggestionIndex_recherche_artiste+1);
    return false
  }else if(eventCode==38){
    highlightNewValue_recherche_artiste(_highlightedSuggestionIndex_recherche_artiste-1);
    return false
  }else if(eventCode==13||eventCode==3){
    return false
  }
  return true
}

var _completeDivRows_recherche_artiste = 0;
var _completeDivDivList_recherche_artiste = null;
var _highlightedSuggestionIndex_recherche_artiste = -1;
var _highlightedSuggestionDiv_recherche_artiste = null;

// gère une touche pressée autre que haut/bas/enter
function PressAction_recherche_artiste(){
  _highlightedSuggestionIndex_recherche_artiste=-1;
  var suggestionList_recherche_artiste=_completeDiv_recherche_artiste.getElementsByTagName("div");
  var suggestionLongueur_recherche_artiste=suggestionList_recherche_artiste.length;
  // on stocke les valeurs précédentes
  // nombre de possibilités de complétion
  _completeDivRows_recherche_artiste=suggestionLongueur_recherche_artiste;
  // possiblités de complétion
  _completeDivDivList_recherche_artiste=suggestionList_recherche_artiste;
  // si le champ est vide, on cache les propositions de complétion
  if(_currentInputFieldValue_recherche_artiste==""||suggestionLongueur_recherche_artiste==0){
    hideCompleteDiv_recherche_artiste()
  }else{
    showCompleteDiv_recherche_artiste()
  }
  var trouve_recherche_artiste=false;
  // si on a du texte sur lequel travailler
  if(_currentInputFieldValue_recherche_artiste.length>0){
    var indice_recherche_artiste;
    // T vaut true si on a dans la liste de suggestions un mot commencant comme l'entrée utilisateur
    for(indice_recherche_artiste=0; indice_recherche_artiste<suggestionLongueur_recherche_artiste; indice_recherche_artiste++){
      if(getSuggestion_recherche_artiste(suggestionList_recherche_artiste.item(indice_recherche_artiste)).toUpperCase().indexOf(_currentInputFieldValue_recherche_artiste.toUpperCase())==0) {
        trouve_recherche_artiste=true;
        break
      }
    }
  }
  // on désélectionne toutes les suggestions
  for(var i=0; i<suggestionLongueur_recherche_artiste; i++) {
    setStylePourElement_recherche_artiste(suggestionList_recherche_artiste.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_recherche_artiste){
    _highlightedSuggestionIndex_recherche_artiste=indice_recherche_artiste;
    _highlightedSuggestionDiv_recherche_artiste=suggestionList_recherche_artiste.item(_highlightedSuggestionIndex_recherche_artiste);
  }else{
    _highlightedSuggestionIndex_recherche_artiste=-1;
    _highlightedSuggestionDiv_recherche_artiste=null
  }
  var supprSelection_recherche_artiste=false;
  switch(_eventKeycode_recherche_artiste){
    // 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_recherche_artiste=true;
      break;
    default:
      break
  }
  // si on a une suggestion (n-1) sélectionnée
  if(!supprSelection_recherche_artiste&&_highlightedSuggestionDiv_recherche_artiste){
    setStylePourElement_recherche_artiste(_highlightedSuggestionDiv_recherche_artiste,"AutoCompleteDivAct");
    var z_recherche_artiste;
    if(trouve_recherche_artiste) {
      z_recherche_artiste=getSuggestion_recherche_artiste(_highlightedSuggestionDiv_recherche_artiste).substr(0);
    } else {
      z_recherche_artiste=_currentInputFieldValue_recherche_artiste;
    }
    if(z_recherche_artiste!=_inputField_recherche_artiste.value){
      if(_inputField_recherche_artiste.value!=_currentInputFieldValue_recherche_artiste) {
        return;
      }
      // si on peut créer des range dans le document
      if(_inputField_recherche_artiste.createTextRange||_inputField_recherche_artiste.setSelectionRange) {
        _inputField_recherche_artiste.value=z_recherche_artiste;
      }
      // on sélectionne la fin de la suggestion
      if(_inputField_recherche_artiste.createTextRange){
        var t_recherche_artiste=_inputField_recherche_artiste.createTextRange();
        t_recherche_artiste.moveStart("character",_currentInputFieldValue_recherche_artiste.length);
        t_recherche_artiste.select()
      }else if(_inputField_recherche_artiste.setSelectionRange){
        _inputField_recherche_artiste.setSelectionRange(_currentInputFieldValue_recherche_artiste.length,_inputField_recherche_artiste.value.length)
      }
    }
  }else{
    // sinon, plus aucune suggestion de sélectionnée
    _highlightedSuggestionIndex_recherche_artiste=-1;
  }
}

var _cursorUpDownPressed_recherche_artiste = 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_recherche_artiste(){
  _cursorUpDownPressed_recherche_artiste=true;
  _inputField_recherche_artiste.blur();
  setTimeout("_inputField_recherche_artiste.focus();",10);
  return
}

// taille de la selection dans le champ input
function rangeSize_recherche_artiste(n){
  var N_recherche_artiste=-1;
  if(n.createTextRange){
    var fa=document.selection.createRange().duplicate();
    N_recherche_artiste=fa.text.length
  }else if(n.setSelectionRange){
    N_recherche_artiste=n.selectionEnd-n.selectionStart
  }
  return N_recherche_artiste
}

// taille du champ input non selectionne
function beforeRangeSize_recherche_artiste(n){
  var v_recherche_artiste=0;
  if(n.createTextRange){
    var fa_recherche_artiste=document.selection.createRange().duplicate();
    fa_recherche_artiste.moveEnd("textedit",1);
    v_recherche_artiste=n.value.length-fa_recherche_artiste.text.length
  }else if(n.setSelectionRange){
    v_recherche_artiste=n.selectionStart
  }else{
    v_recherche_artiste=-1
  }
  return v_recherche_artiste
}

// Place le curseur à la fin du champ
function cursorAfterValue_recherche_artiste(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_recherche_artiste(uneDiv){
  if(!uneDiv) {
    return null;
  }
    if(uneDiv.getElementsByTagName('span')[0].firstChild){
   		return trimCR_recherche_artiste(uneDiv.getElementsByTagName('span')[0].firstChild.data);
  }else{
   		return "";
  }
}

// supprime les caractères retour chariot et line feed d'une chaine de caractères
function trimCR_recherche_artiste(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_recherche_artiste(){
  _completeDiv_recherche_artiste.style.visibility="hidden"
}

// Rends les choix de completion visibles
function showCompleteDiv_recherche_artiste(){
 if(_currentInputFieldValue_recherche_artiste.length>2){
 	 _completeDiv_recherche_artiste.style.visibility="visible";
  	 setCompleteDivSize_recherche_artiste()
 }
}

// Change la suggestion en surbrillance
function highlightNewValue_recherche_artiste(C){
  if(!_completeDivDivList_recherche_artiste||_completeDivRows_recherche_artiste<=0) {
    return;
  }
  showCompleteDiv_recherche_artiste();
  if(C>=_completeDivRows_recherche_artiste){
    C=_completeDivRows_recherche_artiste-1
  }
  if(_highlightedSuggestionIndex_recherche_artiste!=-1&&C!=_highlightedSuggestionIndex_recherche_artiste){
    setStylePourElement_recherche_artiste(_highlightedSuggestionDiv_recherche_artiste,"AutoCompleteDiv");
    _highlightedSuggestionIndex_recherche_artiste=-1
  }
  if(C<0){
    _highlightedSuggestionIndex_recherche_artiste=-1;
    _inputField_recherche_artiste.focus();
    return
  }
  _highlightedSuggestionIndex_recherche_artiste=C;
  _highlightedSuggestionDiv_recherche_artiste=_completeDivDivList_recherche_artiste.item(C);
  setStylePourElement_recherche_artiste(_highlightedSuggestionDiv_recherche_artiste,"AutoCompleteDivAct");
  _inputField_recherche_artiste.value=getSuggestion_recherche_artiste(_highlightedSuggestionDiv_recherche_artiste);
}

// Handler de resize de la fenetre
var onResizeHandler_recherche_artiste=function(event){
  // recalcule la taille des suggestions
  setCompleteDivSize_recherche_artiste();
}

// Handler de blur sur le champ texte
var onBlurHandler_recherche_artiste=function(event){
  if(!_cursorUpDownPressed_recherche_artiste){
    // si le blur n'est pas causé par la touche haut/bas
    hideCompleteDiv_recherche_artiste();
    // Si la dernière touche préssé est tab, on passe au bouton de validation
  }
  _cursorUpDownPressed_recherche_artiste=false
};

// declenchee quand on clique sur une div contenant une possibilite
var divOnMouseDown_recherche_artiste=function(){
  _inputField_recherche_artiste.value=getSuggestion_recherche_artiste(this);
  //_documentForm.submit()
};

// declenchee quand on passe sur une div de possibilite. La div précédente est passee en style normal
var divOnMouseOver_recherche_artiste=function(){
  if(_highlightedSuggestionDiv_recherche_artiste) {
    setStylePourElement_recherche_artiste(_highlightedSuggestionDiv_recherche_artiste,"AutoCompleteDiv");
  }
  setStylePourElement_recherche_artiste(this,"AutoCompleteDivAct")
};

// declenchee quand la sourie quitte une div de possiblite. La div repasse a l'etat normal
var divOnMouseOut_recherche_artiste = function(){
  setStylePourElement_recherche_artiste(this,"AutoCompleteDiv");
};






