﻿
var PZ = {
  ready: false,
  slides: [],
  full_width: null,
  full_height: null,
  ratio: null,
  slide_width: null,
  slide_height: null,
  slide_fs: null,
  domSlides: null,
  domBacks: null,
  this_slide: 0,
  last_slide: 0,
  pre_slide: null,

  imgs: null,
  imgs_loaded: 0,
  imgs_total: 0,

  blackScreen: false,
  key_blocked: false,


  /* Prepara todo para una presentación fluida:
   */
  init: function(){
    var cl, b, bl;
    PZ.domSlides = $$('div.slide');
    PZ.domBacks  = $$('div.background');
    PZ.last_slide = PZ.domSlides.length-1;

    PZ.domSlides.forEach(function(s){
      // Encuentro los fondos de las diapositivas
      // Se supone que la segunda clase de la slide coincide con la de su background
      cl = s.className.split(' ');
      if (cl.length > 1){
        bl = PZ.domBacks.filterByClass(cl[1]);
        b = bl[0];
      };
      PZ.slides.push({'s':s, 'b':b});
      s.style.display = 'none';
    });

    // Go meta
    PZ.getMetaInfo();
    PZ.resizeToRatio();

    // Creo y lleno el índice
    PZ.makeIndex();

    //Loading...
    PZ.loadImgs();
  },


  /* Set the width/height of the slides according
   * to the defined aspect ratio.
   * ---
   * Pone el ancho/alto de las diapositivas segón
   * la proporción definida. */
  resizeToRatio: function() {
    if (!PZ.ratio){
      PZ.getMetaInfo();
    }

    var size = window.getSize().size;
    var slide_w, slide_h, fs;

    // The height is the limit if width > height*ratio
    if ( size.x > size.y* PZ.ratio ){
      slide_h = size.y;
      slide_w = Math.floor(size.y * PZ.ratio);
      fs = (size.y*100/PZ.full_height);
    }
    // The width is the limit
    else{
      slide_w = size.x;
      slide_h = Math.floor(size.x / PZ.ratio)
      fs = parseInt((size.x*100/PZ.full_width)*10)/10;
    }

    // Set the CSS
    var styles = {
      'width': slide_w + 'px',
      'height': slide_h + 'px',
      'marginLeft': Math.round((size.x-slide_w)/2) + 'px',
      'marginTop': Math.round((size.y-slide_h)/2) + 'px',
      'fontSize': fs + '%'
    };
    $('pz_content').setStyles(styles);
    PZ.slide_width = slide_w;
    PZ.slide_height = slide_h;
    PZ.slide_fs = fs;

    //Extraigo las transiciones de diapositivas
    for (var i=0, s; s=PZ.domSlides[i]; i++){
      b = PZ.domBacks[i];
      var t = PZ.makeTransitionFunc(s, b, i)
      PZ.slides[i].t = t;
    }
  },


  /* */
  makeTransitionFunc: function(s, b, num){
    var tss = PZ.getTransition(s);
    var ts_in = tss[0];
    var ts_out = tss[1];
    if (!ts_in){
      ts_in = ['appear', 0, Fx.Transitions.linear];
    }

    // IN
    var dataIn = { duration: parseInt(ts_in[1]), unit:'%', transition:ts_in[2] };

    dataIn.onStart = function(){
      if (PZ.pre){
        PZ.pre.s.setStyles({
          display:'block',
          opacity:1,
          zIndex: (ts_out) ? 5 : 1
        });
        PZ.pre.b.setStyles({
          display:'block',
          opacity:1,
          zIndex: (ts_out) ? 4 : 0
        });
      }
      s.setStyles({
        display: 'block',
        left: 0, top: 0,
        width: '100%', height: '100%',
        fontSize: '100%',
        opacity: 0, visibility: 'visible', zIndex: 3
      });
      b.setStyles({
        display: 'block',
        left: 0, top: 0,
        width: '100%', height: '100%',
        fontSize: '100%',
        opacity: 0, visibility: 'visible', zIndex: 2
      });
    };

    dataIn.onComplete = function(){
      if (PZ.pre){
        PZ.pre.s.setStyles({
          display: 'none',
          left: 0, top: 0,
          width: '100%', height: '100%',
          fontSize: '100%',
          opacity: 1, visibility: 'visible', zIndex: 1
        });
        PZ.pre.b.setStyles({
          display: 'none',
          left: 0, top: 0,
          width: '100%', height: '100%',
          fontSize: '100%',
          opacity: 1, visibility: 'visible', zIndex: 0
        });
        PZ.pre = null;
      }
      s.style.zIndex = 1;
      b.style.zIndex = 0;
    };

    dataIn.onCancel = function(){
      if (PZ.pre && (PZ.pre.s != s)){
        PZ.pre.s.setStyles({
          display: 'none',
          left: 0, top: 0,
          width: '100%', height: '100%',
          fontSize: '100%',
          opacity: 1, visibility: 'visible', zIndex: 1
        });
        PZ.pre.b.setStyles({
          display: 'none',
          left: 0, top: 0,
          width: '100%', height: '100%',
          fontSize: '100%',
          opacity: 1, visibility: 'visible', zIndex: 0
        });
      }
      s.setStyles({
        display: 'block',
        left: 0, top: 0,
        width: '100%', height: '100%',
        fontSize: '100%',
        opacity: 1, visibility: 'visible', zIndex: 1
      });
      b.setStyles({
        display: 'block',
        left: 0, top: 0,
        width: '100%', height: '100%',
        fontSize: '100%',
        opacity: 1, visibility: 'visible', zIndex: 0
      });
    };

    var efIn;

    switch (ts_in[0]){
      case 'unfade':
      case 'fade':
        efIn = {
          opacity:[0, 1]
        };
        break;
      case 'zoom_in':
        efIn = {
          fontSize: [0, 100],
          width: [0, 100],
          height: [0, 100],
          left: [50, 0],
          top: [50, 0],
          opacity: [1, 1]
        };
        break;
      case 'zoom_out':
        efIn = {
          fontSize: [400, 100],
          width: [400, 100],
          height: [400, 100],
          left: [-150, 0],
          top: [-150, 0],
          opacity: [1, 1]
        };
        break;
      case 'stretch_l':
        efIn = {
          width: [0, 100],
          opacity: [1, 1]
        };
        break;
      case 'stretch_r':
        efIn = {
          left: [100, 0],
          width: [0, 100],
          opacity: [1, 1]
        };
        break;
      case 'stretch_t':
        efIn = {
          height: [0, 100],
          opacity: [1, 1]
        };
        break;
      case 'stretch_b':
        efIn = {
          top: [100, 0],
          height: [0, 100],
          opacity: [1, 1]
        };
        break;
      case 'slide_l':
        efIn = {
          left: [-100, 0],
          opacity: [1, 1]
        };
        break;
      case 'slide_r':
        efIn = {
          left: [100, 0],
          opacity: [1, 1]
        };
        break;
      case 'slide_t':
        efIn = {
          top: [-100, 0],
          opacity: [1, 1]
        };
        break;
      case 'slide_b':
        efIn = {
          top: [100, 0],
          opacity: [1, 1]
        };
        break;
      case 'slide_tl':
        efIn = {
          left: [-100, 0],
          top: [-100, 0],
          opacity: [1, 1]
        };
        break;
      case 'slide_tr':
        efIn = {
          left: [100, 0],
          top: [-100, 0],
          opacity: [1, 1]
        };
        break;
      case 'slide_bl':
        efIn = {
          left: [-100, 0],
          top: [100, 0],
          opacity: [1, 1]
        };
        break;
      case 'slide_br':
        efIn = {
          left: [100, 0],
          top: [100, 0],
          opacity: [1, 1]
        };
        break;
      default: //'appear':
        efIn = {
          opacity:[1, 1]
        };
        break;
    }

    var changesIn = {
      '0': efIn,
      '1': efIn
    };

    // OUT

    if (ts_out){
      var dataOut = { duration: parseInt(ts_out[1]), unit:'%', transition:ts_out[2] };

      dataOut.onComplete = function(){
        if (PZ.pre){
          PZ.pre.s.setStyles({
            display: 'none',
            left: 0, top: 0,
            width: '100%', height: '100%',
            fontSize: '100%',
            opacity: 1, visibility: 'visible', zIndex: 1
          });
          PZ.pre.b.setStyles({
            display: 'none',
            left: 0, top: 0,
            width: '100%', height: '100%',
            fontSize: '100%',
            opacity: 1, visibility: 'visible', zIndex: 0
          });
          PZ.pre = null;
        }
      };

      var efOut;

      switch (ts_out[0]){
        case 'disappear':
          efOut = {
            opacity:[0, 0]
          };
          break;
        case 'fade':
          efOut = {
            opacity:[1, 0]
          };
          break;
        case 'zoom_in':
          efOut = {
            fontSize: [100, 400],
            width: [100, 400],
            height: [100, 400],
            left: [0, -150],
            top: [0, -150],
            opacity: [1, 1]
          };
          break;
        case 'zoom_out':
          efOut = {
            fontSize: [100, 0],
            width: [100, 0],
            height: [100, 0],
            left: [0, 50],
            top: [0, 50],
            opacity: [1, 1]
          };
          break;
        case 'stretch_r':
          efOut = {
            width: [100, 0],
            opacity: [1, 1]
          };
          break;
        case 'stretch_l':
          efOut = {
            left: [0, 100],
            width: [100, 0],
            opacity: [1, 1]
          };
          break;
        case 'stretch_b':
          efOut = {
            height: [100, 0],
            opacity: [1, 1]
          };
          break;
        case 'stretch_t':
          efOut = {
            top: [0, 100],
            height: [100, 0],
            opacity: [1, 1]
          };
          break;
        case 'slide_r':
          efOut = {
            left: [0, -100],
            opacity: [1, 1]
          };
          break;
        case 'slide_l':
          efOut = {
            left: [0, 100],
            opacity: [1, 1]
          };
          break;
        case 'slide_b':
          efOut = {
            top: [0, -100],
            opacity: [1, 1]
          };
          break;
        case 'slide_t':
          efOut = {
            top: [0, 100],
            opacity: [1, 1]
          };
          break;
        case 'slide_br':
          efOut = {
            left: [0, -100],
            top: [0, -100],
            opacity: [1, 1]
          };
          break;
        case 'slide_bl':
          efOut = {
            left: [0, 100],
            top: [0, -100],
            opacity: [1, 1]
          };
          break;
        case 'slide_tr':
          efOut = {
            left: [0, -100],
            top: [0, 100],
            opacity: [1, 1]
          };
          break;
        case 'slide_tl':
          efOut = {
            left: [0, 100],
            top: [0, 100],
            opacity: [1, 1]
          };
          break;
        default: //'disappear':
          efOut = {
            opacity:[0, 0]
          };
          break;
      }

      var changesOut = {
        '0': efOut,
        '1': efOut
      };

    }
    else{
      var changesOut = null;
    }

    // FX

    var fxIn = new Fx.Elements([s, b], dataIn);

    var func = function(st){
      //Función fantasma
      var fxOut = {
        start:function(){ return { chain:function(f){f();} } },
        stop:function(){}
      };

      if (PZ.this_slide != num){
        PZ.pre = PZ.slides[PZ.this_slide];
        if (ts_out){
          fxOut = new Fx.Elements([PZ.pre.s, PZ.pre.b], dataOut);
        }
      }

      if (st){
        fxOut.stop();
        fxIn.stop();
      }
      else{
        if (ts_in[3]){ //¿Ejecutar en cadena?
          fxOut.start(changesOut).chain(function(){;
            fxIn.start(changesIn);
          });
        }
        else{
          fxOut.start(changesOut);
          fxIn.start(changesIn);
        }
      }
    };

    return func;
  },


  /* */
  getTransition: function(slide){
    var lclas = slide.className.replace(/\s+/g, ' ').trim().split(' ');
    var i, c;
    var ts_in = null;
    var ts_out = null;
    var ts = ['', 'appear', 800];

    for (i=0; c = lclas[i]; i++){
      if ('ts.' == c.substring(0,3)){
        ts = c.split('.');
      }
    }

    if (ts){
      //Corrijo antigo formato de transiciones
      if (isNaN(parseInt(ts[3]))){
        var b = ts.slice(0,3);
        b.push(0);
        ts = b;
      }
      switch (ts[1]){
        case 'train_t':
        case 'train_l':
        case 'train_r':
        case 'train_b':
          var anim = 'slide' + ts[1].substring(5,8);
          ts_in = [anim, ts[2], Fx.Transitions.Quad.easeOut];
          ts_out = [anim, ts[3], Fx.Transitions.Quad.easeOut];
          break;
        case 'train_z':
          ts_in = ['zoom_in', ts[2], Fx.Transitions.Quad.easeOut];
          ts_out = ['zoom_in', ts[3], Fx.Transitions.Quad.easeOut];
          break;
        case 'cube_t':
        case 'cube_l':
        case 'cube_r':
        case 'cube_b':
          var anim = 'stretch' + ts[1].substring(4,7);
          ts_in = [anim, ts[2], Fx.Transitions.Quad.easeOut];
          ts_out = [anim, ts[3], Fx.Transitions.Quad.easeOut];
          break;
        case 'szoom_t':
        case 'szoom_l':
        case 'szoom_r':
        case 'szoom_b':
          var anim2 = 'slide' + ts[1].substring(5,8);
          ts_in = ['zoom_in', ts[2], Fx.Transitions.Quad.easeOut];
          ts_out = [anim2, ts[3], Fx.Transitions.Quad.easeOut];
          break;
        case 'pikpuk_tl':
        case 'pikpuk_tr':
        case 'pikpuk_bl':
        case 'pikpuk_br':
        case 'pikpuk_lt':
        case 'pikpuk_lb':
        case 'pikpuk_rt':
        case 'pikpuk_rb':
          var anim1 = 'slide_' + ts[1].substring(7,8);
          var anim2 = 'slide_' + ts[1].substring(8,9);
          ts_in = [anim1, ts[2], Fx.Transitions.Quad.easeOut, true]; //Chain it
          ts_out = [anim2, ts[3], Fx.Transitions.Cubic.easeIn];
          break;
        case 'unfadeb':
        case 'bfade':
          ts_in = ['unfade', ts[2], Fx.Transitions.Quad.easeOut];
          ts_out = ['disappear', 0, Fx.Transitions.linear];
          break;
        default:
          ts_in = [ts[1], ts[2], Fx.Transitions.Quad.easeOut];
          ts_out = null;
      }
    }

    return [ts_in, ts_out];
  },



  /* Show the slide number 'num' and its custom background,
   * hiding everything else.
   * ---
   * Muestra la diapositiva número 'num' y su fondo asociado,
   * escondiendo todo lo demás.
   * */
  showSlide: function(num, noTrans){
    $('pz_index').style.display = 'none';
    $('pz_indexBk').style.display = 'none';
    if (noTrans || PZ.pre){
      if (PZ.this_slide != num){
        var pre_slide = PZ.slides[PZ.this_slide];
        pre_slide.s.setStyles({display:'none', zIndex:1});
        pre_slide.b.setStyles({display:'none', zIndex:0});
      }
      PZ.this_slide = num;
      var slide = PZ.slides[num];
      slide.s.style.display = 'block';
      slide.b.style.display = 'block';
    }
    else{
      PZ.slides[num].t();
    }
    PZ.this_slide = num;

    //TO-DO: Animation, sound, take over the world, etc.

    document.body.focus();
  },


  /* Genera 'al vuelo' el índice de diapositivas usando el
   * primer <h1> encontrado en cada diapositiva. Si no se
   * encuentra ningón <h1>, el rótulo será el número de
   * diapositiva.
   */
  makeIndex: function(){
    // Create the index
    var pzIndex = new Element('div');
    pzIndex.id = 'pz_index';
    pzIndex.innerHTML = '<ol></ol>';
    pzIndex.injectTop(document.body);
    var pzIndexBack = new Element('div');
    pzIndexBack.id = 'pz_indexBk';
    pzIndexBack.injectTop(document.body);
    pzIndexBack.setStyle('opacity', 0.7);

    // Fill the index
    var titleList = $$('#pz_index ol')[0];
    var ss = $$('div.slide');

    for (var i=0,s; s=ss[i]; i++){
      if (s.hasClass('noidx')){
        continue;
      }
      var li = new Element('li');
      var t = s.getElement('h1');
      var link = (i+1) + '. ' + ((t) ? t.innerHTML : '');
      var a = new Element('a');
      a.setAttribute('href', '#'+i+'');
      a.innerHTML = link;
      li.appendChild(a);
      titleList.appendChild(li);
      a.addEvent('click', function(e){
          e = new Event(e).stop();
          var num = this.href.split('#')[1];
          PZ.showSlide(parseInt(num));
        });

    };

    pzIndex.addEvent('click', function(e){
        e = new Event(e).stop();
      });

    pzIndex.style.display = 'none';
    pzIndexBack.style.display = 'none';
  },


  /* Extrae la información definida en las etiquetas meta.
   * 'full-size': Tamaño original de las diapositivas (por defecto 1024x768).
   * */
  getMetaInfo: function(){
    var s = '1024x768';
    var metatags = document.getElementsByTagName("meta");
    for (var i=0,meta; meta=metatags[i]; i++){
      if ('full-size' == meta.getAttribute("name")){
        s = meta.getAttribute("content");
        break;
      }
    }
    s = s.split('x');
    PZ.full_width = parseInt(s[0]);
    PZ.full_height = parseInt(s[1]);
    PZ.ratio = PZ.full_width / PZ.full_height;
  },


  /* Set the image loading counter.
   * */
  loadImgs: function(){
    /* Reemplazo las imágenes de la barra de menu por otras
     * que aguanten a IE6 */
    if (window.ie6){
      $$('#pz_menu img').each(function(im){
        im.src = im.src.substring(0, im.src.length-4) + '_ie6.png';
      });
    }

    PZ.imgs = [];
    for (var i=0,item; item=document.images[i]; i++){
      PZ.imgs.push(item);
    }
    PZ.imgs_total = PZ.imgs.length;
    $('pz_totImg').innerHTML = PZ.imgs_total;

    if (PZ.imgs_total){
      PZ.imgs.each(function(im){
        var pzImg = new Image();
        pzImg = $(pzImg);
        pzImg.setAttribute('src', im.src);
      });
      setTimeout(PZ.checkImgs, 250);
    }
    else{ //No hay imágenes
      PZ.ready = true;
      window.removeEvent('domready', PZ.init);
      PZ.setListeners();

      // Obtengo la slide de inicio y la cargo
      var dir = window.location.href;
      var i = dir.search(/\?s=/);
      if (i > 0){
        var num = parseInt(dir.substring(i+3));
        if (isNaN(num)){
          num = 0;
        }
      }
      else{
        var num = 0;
      }
      PZ.showSlide(num);

      $('pz_loadingMsg').remove();
      PZ.resizeToRatio();
    }
  },

  checkImgs: function(){
    PZ.imgs_loaded = 0;
    for (var i=0, img; img=PZ.imgs[i]; i++){
      if (img.complete){
        PZ.imgs_loaded += 1;
      }
    }
    $('pz_curImg').innerHTML = PZ.imgs_loaded;
    if (PZ.imgs_loaded >= PZ.imgs_total){
      PZ.imgReady();
    }
    else{
      PZ.imgs_loaded = 0;
      setTimeout(PZ.checkImgs, 250);
    }
  },

  /* Fire when an image finish to load
   * */
  imgReady: function(){
    if (!PZ.ready){
      PZ.ready = true;
      window.removeEvent('domready', PZ.init);
      PZ.setListeners();

      // Obtengo la slide de inicio y la cargo
      var dir = window.location.href;
      var i = dir.search(/\?s=/);
      if (i > 0){
        var num = parseInt(dir.substring(i+3));
        if (isNaN(num)){
          num = 0;
        }
      }
      else{
        var num = 0;
      }
      PZ.showSlide(num);

      $('pz_loadingMsg').style.display = 'none';
      PZ.resizeToRatio();
    };
    return false;
  },


  /* Next slide.
   * ---
   * Siguiente diapositiva.
   * */
  next: function(){
    $('pz_index').style.display='none';
    $('pz_indexBk').style.display = 'none';
    $('pz_help').style.display = 'none';
    $('pz_helpBk').style.display = 'none';
    if (PZ.this_slide+1 <= PZ.last_slide){
      PZ.showSlide(PZ.this_slide+1);
    }
  },


  /* Previous slide.
   * ---
   * Diapositiva anterior.
   * */
  prev: function(){
    $('pz_index').style.display='none';
    $('pz_indexBk').style.display = 'none';
    $('pz_help').style.display = 'none';
    $('pz_helpBk').style.display = 'none';
    if (PZ.this_slide-1 >= 0){
      PZ.showSlide(PZ.this_slide-1, true);
    }
  },


  /* Pone/Quita la pantalla en negro
   * */
  toggleBlackScreen: function(){
    $('pz_index').style.display = 'none';
    $('pz_indexBk').style.display = 'none';
    $('pz_menu').style.display = 'none';
    $('pz_menuBk').style.display = 'none';
    $('pz_help').style.display = 'none';
    $('pz_helpBk').style.display = 'none';
    var this_slide = PZ.slides[PZ.this_slide];
    if (PZ.blackScreen){
      this_slide.s.style.display = 'block';
      this_slide.b.style.display = 'block';
    }
    else{
      this_slide.s.style.display = 'none';
      this_slide.b.style.display = 'none';
    }
    PZ.blackScreen = !PZ.blackScreen;
  },


  /* Set the event listeners
   * */
  setListeners: function(){
    window.addEvent('resize', PZ.resizeToRatio);
    var pst = $(document.body);

    document.onclick = function(e){
      e = new Event(e).stop();
      if (PZ.blackScreen){
        PZ.toggleBlackScreen();
        pst.focus();
        return false;
      }
      PZ.next();
      pst.focus();
    };
    document.onmousemove = PZ.menu;
    document.onkeydown = PZ.keyDown;
    document.onkeyup = PZ.keyUp;

    $('pz_menu_first').addEvent('click', function(e){
      e = new Event(e).stop();
      PZ.showSlide(0, true);
    });
    $('pz_menu_back').addEvent('click', function(e){
      e = new Event(e).stop();
      PZ.prev();
    });
    $('pz_menu_next').addEvent('click', function(e){
      e = new Event(e).stop();
      PZ.next();
    });
    $('pz_menu_index').addEvent('click', function(e){
      e = new Event(e).stop();
      PZ.toggleIndex();
    });
    var menu_download = $('pz_menu_download');
    if (menu_download){
      menu_download.addEvent('click', function(e){
        e = new Event(e).stop();
        window.location = this.getFirst().href;
      });
    };
    $('pz_menu_help').addEvent('click', function(e){
      e = new Event(e).stop();
      PZ.toggleHelp();
    });

    $('pz_help').addEvent('click', function(e){
      e = new Event(e).stop();
      PZ.toggleHelp();
    });

    PZ.findex = PZ.makeFadeFunc([$('pz_indexBk'), $('pz_index')], [0.9, 1], 300);
    PZ.fmenu = PZ.makeFadeFunc([$('pz_menuBk'), $('pz_menu')], [0.7, 1], 200);
    PZ.fhelp = PZ.makeFadeFunc([$('pz_helpBk'), $('pz_help')], [0.9, 1], 300);
  },


  /* */
  makeFadeFunc: function(els, fullOpacity, vel){
    var fxShow = new Fx.Elements(els, {
      duration:vel,
      onStart:function(){
        els[0].setStyles({'display':'block', 'opacity': 0});
        els[1].setStyles({'display':'block', 'opacity': 0});
      }
    });
    var fxHide = new Fx.Elements(els, {
      duration:300,
      onComplete:function(){
        els[0].style.display = 'none';
        els[1].style.display = 'none';
      }
    });

    var func = function(mostrar){
      if(mostrar){
        fxShow.start({
          '0':{'opacity': [0, fullOpacity[0]]},
          '1':{'opacity': [0, fullOpacity[1]]}
        });
      }
      else{
        fxHide.start({
          '0':{'opacity': [fullOpacity[0], 0]},
          '1':{'opacity': [fullOpacity[1], 0]}
        });
      };
    };
    return func;
  },


  /* Muestra/oculta el índice de diapositivas.
   * */
  toggleIndex: function(){
    var toc = $('pz_index');
    $('pz_help').style.display = 'none';
    $('pz_helpBk').style.display = 'none';
    if ('none' == toc.style.display){
      PZ.findex(true);
    }
    else{
      toc.style.display = 'none';
      $('pz_indexBk').style.display = 'none';
    };
  },


  /* Muestra/oculta la ayuda
   * */
  toggleHelp: function(){
    $('pz_index').style.display = 'none';
    $('pz_indexBk').style.display = 'none';
    if ('none' == $('pz_help').style.display){
      PZ.fhelp(true);
    }
    else{
      PZ.fhelp(false);
    };
  },


  /* Muestra el menú si el mouse se mueve cerca del borde
   * inferior de la pantalla
   * */
  menu: function(e){
    e = new Event(e).stop();
    if (PZ.blackScreen){
      return;
    }
    var disp = $('pz_menu').style.display;
    var mostrar = false;
    mostrar = window.getSize().size.y - e.page.y;
    if (mostrar < 100){
      if('none' == disp){
        PZ.fmenu(true);
      };
    }
    else{
      if ((mostrar > 110) && ('block' == disp)){
        PZ.fmenu(false);
      };
    };
  },


  /* Let manage the presentation with the keyboard.
   * space, right, down, PgDown: next slide.
   * left, up, backspace, PgUp:  previous slide.
   * home:                       go to the first slide.
   * 'b', 'n':                   black screen.
   * 'c', 'i':                   show/hide the presentation content (slide index).
   * esc:                        close window.
   * ---
   * Permite manejar la presentación con el teclado.
   * espacio, derecha, abajo, AvPag: Siguiente diapositiva.
   * izq, arriba, atras, RePag:      Diapositiva anterior.
   * inicio:                         Ir a la primera diapositiva.
   * 'b', 'n':                       Pantalla en negro.
   * 'c', 'i':                       Muestra/oculta el contenido (índice de diapositivas).
   * esc:                            Cierra la ventana
   * */
  keyDown: function(e){
    if (PZ.key_blocked){
      return;
    }
    var e = new Event(e);
    if (PZ.blackScreen){
      PZ.toggleBlackScreen();
      e.stop();
      return false;
    }
    switch(e.key){
      case 'space':
      case 'right':
      case 'down':
        PZ.next();
        e.stop();
        break;
      case 'left':
      case 'up':
      case 'backspace':
        PZ.prev();
        e.stop();
        break;
      case 'b':
      case 'n':
        PZ.toggleBlackScreen();
        e.stop();
        break;
      case 'c':
      case 'i':
        PZ.toggleIndex();
        e.stop();
        break;
      case 'f1':
        PZ.toggleHelp();
        e.stop();
        break;
      case 'esc':
      case 'q':
        if(confirm(MSG_CLOSE)){
          window.close();
        }
        break;
    }
    switch(e.code){
      case 34: //PgDown - AvPag
        PZ.next();
        e.stop();
        break;
      case 33: //PgUp - RePag
        PZ.prev();
        e.stop();
        break;
      case 36: //Home - Inicio
        PZ.showSlide(0, true);
        e.stop();
        break;
    }
    PZ.key_blocked = true;
  },


  /* Unblock the keyboard.
   * The key block is used to prevent repeat an action by keep
   * pressing a key. It avoids to jump a slide by
   * accident.
   * ---
   * Desbloquea el teclado.
   * El bloqueo se usa para impedir que una acción se repita
   * al dejar apretada una tecla. Evita saltarse
   * una diapositiva por accidente.
   * */
  keyUp: function(e){
    PZ.key_blocked = false;
  }
};  //FIN

window.addEvent('domready', PZ.init);
