/**
 * 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";

/**
 * 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

      }
    } // 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



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

    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';
      }

      //alert(panel.clientWidth);
      /*if (inputField.clientWidth > panel.clientWidth) {
        iframe.style.width = (inputField.clientWidth + 3) + 'px';
        panel.style.width = inputField.clientWidth + '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;
                                     };

    //alert('inputField.id : ' + inputField.id);
    //return false;

    //var XHRresponse = getXHRReponse();

    if (data['results'] && data['results'][0]) {
        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)';
            dataId = 0;

            var trueField = inputField.id.replace('-dummy', '');
            if (option_infos[trueField]) {
               dataId = option_infos[trueField];
            }

            if (typeof data['mask'] == 'string') {
              mask = data['mask'];
              for (kl in option_infos) {
                if (dataId == 0) {
                  dataId = option_infos[kl];
                }
                mask = mask.replace(kl, option_infos[kl]);
              }
              a.innerHTML = mask;

            } else {
              titleList = [];
              for (kl in option_infos) {
                  if (dataId == 0) {
                    dataId = option_infos[kl];
                  }
                  titleList.push(option_infos[kl]);
                  kl++;
              }
              a.innerHTML = titleList.join(' ');
            }

            a.className = 'lien#' + dataId;
            a.onclick = funcReturnValue;
            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 + 3) + 'px';
          panel.style.width = inputField.clientWidth + 'px';

        } else {
          frame.style.width = (panel.clientWidth + 3) + '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 ville_id = link.className.split('#')[1];

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

    inputField.value  = selected_text;
    inputField.parentNode.lastChild.value = ville_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()
{
    DBG_msg('SearchList: running XHR search', 'info');
    this.parentNode.lastChild.value = -1;

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

    } else {
        toggleSearchPanel(searchHide, this);
    }

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


