/**
 * Liste déroulante de recherche AJAX
 * Appelle la page d'origine pour obtenir les résultats de la recherche
 * Fourni l'expression saisie et l'id du champ lu
 *
 * Affiche la liste des résultats (label1:id1, label2:id2, etc.)
 */

addListenner(window, "load", addSearchListEventListener, true);
var searchDisplay = "block";
var searchHide    = "none";
var searchList_timer = false;

/**
 * Remplace les champs 'search-list' par de nouveaux champs
 */
function addSearchListEventListener()
{
  DBG_msg('SearchList: Adding Search list js...', 'info');
  var varList;
  var hiddenValue;
  var hidden;
  var iframe;
  var panel;

  // permet d'éviter que les click de souris sur le calque ne le fasse disparaître
  var funcBubble = function(evt) {
                      if (window.event)
                          window.event.cancelBubble = true;
                          return true;
                   };

  if(document.getElementById) {
    var inputs 	   = document.getElementsByTagName('input');
    for (var i=0; i < inputs.length; i++) {
      if (/search-list/.test(inputs[i].className)) {
          inputs[i].parentNode.getElementsByTagName('label')[0].setAttribute('for', inputs[i].id + '-dummy');

          // Valeur du champ caché
          varList = inputs[i].parentNode.getElementsByTagName('var');
          hiddenValue = -1;
          for (var j=0; j < varList.length; j++) {
            if (/value/.test(varList[j].className)) {
              hiddenValue = varList[j].innerHTML;
            }
          }

          // Calque contenant le champ input visible et l'autre, caché
          inputs[i].parentNode.id = 'search-list-' + i;

          // Champ caché contenant l'identifiant des données cherchées
          hidden   = document.createElement('input');
          hidden.id    = inputs[i].id;
          hidden.name  = hidden.id;
          hidden.type  = 'hidden';
          hidden.value = hiddenValue;
          inputs[i].parentNode.appendChild(hidden);

          // Champ texte contenant le label du contenu cherché
          inputs[i].id  += '-dummy';
          inputs[i].name = inputs[i].id;
          //inputs[i].onkeyup = runSearch; // Sur appui d'une touche, on met à jour la recherche
          inputs[i].onkeyup = waitToSearch;

      }
    } // end for

    // Ajout d'une iframe pour cacher les selects (bug/fonctionnalité IE)
    iframe    = document.createElement('iframe');
    iframe.id     = 'searchlist-frame';
    iframe.name   = iframe.id;
    iframe.setAttribute('name', iframe.id);
    iframe.className = 'list-frame';
    document.getElementsByTagName('body')[0].appendChild(iframe);

    // Calque contenant la liste des résultats
    panel            = document.createElement('div');
    panel.onclick    = funcBubble;
    panel.className  = 'list-panel';
    panel.id         = 'searchlist-panel';
    panel.appendChild(document.createElement('ul'));
    document.getElementsByTagName('body')[0].appendChild(panel);
  }
  DBG_msg('SearchList: Done.', 'info');
  return true;
} // end of the "addSearchListEventListener()" function




/**
 * waitToSearch
 */
 function waitToSearch(e) {
    var oField = this;
    if (oField.oRunSearch) {
        clearTimeout(oField.oRunSearch);
    }
    oField.oRunSearch = setTimeout(function() { runSearch(oField.id, e); return true; }, 400);
 } // end of "waitToSearch()"


/**
 * Affiche la liste (et la positionne) ou la cache
 */
function toggleSearchPanel(visibility, inputField)
{
    var panel            = getObjById('searchlist-panel');
    var iframe           = getObjById('searchlist-frame');
    panel.style.display  = visibility;
    iframe.style.display = visibility;

    if (visibility == 'block' && inputField) {
      var hideaction = function () { return toggleSearchPanel(searchHide); };
      document.onclick = hideaction;
      var coordonnees = getPosition(inputField, false);
      var offset = 0;
      if (inputField.clientHeight) {
        offset = inputField.clientHeight + 4;
      }

      if (coordonnees.x && coordonnees.y) {
          iframe.style.left = coordonnees.x + 'px';
          iframe.style.top = (coordonnees.y + offset) + 'px';
          panel.style.left = coordonnees.x + 'px';
          panel.style.top = (coordonnees.y + offset) + 'px';
      }
  }

  panel.style.display  = visibility;
  iframe.style.display = visibility;
  //DBG_msg('toggleSearchPanel: panel.style.left = ' + panel.style.left + ' , panel.style.top = ' + panel.style.top, 'info');

  return true;
} // end of the "toggleSearchPanel()" function




