/**
 * Bibliothèque de fonctions pour l'animation des blocs de menu
 *
 * @author J-S.CONAN - Eskape (c) 2006
 * @version 1.0
 * @date aug 2006
 */

// table des menus affichés dans les blocs
document.blocmenus = new Array();

// délai d'attente entre deux étapes du déroulement
document.menudelay = 1;

// déroule un bloc de menu
function afficherMenu(id, iter, dx)
{
  if( !dx ) dx = 1;
  if( document.blocmenus[id]._etat == 1 ) return;
  document.blocmenus[id]._etat = -1;
  if( iter && iter > 0 )
  {
    for(var i = 0; i < dx; i++)
    {
      iter--;
      if( iter < 0 )
      {
        iter = 0;
        break;
      }
      if( document.blocmenus[id]._active == document.blocmenus[id][iter] )
        afficherBloc(document.blocmenus[id][iter]);
      else
      {
        var el = document.getElementById(document.blocmenus[id][iter]);
        if( el ) el.style.display = "block";
      }
    }
    if( iter <= 0 ) document.blocmenus[id]._etat = 1;
    else setTimeout("afficherMenu('" + id + "'," + iter + "," + dx + ")", document.menudelay);
  }
  else document.blocmenus[id]._etat = 1;
}

// enroule un bloc de menu
function cacherMenu(id, iter, no, dx)
{
  if( !dx ) dx = 1;
  if( document.blocmenus[id]._etat == 0 )return;
  document.blocmenus[id]._etat = -1;
  if( (iter >= 0) && (iter < document.blocmenus[id].length) )
  {
    for(var i = 0; i < dx; i++)
    {
      if( iter >= document.blocmenus[id].length ) break;
      cacherBloc(document.blocmenus[id][iter], no);
      iter++;
    }
    if( iter >= document.blocmenus[id].length ) document.blocmenus[id]._etat = 0;
    else setTimeout("cacherMenu('" + id + "'," + iter + "," + no + "," + dx + ")", document.menudelay);
  }
  else document.blocmenus[id]._etat = 0;
}

// affiche un élément de menu, ainsi que ses sous-menus, sans déroulement
function afficherBloc(id, no)
{
  var el;
  if( typeof(document.blocmenus[id]) != "undefined" )
  {
    for(var i = 0; i < document.blocmenus[id].length; i++)
    {
      el = document.getElementById(document.blocmenus[id][i]);
      if( el ) el.style.display = "block";
    }
    document.blocmenus[id]._etat = 1;
  }
  var el = document.getElementById(id);
  if( el ) el.style.display = "block";
  if( !no ) selectMenu(id, true);
}

// cache un élément de menu, ainsi que ses sous-menus, sans déroulement
function cacherBloc(id, no)
{
  var el, ids;
  if( typeof(document.blocmenus[id]) != "undefined" )
  {
    for(var i = 0; i < document.blocmenus[id].length; i++)
      cacherBloc(document.blocmenus[id][i], no);
    document.blocmenus[id]._etat = 0;
  }
  var el = document.getElementById(id);
  if( el ) el.style.display = "none";
  if( !no ) selectMenu(id, false);
}

// enroule le menu actif tout en déroulant le menu sur lequel l'utilisateur a cliqué
// fonctionne comme un bouton radio
function changeBloc(id, idS, iterS, idH, iterH, dx)
{
  var cmdS = "'" + idS + "',0";
  var cmdH = "0,0";
  var cmd;
  
  if( !dx ) dx = 1;

  if( document.blocmenus[idS]._etat != 1 )
  {
    document.blocmenus[idS]._etat = -1;
    if( iterS && (iterS > 0) )
    {
      for(var i = 0; i < dx; i++)
      {
        iterS--;
        if( iterS < 0 )
        {
          iterS = 0;
          break;
        }
        var el = document.getElementById(document.blocmenus[idS][iterS]);
        if( el ) el.style.display = "block";
      }
      if( iterS <= 0 ) document.blocmenus[idS]._etat = 1;
      else cmdS = "'" + idS + "'," + iterS;
    }
    else document.blocmenus[idS]._etat = 1;
  }

  if( (idH != "") && (document.blocmenus[idH]._etat != 0) )
  {
    document.blocmenus[idH]._etat = -1;
    if( (iterH >= 0) && (iterH < document.blocmenus[idH].length) )
    {
      for(var i = 0; i < dx; i++)
      {
        if( iterH >= document.blocmenus[idH].length ) break;
        cacherBloc(document.blocmenus[idH][iterH], 1);
        iterH++;
      }
      if( iterH >= document.blocmenus[idH].length )document.blocmenus[idH]._etat = 0;
      else cmdH="'" + idH + "'," + iterH;
    }
    else document.blocmenus[idH]._etat = 0;
  }

  cmd = "'" + id +"'," + cmdS + "," + cmdH;
  if( cmd != "'" + id + "','" + idS + "',0,0,0") setTimeout("changeBloc(" + cmd + "," + dx + ")", document.menudelay);
  else document.blocmenus[id]._active = idS;
}

// traite les clics sur les menus
function clicMenu(id)
{
  dx = getMenuDX(document.blocmenus[id].length);
  if( document.blocmenus[id]._etat == 1 ) cacherMenu(id, 0, null, dx);
  else if( document.blocmenus[id]._etat == 0 ) afficherMenu(id, document.blocmenus[id].length, dx);
}

// traite les clics sur les menus 'radios'
function clicChangeMenu(id, idm)
{
  dx = getMenuDX(document.blocmenus[id].length);
  if( document.blocmenus[id]._active == idm ) document.blocmenus[id]._active = 0;
  if( document.blocmenus[id]._active )
  {
    selectMenu(document.blocmenus[id]._active, false);
    selectMenu(idm, true);
    if( typeof(document.blocmenus[ document.blocmenus[id]._active ]) == "undefined" )
      document.blocmenus[id]._active = 0;
    changeBloc(id, idm, document.blocmenus[idm].length, document.blocmenus[id]._active, 0, dx);
  }
  else
  {
    if(document.blocmenus[idm]._etat == 1)
    {
      cacherMenu(idm, 0, 1, dx);
      document.blocmenus[id]._active = 0;
      selectMenu(idm, false);
    }
    else
    {
      if( document.blocmenus[idm]._etat == 0 )
        afficherMenu(idm, document.blocmenus[idm].length, dx);
      document.blocmenus[id]._active = idm;
      selectMenu(idm, true);
    }
  }
}

// change le style d'une entrée de menu pour la rendre active
function selectMenu(id, etat)
{
  var el = document.getElementById(id);
  if( el )
  {
    el.className = el.className.replace(/\s*-select\s*/, "");
    if( etat ) el.className += "-select";
  }
}

// initialisation à la création d'un nouveau bloc
function initBloc(id, etat)
{
  document.blocmenus[id] = new Array();
  document.blocmenus[id]._etat = etat;
  document.blocmenus[id]._active = 0;
}

// initialisation à la création d'une nouvelle entrée de menu
function ajoutMenuBloc(id, idm, active, selected)
{
  document.blocmenus[id][document.blocmenus[id].length] = idm;
  if( active ) setActive(id, idm);
}

// enregistre un menu actif
function setActive(id, idm)
{
  document.blocmenus[id]._active = idm;
}

// détermine la vitesse d'animation en nombre de lignes affichées/masquées par cycles
function getMenuDX(length)
{
  /*if( length <= 4 ) return 1;       // vitesse minimale
  else if( length <= 8 ) return 2;
  else if( length <= 12 ) return 3;
  else if( length <= 16 ) return 4;*/
  return Math.ceil(length / 4);
}
