/*
  Manipulations DOM d'un document POM :
  
  - présentation virtuelle sous forme de diapos
  
  Copyright 2005 (C) Orphée Média
*/

/* 
  Présentation à la façon d'un diaporama.

  Si javascript est désactivé le diaporama est sous la forme d'une série de diapo 
  les unes en dessous des autres. Sinon c'est une présentation à la façon de S5 
  d'Eric Meyer (http://www.meyerweb.com/).
*/

// Indique la diapo en cours 

var slide = 0 ;
var nbrSlides = 0 ;
var nav = null ;



// compte le nombre de diapos

function countSlides ()
{
  var block = document.getElementById ('start-slides') ;

  nbrSlides = 0 ;

  if (block == null)
    return ;

  block = block.parentNode ;
  
  nbrSlides = 1 ;

  while (block)
  {
/*  
    if (block.firstChild.id == 'end-slides')
      break ;
*/
    block = block.nextSibling ;

    if (block)
    {
      if (block.tagName != 'DIV')
        block = block.nextSibling ;

      if (block)  
      {
        if (block.className.indexOf ('block') != -1)  
          nbrSlides ++ ;      
      }
    }        
  }
}

// fabrique un bouton

function makeButton (theId, theName, theFunc)
{
  var node = document.createElement ('button') ;
  node.setAttribute ('id',theId) ;

  var text = document.createTextNode (theName) ;
  node.appendChild (text) ;

  if (node.addEventListener)
    node.addEventListener ('click', theFunc, false)
  else if (node.attachEvent)
    node.attachEvent ('onclick', theFunc) ;   

  return (node) ;
}

// information sur le nombre de slides

function makeInfo ()
{
  var node = document.createElement ('span') ;
  node.setAttribute ('id','slide-pos') ; 
  
  var text = document.createTextNode (slide+1 + '/' + nbrSlides) ;
  node.appendChild (text) ;
  
  return (node) ;  
}


// barre de navigation pour le diaporama

function makeNav ()
{
  var node = document.createElement ('div') ;
  node.setAttribute ('id','slide-nav') ;
  node.appendChild (makeInfo ()) ;
  
  if (slide > 0)
    node.appendChild (makeButton ('prev-slide', 'Précédent',prevSlide)) ;
  if (slide < nbrSlides - 1)
    node.appendChild (makeButton ('next-slide', 'Suivant',nextSlide)) ;
    
  node.appendChild (makeButton ('end-slide', 'Mettre fin à la présentation',endSlide)) ;   

  return (nav = node) ;
}


// Navigation au clavier

function slideNav (e)
{
  if ((e.keyCode) && (nbrSlides))
  {
    switch (e.keyCode)
    {
      case (0x20) : /* espace */
        if (e ['shiftKey'] == false)
          nextSlide () ;
        else
          prevSlide () ;
        break ;
        
      case (0x1b) : /* escape */
        endSlide () ;
        exit () ;
    }
  }
  
  return (true) ;
}

function prevSlide ()
{
  if ((slide > 0) && (nbrSlides))
    slide -- ;

  if (nav != null)
  {
    nav.parentNode.removeChild (nav) ;
    nav = null ;
  }

  projection () ;
}

function nextSlide ()
{
  if ((slide < nbrSlides - 1) && (nbrSlides))
    slide ++ ;

  if (nav != null)
  {
    nav.parentNode.removeChild (nav) ;
    nav = null ;
  }

  projection () ;
}

function endSlide ()
{
  if (nav != null)
  {
    nav.parentNode.removeChild (nav) ;
    nav = null ;
  }

  document.location = '/' ;
}

function projection ()
{
  var start = document.getElementById ('start-slides') ;

  if (start == null)
    return ;

  countSlides () ;
    
  // Pour une présentation on élimine les élements : header, zone1, zone2, footer
  // afin de ne conserver que le ventre du document
  
  var zones = document.getElementsByTagName ('div') ;
  
  for (var i = 0 ; i < zones.length ; i++)
  {
    var zone = zones [i] ;

    // on élimine les choses inutiles dans la présentation
  
    if ((zone.className.indexOf ('footer') != -1) ||
        (zone.className.indexOf ('header') != -1) ||
        (zone.className.indexOf ('zone1') != -1) ||
        (zone.className.indexOf ('zone2') != -1))
    {      
      zone.style.display = 'none' ;
      zone.style.width = 0 ;
    }
    // virer le padding du conteneur englobant
    else if (zone.className.indexOf ('cols') != -1)
      zone.style.paddingLeft = zone.style.paddingRight = 0 ;
    // passer la zone centrale en max
    else if (zone.className.indexOf ('content-main') != -1)
    {
      zone.style.margin = 0 ;
      zone.style.width = '100%' ;
    }
    else if (zone.className.indexOf ('doc') != -1)
      zone.className += ' slides' ;    
  }       
  
  // on liste l'ensemble des diapos pour n'activer que celle qui est en cours
  var block = start.parentNode ;
  
  i = 0 ;
  
  while (1)
  {
    // dernière diapo ?
/*    
    if (block.firstChild.id == 'end-slides')
      break ;
*/      

    if (block.className.indexOf ('block') != -1)
    {
      if (slide == i) // diapo active
      {
        block.style.display = 'block' ;
        // ajout des boutons de navigation
        block.appendChild (makeNav ()) ;
      }
      else // on n'affiche pas
        block.style.display = 'none' ;
    } 

    block = block.nextSibling ;
    
    if (block)
    {
      if (block.tagName != 'DIV')
        block = block.nextSibling ;
    }
    
    i ++ ;

    // garde fou si #end-slides n'est pas présent
    if (block == null)
      break ;
  }
}

// On utilise un listener plutôt que de mettre un onload="" dans le html
if (window.addEventListener)
{
  window.addEventListener ('load', projection, false) ;
  window.addEventListener ('keydown', slideNav, false) ;
}
else if (window.attachEvent)
{
  window.attachEvent ('onload', projection) ;   
  window.attachEvent ('onkeydown',slideNav) ;     
}
 
 