/**
 * Appelé par un évènement XHR, lit la réponse
 * et rafraîchit le contenu de la liste
 *
 */
function refreshContent(data, inputField)
{
    //toggleSearchPanel(searchDisplay, inputField);
    //DBG_msg('SearchList: refreshing content', 'info');
    //element = 0;
    var panel = getObjById('searchlist-panel');
    var frame = getObjById('searchlist-frame');
    var funcReturnValue = function() {
                                        setFieldValue(this, inputField);
                                        return true;
                                     };


    //var XHRresponse = getXHRReponse();

    if (data['results'] != '') {
        var ul = document.createElement('ul');
        var a, li, kl, option_infos, titleList;

        // Créé le code de la liste déroulante : <li><a class="lien#id">label</a></li>
        var resultLength = 0;
        for (j in data['results']) {
            resultLength++;
            option_infos = data['results'][j];
            a = document.createElement('a');
            a.href = 'javascript:void(0)';
            a.className = 'lien#' + option_infos[0];
            a.onclick = funcReturnValue;
            kl = 1;
            titleList = [];
            while (option_infos[kl]) {
                  titleList.push(option_infos[kl]);
                  kl++;
            }
            a.innerHTML = titleList.join(' ');
            li = document.createElement('li');
            li.appendChild(a);
            ul.appendChild(li);
        }
        var ullist = panel.getElementsByTagName('ul');
        var oldul = ullist[0];
        oldul.parentNode.replaceChild(ul, oldul);

        // Réglage des dimensions du panel et de l'iframe
        if (resultLength > 8) {
            panel.style.height   = '14em';
            panel.style.overflow = 'auto';

        } else {
            panel.style.height   = "auto";
            panel.style.overflow = 'visible';
        }

        /*frame.style.width = 'auto';
        panel.style.width = 'auto';*/

        if (panel.clientHeight) {
          frame.style.height = (panel.clientHeight + 1) + 'px';
        }

        if (inputField.clientWidth > panel.clientWidth) {
          frame.style.width = (inputField.clientWidth) + 'px';
          panel.style.width = inputField.clientWidth + 'px';

        } else {
          frame.style.width = (panel.clientWidth) + 'px';
          panel.style.width = panel.clientWidth + 'px';
        }


   // Lorsqu'il n'y a pas de réponse, on affiche un message
   } else {
       //DBG_msg('SearchList: no XHRResponse', 'alert');
        var ul = document.createElement('ul');
        var li = document.createElement('li');
        li.appendChild(document.createTextNode('pas de résultats'));
        ul.appendChild(li);
        var ullist = panel.getElementsByTagName('ul');
        var oldul = ullist[0];
        oldul.parentNode.replaceChild(ul, oldul);
        panel.style.height   = "auto";
        panel.style.overflow = 'visible';
        frame.style.width = (inputField.clientWidth + 3) + 'px';
        panel.style.width = inputField.clientWidth + 'px';

        if (panel.clientHeight) {
          frame.style.height = (panel.clientHeight + 1) + 'px';
        }
   }

   toggleSearchPanel(searchDisplay, inputField);
} // end of the "refreshContent()" function


/**
 * Lors d'un clic sur un lien de la liste, cette fonction est appelée
 * et enregistre le label et l'identifiant dans les champs réservés
 */
function setFieldValue(link, inputField)
{
    var id = link.className.split('#')[1];
    	id = trim(id.replace(/<[\/\!]*?[^<>]*?>/gi, ''));

    var selected_text = link.innerHTML;
    selected_text     = trim(selected_text.replace(/<[\/\!]*?[^<>]*?>/gi, ''));
    DBG_msg('SearchList: setting Field Value (' + selected_text + ', ' + id + ')', 'info');

    inputField.value  = selected_text;
    inputField.parentNode.lastChild.value = id;

    toggleSearchPanel(searchHide, inputField);

    return true;
} // end of the "setFieldValue()" function




/**
 * Place un évènement XHR qui va afficher et rafraîchir la liste
 *
 */
function runSearch(inputId)
{
    var obj = document.getElementById(inputId);
    //DBG_msg('SearchList: running XHR search', 'info');
    obj.parentNode.lastChild.value = 0;

    if (obj.value && (obj.value.length > 2)) {
      var inputField = obj;
      //attachXHREvent("POST", aQueryData, document.location.href, func);
      XHR_post(null, {"getInfos" : obj.id, "search" : obj.value}, function (data) { return refreshContent(data, inputField);})

    } else {
        toggleSearchPanel(searchHide, obj);
    }

    return false;
} // end of the "runSearch()" function


