AI.lightbox = function()
{
/*
---------------------------------------------------------------------------
  PRIVATE
---------------------------------------------------------------------------
*/
 var
  cE = AI.DOM.createElement,
  close = cE('span',{id:'lightbox-close', onclick:__hide__}),
  imageLoading = cE('img', {id:'lightbox-loading', src:'/css/lightbox-loading.gif'}),
  overlay = cE('div', {id:'lightbox-overlay', className:'cacher', "onclick":__hide__}, {}, [imageLoading]),
  contenuText = cE('div'), layoutInside = cE('div', {}, {},[contenuText]),
  lienImage = cE('a', {href:'#',target:'_blank'}),
  layout = cE('div', {id:'lightbox', className:'cacher'}, {}, [close, lienImage, layoutInside]),
  goPrev = cE('a', {href:'#',id:'lightbox-previous', className:'lightbox-navigation cacher', onclick:__previous__}),
  goNext = cE('a', {href:'#',id:'lightbox-next', className:'lightbox-navigation cacher', onclick:__next__}),
  allUrl = [], allLinks = [],
  current = null, currentLink = null;

 // charge la CSS
 AI.DOM.CSS.loadLink('/css/lightbox.css');
 
 function activate(U)
 {
  if ( currentLink != null ) { AI.DOM.CSS.remove('actif', currentLink); }
  current = U;
  currentLink = allLinks[allUrl.indexOf(U)];
  AI.DOM.CSS.add('actif', currentLink);
 }

 // init tout au chargement
 if( !AI.BROWSER.IE6 ) {
  AI.EVT.loader(
   function()
   {
    var tagsA = AI.DOM.getArrayByTags('a'), i;
    // remplace les liens <a> par des liens lightbox
    for ( i = 0; i < tagsA.length; i++ )
    {
     if ( AI.DOM.CSS.has('lightbox', tagsA[i]) )
     {
      tagsA[i].onclick = function () { return __show__(this.href); };
      allUrl.push(tagsA[i].href);
      allLinks.push(tagsA[i]);
     }
    }
    // construit le layout
    document.body.appendChild(overlay);
    document.body.appendChild(goPrev);
    document.body.appendChild(layout);
    document.body.appendChild(goNext);
   }
  );
 
  // event de dechargement
  AI.EVT.unloader(
   function()
   {
    close.onclick = null;
    overlay.onclick = null;
    goPrev.onclick = null;
    goNext.onclick = null;
   }
  );
 }
/*
---------------------------------------------------------------------------
  PROTECTED
---------------------------------------------------------------------------
*/
 function __show__(url)
 {
  var
   pos,
   vpH = AI.DOM.getViewportHeight(),
   vpW = AI.DOM.getViewportWidth(),
   scrollT = AI.DOM.getScrollTopSum(document.body),
   scrollL = AI.DOM.getScrollLeftSum(document.body),
   loadT = intval((vpH - imageLoading.height) / 2 + scrollT),
   loadL = intval((vpW - imageLoading.width) / 2 + scrollL);

  if ( !url ) { return false; }
  activate(url);

  function AJAXload(R)
  {
   var tmp = AI.AJAX.parse(R);
   if ( current == url)
   {
    if ( tmp && tmp.width && tmp.height && tmp.src !== '' )
    {
     AI.DOM.flush(lienImage);
     lienImage.href = tmp.src;
     contenuText.innerHTML = '';
     layoutInside.style.paddingTop = '0px';
     if ( tmp.contenu !== '' )
     {
      contenuText.innerHTML = tmp.contenu;
      AI.DOM.show(layoutInside);
      layoutInside.style.paddingTop = AI.DOM.CSS.getStyleInt(layout, 'paddingTop') + 'px';
     }
     var imageLightbox = AI.DOM.createElement('img', {id:'lightbox-image', src:tmp.src, width:tmp.width, height:tmp.height, title:tmp.libelle || ''});
     layoutInside.style.width = tmp.width+'px';
     lienImage.appendChild(imageLightbox);
     AI.DOM.CSS.setStyle(layout, {top:'-50000px',left:'0px'});
     AI.DOM.show(layout, goPrev, goNext);
     layout.style.left = intval( ( vpW - tmp.width ) / 2 + scrollL ) + 'px';
     layout.style.top = intval( ( vpH - ( contenuText.offsetHeight + tmp.height ) ) / 2 + scrollT ) + 'px';
     goPrev.style.top = intval( ( vpH - goPrev.offsetHeight ) / 2 + scrollT ) + 'px';
     goNext.style.top = intval( ( vpH - goNext.offsetHeight ) / 2 + scrollT ) + 'px';
     imageLightbox.onerror = function()
     {
      AI.console.error('Image introuvable');
      AI.console.html('Cliquez pour obtenir l\'<a href="' + url + '">image originale</a>');
      __hide__();
     };
    }
    else
    {
     AJAXerror(R);
    }
   }
  }
  function AJAXerror(R)
  {
   AI.console.error("Réponse serveur : " + R.responseText);
   AI.console.error("Erreur de lecture de l'image");
   AI.console.html('Cliquez pour obtenir l\'<a href="' + url + '">image originale</a>');
   __hide__();
  }

  pos = AI.DOM.position.get(document.body);
  AI.DOM.CSS.setStyle(overlay, {height:Math.max(AI.DOM.getViewportHeight(), pos.height)+'px', width:pos.width+'px'});
  AI.DOM.CSS.setStyle(imageLoading, {"top":loadT + 'px',"left":loadL + 'px'});
  AI.DOM.show(overlay);
  AI.DOM.hide(layout);
  AI.DOM.hide(layoutInside);

  // todo : trouver comment choisir le mode d'envoi (?AJAX=AJAX ou /AJAX/AJAX)
  AI.AJAX.send({"url":url + '/AJAX/AJAX',"onload":AJAXload,"onerror":AJAXerror});

  return false;
 }

 function __hide__()
 {
  AI.DOM.hide(layout, overlay, goPrev, goNext);
  return false;
 }

 function __previous__()
 {
  var
   prev = allUrl.getLast(),
   index = allUrl.indexOf(current);
  if ( index == -1 ) { return false; }
  else if ( index > 0 ) { prev = allUrl[index - 1]; }
  __show__(prev);
  return false;
 }

 function __next__()
 {
  var
   next = allUrl.getFirst(),
   index = allUrl.indexOf(current);

  try { goNext.blur(); } catch(e) {}
  if ( index == -1 ) { return false; }
  else if ( index < (allUrl.length - 1) ) { next = allUrl[index + 1]; }
  __show__(next);
  return false;
 }

/*
---------------------------------------------------------------------------
  PUBLIC
---------------------------------------------------------------------------
*/
 return {
  show:__show__, hide:__hide__,
  next:__next__, previous:__previous__
 };
}();
