var indexActual = 0;
var easybox = new Class({

  /**
	* Inicializace
	*/ 
  initialize: function(options) {
    this.delay = 300;
    this.minusPositionPreloader = 60;
    this.objPreloader = '<img src="'+options['preloaderPathToImg']+'" alt="" />';
    this.closeTextEB = options['closeTextEB'];
    this.prevTextEB = options['prevTextEB'];
    this.nextTextEB = options['nextTextEB'];
    this.numItems = (options['num_items'] == '' || options['num_items'] == 0 ? 10 : options['num_items']);
    this.classNamePagerContainer = 'pager';
    this.classNameLinkPrev = 'link_prev';
    this.classNameLinkNext = 'link_next';
    this.pagerPrevText = options['prevText'];
    this.pagerNextText = options['nextText'];
    this.main();
  },
  
  
  /**
	* Hlavni ridici funkce
  *
  * @param string prefix  css selektor pro vymezeni odkazu. Metodu main lze volat opakovane a pridavat obrazky napr. po nacteni ajaxem
	*/ 
  main: function(prefix) {
    if (!prefix) prefix = '';
    $$(prefix + " a.easybox").addEvent('click', this.eventShowEB.bindWithEvent(this));
    $$(prefix + " a.easybox img").addEvent('click', this.eventShowEB.bindWithEvent(this));
    
    var cont = $$('.'+this.classNamePagerContainer);
    if(cont.length > 0 && $$(prefix + " a.easybox").length > this.numItems)  {
      this.createPager();
      this.createPrevNextPager();
      for(i=0; i<cont.length; i++){ 
        cont[i].addEvent('click', this.eventPager.bindWithEvent(this));
      }
      for(i=0; i<$$('.'+this.classNameLinkNext).length; i++){
        $$('.'+this.classNameLinkNext)[i].addEvent('click', this.eventPager.bindWithEvent(this));
      }
    }
    
    this.showThumbs(0);
  },

 
  /**
	* Kliknuti na stranu ve strankovani
	*/  
  eventPager: function(event) { 
    new Event(event).stop();
    var targets = $(event.target);
    if (targets.getParent().className == this.classNameLinkNext || targets.getParent().className == this.classNameLinkPrev) targets = targets.getParent();
    
    var cont = $$('.'+this.classNamePagerContainer);
    if(!cont || targets.get('tag')=='span' || targets.get('tag')=='div' || targets.get('tag')=='img') return;

    var actualPage = 0;
    var posClick = (targets.getAllPrevious().length);

    // aktualni strana
    cont[0].getChildren().each(function(item, index){
      if(cont[0].getChildren()[index].get('tag')=='span' && index != 0 && cont[0].getChildren().length-1 != index) actualPage = index;
    });
    
    // aktualni strana po kliknuti
    if(targets.get('class')=='prev' || targets.get('class')=='link_prev') {
      var move = -1;
      posClick = actualPage-1;
    } else if(targets.get('class')=='next' || targets.get('class')=='link_next') {
      posClick = actualPage+1;
    }

    // Predchozi  
    for(i=0; i<$$('.'+this.classNameLinkPrev).length; i++) {
      if(posClick<2)  {
        var prev = new Element('span', {'html': $$('.'+this.classNameLinkPrev)[i].innerHTML, 'class': 'link_prev'});
        prev.replaces($$('.'+this.classNameLinkPrev)[i]);
      } else if (posClick>1 && $$('.'+this.classNameLinkPrev)[i].get('tag') == 'span') {
        var prev = new Element('a', {'href': '/#', 'html': $$('.'+this.classNameLinkPrev)[i].innerHTML, 'class': 'link_prev'});
        prev.addEvent('click', this.eventPager.bindWithEvent(this));
        prev.replaces($$('.'+this.classNameLinkPrev)[i]);
      }
      
      if($$('.'+this.classNameLinkPrev).length > 0)
          $$('.'+this.classNameLinkPrev)[i].blur();
    }
    for(i=0; i<cont.length; i++) {
      if(posClick<2)  {
        var prevSpan = new Element('span', {'html': this.pagerPrevText, 'class':'prev'});
        cont[i].getChildren()[0].destroy();
        prevSpan.inject(cont[i].getChildren()[0], 'before');
      } else if(posClick>1) {
        var prevAnchor = new Element('a', {'href': '/#','html': this.pagerPrevText, 'class':'prev'});
        cont[i].getChildren()[0].destroy();
        prevAnchor.inject(cont[i].getChildren()[0], 'before');
      }
    }

    // Dalsi
    for(i=0; i<cont.length; i++){
      sumPageInPager = cont[i].getChildren().length-2
      if(sumPageInPager==posClick)  {
        var nextSpan = new Element('span', {'html': this.pagerNextText, 'class':'next'});
        cont[i].getChildren()[sumPageInPager+1].destroy();
        nextSpan.inject(cont[i].getChildren()[sumPageInPager], 'after');
      } else if(sumPageInPager>posClick)  {
        var nextAnchor = new Element('a', {'href': '/#','html': this.pagerNextText, 'class':'next'});
        cont[i].getChildren()[sumPageInPager+1].destroy();
        nextAnchor.inject(cont[i].getChildren()[sumPageInPager], 'after');          
      }

      if($$('.'+this.classNameLinkNext).length > 0)
          $$('.'+this.classNameLinkNext)[i].blur();
    }
    for(i=0; i<$$('.'+this.classNameLinkNext).length; i++){
      sumPageInPager = cont[0].getChildren().length-2;
      if(sumPageInPager == posClick)  {
        var next = new Element('span', {'html': $$('.'+this.classNameLinkNext)[i].innerHTML, 'class': 'link_next'});
        next.replaces($$('.'+this.classNameLinkNext)[i]);
      } else if (sumPageInPager>posClick && $$('.'+this.classNameLinkNext)[i].get('tag') == 'span') {
        var next = new Element('a', {'href': '/#', 'html': $$('.'+this.classNameLinkNext)[i].innerHTML, 'class': 'link_next'});
        next.addEvent('click', this.eventPager.bindWithEvent(this));
        next.replaces($$('.'+this.classNameLinkNext)[i]);
      }
    }
    
    // cisla stran
    for(i=0; i<cont.length; i++) { 
      var spanEl = new Element('span', {'html': posClick, 'class': (posClick==1 ? 'first' : '')});
      var aEl = new Element('a', {'href': '/#','html': actualPage, 'class': (actualPage==1 ? 'first' : '')});
      
      cont[i].getChildren()[posClick].destroy();
      if(posClick<1) spanEl.inject(cont[i].getChildren()[0], 'before');
      else spanEl.inject(cont[i].getChildren()[posClick-1], 'after');

      cont[i].getChildren()[actualPage].destroy();
      if(actualPage<1) aEl.inject(cont[i].getChildren()[0], 'before');        
      else  aEl.inject(cont[i].getChildren()[actualPage-1], 'after');
    }

    this.showThumbs(posClick-1);
  },  
  

  /**
	* Strankovani
	*/  
  createPager: function() { 
    if($$('.'+this.classNamePagerContainer).length < 1) return;
    var loop = Math.ceil(($$("a.easybox").length)/(this.numItems));
    var pagerContainer = $$('.'+this.classNamePagerContainer);

    for(i=0; i<pagerContainer.length; i++){ 
      for (var p=1; p<=loop; p++) {
        if(p==1) var tag = new Element('span', {'html': p, 'class':'first'}); 
        else var tag = new Element('a', {'href': '/#','html': p}); 
        pagerContainer[i].grab(tag,'bottom');
      }
    }
  },
  
  
  /**
	* Vytvoreni predchozi a dalsi ve strankovani
	*/  
  createPrevNextPager: function() { 
    for(i=0; i<$$('.'+this.classNamePagerContainer).length; i++){ 
      var prev = new Element('span', {'href': '/#','html': this.pagerPrevText, 'class': 'prev'}); 
      var next = new Element('a', {'href': '/#','html': this.pagerNextText, 'class': 'next'});
      $$('.'+this.classNamePagerContainer)[i].grab(prev,'top');
      $$('.'+this.classNamePagerContainer)[i].grab(next,'bottom');
    };
    for(i=0; i<$$('.'+this.classNameLinkNext).length; i++){
      var next = new Element('a', {'href': '/#','html': $$('.'+this.classNameLinkNext)[i].innerHTML, 'class': 'link_next'});
      next.replaces($$('.'+this.classNameLinkNext)[i]);
    }
  },


  /**
	* Zobrazeni obrazku
	*/  
  showThumbs: function(posClick) { 
    var begin = ((posClick+1)*this.numItems)-this.numItems;
    var end = ((posClick+1)*this.numItems)-1;
    $$("a.easybox").setStyle('display','none');
    $$("a.easybox").each(function(item, index){
      if(begin <= index && index <= end) item.setStyle('display','inline');
    });
  },  


  /**
	* Zobrazeni easy boxu 
	*/  
  eventShowEB: function(event) {
    if($('EB_wrap_img')) return;
    new Event(event).stop();

    (function(){
      var img = new Element('img', {'src': event.target.get('href'),'id':'EB_img','alt': '','styles':{'position':'relative','opacity':0 }});
      var frame = new Element('div', {'id':'EB_frame', 'styles':{'opacity': 0,'position':'absolute','left':0,'top':0,'background-color':'#000','width':window.getScrollWidth(),'height':window.getScrollHeight()-1}});
      var wrapImg = new Element('div', {'id':'EB_wrap_img','styles':{'position':'absolute','left':'-10000px','top':'-10000px','opacity': 0 }});
      var load = new Element('div', {'html': this.objPreloader,'id': 'EB_preloader','styles': {'display': 'none'}});
      var title = new Element('div', {'id': 'EB_title'});
      var close = new Element('div', {'id': 'EB_close','html':'<a href="#">'+this.closeTextEB+'</a>'});
      var closeWrap = new Element('div', {'id': 'EB_close_wrap'});
      var prev = new Element('div', {'id': 'EB_prev','html': '<a href="#">'+this.prevTextEB+'</a>'});
      var next = new Element('div', {'id': 'EB_next', 'html': '<a href="#">'+this.nextTextEB+'</a>'});
      var caption = new Element('div', {'id': 'EB_caption'});    
      
      $$('body').adopt(frame);
    
      caption.adopt(prev);
      caption.adopt(next);
      if(event.target.get('title')!='') caption.adopt(title);
          
      wrapImg.adopt(closeWrap);
      closeWrap.adopt(close);
      wrapImg.adopt(img);
      wrapImg.adopt(caption);
      
      $$('body').adopt(wrapImg);
      $$('body').adopt(load);
      
      var effectFrame = new Fx.Tween(frame,{duration: '300',transition: Fx.Transitions.Sine.easeOut});
      var effectWrapImg = new Fx.Tween(wrapImg,{duration: '300',transition: Fx.Transitions.Sine.easeOut});
      var effectImg = new Fx.Tween(img,{duration: '300',transition: Fx.Transitions.Sine.easeOut});
      
      effectFrame.start('opacity', '0.6');
      effectImg.start('opacity', '1');
      effectWrapImg.start('opacity', '1');
      
      $('EB_frame').addEvent('click', this.eventRemoveEB.bindWithEvent(this,[effectFrame,effectWrapImg,effectImg]));
      $('EB_img').addEvent('click', this.eventRemoveEB.bindWithEvent(this,[effectFrame,effectWrapImg,effectImg]));
      $('EB_close').addEvent('click', this.eventRemoveEB.bindWithEvent(this,[effectFrame,effectWrapImg,effectImg]));
      
      $('EB_prev').getElement('a').addEvent('click', this.eventNextPrev.bindWithEvent(this,[-1]));
      $('EB_next').getElement('a').addEvent('click', this.eventNextPrev.bindWithEvent(this,[1]));
      
      // Zobrazeni obrazku
      var url = event.target.get('href')==null ? event.target.getParent().get('href') : event.target.get('href');
      this.loadImageEB(url,0);

      $$("a.easybox").each(function(item, index){
        if(url == item.get('href')) indexActual = index;
      });
      
      // Prepocitani pozice po zmene rozmeru prohlizece nebo scrollingu
      var doRePosition = function() {
        var size = new Array(img.getSize().x, img.getSize().y);
        if(!$('EB_wrap_img')) return; 
        this.setPositionEB(size);
        this.setFrameEB();
      }.bind(this);
      window.onresize = doRePosition;
      window.onscroll = doRePosition;
    }).delay(this.delay, this);
  },
  
  
  /**
	* Dalsi a predchozi odkaz
	*/  
  eventNextPrev: function(event,pos) {
    new Event(event).stop();
    
    $$("a.easybox").each(function(item, index){
      if($('EB_img').get('src') == item.get('href')) indexActual = index;
    });
    
    var url = $$("a.easybox")[indexActual+pos].get('href');
    this.loadImageEB(url,pos);
  },
  
  
  /**
	* Zobrazeni obrazku
	*/
  loadImageEB: function(url,pos) {
    var left = (window.getScrollLeft()+(window.getWidth()/2));
    var top = (window.getScrollTop()+(window.getHeight()/2));
    $('EB_preloader').setStyles({'display':'block','position':'absolute','left':left-this.minusPositionPreloader,'top':top});
    imgObj = new Image();
    imgObj.onload = function(){
      imgObj.onload = null;
      $$("a.easybox").each(function(item, index){
        if($('EB_img').get('src') == item.get('href')) indexActual = index;
      });
      

      if(pos==1) {
        $('EB_prev').getElement('a').setStyle('display', 'block');
        $('EB_prev').setStyle('display', 'block');
        if($$("a.easybox").length-2 == indexActual) {
          $('EB_next').getElement('a').setStyle('display', 'none');
          $('EB_next').setStyle('display', 'none');
        }
      } else {
        $('EB_next').getElement('a').setStyle('display', 'block');
        $('EB_next').setStyle('display', 'block');
        if(indexActual < 1) {
          $('EB_prev').getElement('a').setStyle('display', 'none');
          $('EB_prev').setStyle('display', 'none');
        }
      }
      
      if($$("a.easybox").length==1 || $$("a.easybox").length == (indexActual+1+pos)) {
        $('EB_next').getElement('a').setStyle('display','none');
        $('EB_next').setStyle('display','none');
      }
      if($$("a.easybox").length==1 || (indexActual+pos) == 0) {
        $('EB_prev').getElement('a').setStyle('display','none');
        $('EB_prev').setStyle('display','none');
      }
      
      $('EB_title').set('html',$$("a.easybox")[indexActual+pos].get('title'));

      // Pokud neni nastaven rel, nezobrazi se predchozi a dalsi link
      if($$("a.easybox")[indexActual+pos].get('rel') == '' || $$("a.easybox")[indexActual+pos].get('rel') == null)  {
        $('EB_prev').setStyle('display','none');
        $('EB_next').setStyle('display','none');
        if($$("a.easybox")[indexActual+pos].get('title') == '' || $$("a.easybox")[indexActual+pos].get('title') == null) $('EB_title').setStyle('display','none');
        else  $('EB_title').setStyle('text-align','left');
      }

      $('EB_img').set({'width':imgObj.width,'height':imgObj.height,'src':url});
      $('EB_preloader').setStyle('display','none');
      $('EB_caption').setStyle('width',imgObj.width);
      var size = new Array(imgObj.width, imgObj.height);
      this.setPositionEB(size);
    }.bind(this);
    imgObj.src = url;
  },
  
  
  /**
	* Nastaveni pozicovani
	*/  
  setPositionEB: function(sizeImg) {
    var paddingTop = $('EB_wrap_img').getStyle('padding-top').toInt();
    var paddingRight = $('EB_wrap_img').getStyle('padding-right').toInt();
    var paddingBottom = $('EB_wrap_img').getStyle('padding-bottom').toInt();
    var paddingLeft = $('EB_wrap_img').getStyle('padding-left').toInt();
    var caption = $('EB_caption').getStyle('height').toInt();
    var close = $('EB_close_wrap').getStyle('height').toInt();    
    
    $('EB_wrap_img').setStyles({
      position: 'absolute',
      left: (window.getScrollLeft()+(window.getWidth()/2))-(sizeImg[0]/2)-((paddingLeft+paddingRight)/2),
      top: (window.getScrollTop()+(window.getHeight()/2))-(sizeImg[1]/2)-((paddingTop+paddingBottom)/2)-(caption/2)-(close/2)
    });
  },
  
  
  /**
	* Nastaveni framu
	*/ 
  setFrameEB: function() {
    $('EB_frame').setStyles({'width':window.getScrollWidth(),'height':window.getScrollHeight()})
  },


  /**
	* Zruseni easy boxu
	*/ 
  eventRemoveEB: function(event,effectFrame,effectWrapImg,effectImg) {
    new Event(event).stop();
    (function(){ 
      effectFrame.start('opacity', '0');
      effectWrapImg.start('opacity', '0');
      effectImg.start('opacity', '0');
      (function(){ 
        $('EB_wrap_img').destroy();
        $('EB_frame').destroy();
        $('EB_preloader').destroy();
      }).delay(300);
    }).delay(this.delay, this);
  }
})

