GM.namespace('GM.cms');

GM.cms.picture = function ()
{
  var num, previous, next, caption, image,
      settings,
      preload = [],
      start = 0;

  return {
  
    settings: null,
    
    init: function ()
    {
      if (GM.cms.picture.settings) {
        settings = GM.cms.picture.settings;
      
        var last = (location.href.lastIndexOf('?') > -1) ? location.href.lastIndexOf('?') : location.href.length,
            name = location.hash.substring(1) || location.href.substring(location.href.lastIndexOf('/') + 1, last);
        
        for (var i = 0; i < settings.files.length; i += 1) {
          if (settings.files[i][0] == name) {
            start = i;
          }
        }
        
        num      = document.getElementById('picture_number');
        previous = document.getElementById('picture_previous');
        next     = document.getElementById('picture_next');
        caption  = document.getElementById('picture_caption');
        image    = document.getElementById('picture_link');
        
        if (location.hash) {
          GM.cms.picture.change();
        }
        
        GM.event.register(document, 'keydown', GM.cms.picture.keyDown);
        
        previous.removeAttribute('href');
        next.removeAttribute('href');
        
        GM.event.register(previous, 'click', GM.cms.picture.clickPrevious, previous);
        GM.event.register(next, 'click', GM.cms.picture.clickNext, next);
      }
    },
    
    preload: function (first, last)
    {
      for (var i = first; i <= last; i += 1) {
        if (settings.files[i] && !preload[i]) {
          preload[i] = new Image;
          preload[i].src = settings.base + '/' + settings.files[i][0] + settings.tail;
        }
      }
    },
    
    change: function ()
    {
      GM.cms.picture.preload(start - 2, start + 2);
    
      location.hash = '#' + settings.files[start][0];
      
      num.innerHTML = settings.num.replace('%s', start + 1);
      
      image.firstChild.src   = settings.base + '/' + settings.files[start][0] + settings.tail;
      image.firstChild.alt   = settings.files[start][1] || settings.files[start][0];
      image.firstChild.title = image.firstChild.alt;    
      
      image.href = settings.base + '/' + settings.files[start][0];
      
      caption.innerHTML = (settings.files[start][1]) ? settings.files[start][1] : '';
      
      if (settings.files[start][1]) {        
        caption.className = caption.className.replace(/\s?empty/, '');
      } else if (caption.className.indexOf('empty') === -1) {
        caption.className += ' empty';
      }
    },
    
    keyDown: function (e)
    {
      if (GM.event.keyPressed(e, 37) ) {
        GM.cms.picture.clickPrevious(e);
      } else if (GM.event.keyPressed(e, 39) ) {
        GM.cms.picture.clickNext(e);
      }
    },
    
    clickPrevious: function (e)
    {
      GM.event.preventDefault(e);
    
      start = (start === 0) ? settings.files.length - 1 : start - 1;
      GM.cms.picture.change();
    },
    
    clickNext: function (e)
    {
      GM.event.preventDefault(e);
      
      start = (start === settings.files.length - 1) ? 0 : start + 1;
      GM.cms.picture.change();
    }
  }  
}();

GM.event.register(window, 'load', GM.cms.picture.init, GM.cms.picture);

