var ODGallery = new Class({

  /**
	* Inicializace
	*/
  initialize: function(options) {
    this.bigImgContainer = $(options['bigImgContainerId']);
    this.thumbImgContainer = $(options['thumbImgContainerId']);
    this.pagerContainer = $(options['pagerContainerId']);
    this.prevPagerContainer = $(options['prevPagerContainerId']);
    this.nextPagerContainer = $(options['nextPagerContainerId']);
    this.numberThumbImg = options['numberThumbImg'] ? options['numberThumbImg'] : 10;
    this.nextBtn = $(options['nextBtnId']);
    this.prevBtn = $(options['prevBtnId']);
    this.title = $(options['titleId']);
    this.objPreloader = '<img src="'+options['preloaderPathToImg']+'" alt="" />';
    this.enableEasyBox = options['enableEasyBox'];
    this.minusPositionPreloader = options['minusPositionPreloader'];
    this.pagerPrevText = options['pagerPrevText'];
    this.pagerNextText = options['pagerNextText'];
    this.prevText = options['prevText'];
    this.nextText = options['nextText'];
    this.prevTextEB = options['prevTextEB'];
    this.nextTextEB = options['nextTextEB'];
    this.closeTextEB = options['closeTextEB'];
    this.delay = 300;

    if(this.bigImgContainer == null || this.thumbImgContainer == null)  return;
    this.main();
  },


  /**
	* Hlavni ridici funkce
	*/
  main: function() {
    var allImg = this.thumbImgContainer.getElements('img');
    var allAnchor = this.thumbImgContainer.getElements('a');
    var allPathBigImg = [];
    var data = [];

    allAnchor.each(function(item, index){
      allPathBigImg.push(item.get('href'));
      item.set('href','/#');
    });

    var data = new Array(allImg,allAnchor,allPathBigImg);

    // Strankovani
    if(this.numberThumbImg < allImg.length && this.pagerContainer != null) {
      this.createPager(data);
      this.createPrevAndNextPager(data);
      this.pagerContainer.getElements('a').addEvent('click', this.eventPager.bindWithEvent(this,[data]));
    }

    // Predchozi a dalsi link
    if(this.nextBtn != null && this.prevBtn != null) {
      // Vytvoreni predchoziho a dalsiho odkazu
      this.createPrevAndNext(data);

      // Kliknuti na polozku dalsi
      this.nextBtn.addEvent('click', this.eventPrevAndNext.bindWithEvent(this,[data,1]));

      // Kliknuti na polozku predchozi
      this.prevBtn.addEvent('click', this.eventPrevAndNext.bindWithEvent(this,[data,-1]));
    }

    // Nahrani velkeho obrazku
    this.loadGallery(data);

    // Kliknuti na nahledovy obrazek
    this.thumbImgContainer.getElements('a').addEvent('click', this.eventThumb.bindWithEvent(this,[data]));

    // Kliknuti na velky obrazek pro zobrazeni easy boxu
    if(this.enableEasyBox)
    this.bigImgContainer.getElement('img').addEvent('click', this.eventShowEB.bindWithEvent(this,[data]));
  },


  /**
	* Konfigurace po nacteni stranky
	*/
  loadGallery: function(data) {
    var img = new Element('img', {'src': data[2][0],'title':data[0][0].get('title')});

    if(this.enableEasyBox)
    var anchor = new Element('a', {'href': this.thumbImgContainer.getElement('a').get('rel')});
    else var anchor = new Element('a', {});

    this.bigImgContainer.setStyle('position', 'relative');
    this.thumbImgContainer.getElements('a').set('class','unselected');
    this.thumbImgContainer.getElement('a').set('class','selected');

    // Include velkeho obrazku
    var all = anchor.grab(img);
    this.bigImgContainer.grab(all,'top');

    // Include preloaderu
    var load = new Element('div', {'html': this.objPreloader,'id': 'preloader','styles': {'position': 'absolute','display':'none'}});
    this.bigImgContainer.grab(load);

    imgObj = new Image();
    imgObj.onload = function(){
      imgObj.onload = null;
      if(this.title) this.title.set('html',data[0][0].get('title'));
    }.bind(this);
    imgObj.src = data[2][0];
  },


  /**
	* Kliknuti na nahledovy obrazek
	*/
  eventThumb: function(event,data) {
    new Event(event).stop();

    (function(){
      var className = event.target.getParent().get('class');

      if(className != 'selected') {

        // Zobrazeni preloaderu
        this.showPreloaderObj();

        this.thumbImgContainer.getElements('img').each(function(item, index){
          if(event.target.get('src') == item.get('src')) indexActual = index;
        });

        imgObj = new Image();
        imgObj.onload = function(){

          imgObj.onload = null;

          // Zobrazeni velkeho obrazku a skryti preloaderu
          this.showImgAndHidePreloader(data,imgObj,indexActual);

          // Zobrazeni popisku
          if(this.title) this.title.set('html',data[0][indexActual].get('title'));

          // Nastaveni tridy predchozimu a dalsimu odkazu
          if(this.nextBtn!=null && this.prevBtn!=null) {
            this.settingClassPrevNextLink(indexActual,data);
          }

          // Nastaveni tridy pro nahledy
          this.thumbImgContainer.getElements('a').set('class','unselected');
          event.target.getParent().set('class','selected');

        }.bind(this);
        imgObj.src = data[2][indexActual];

      }
    }).delay(this.delay, this);
  },


  /**
	* Vytvoreni strankovani
	*/
  createPager: function(data) {
    var loop = Math.ceil(data[0].length/this.numberThumbImg);

    for (var p=1; p<=loop; p++) {
      var nameClass = p==1 ? 'active' : 'inactive';
      var anchor = new Element('a', {'href': '/#','class': nameClass,'html': p});
      this.pagerContainer.grab(anchor,'bottom');
    }

    for (var i=this.numberThumbImg; i<data[0].length; i++) {
      data[1][i].setStyle('display','none');
    }
  },


  /**
	* Vytvoreni predchozi a dalsi ve strankovani
	*/
  createPrevAndNextPager: function(data) {
    var prev = new Element('a', {'href': '/#','html': this.pagerPrevText, 'class':'prev begin'});
    var next = new Element('a', {'href': '/#','html': this.pagerNextText, 'class': 'next'});

    this.pagerContainer.grab(prev,'top');
    this.pagerContainer.grab(next,'bottom');
  },


  /**
	* Pozice stranky ve strankovani
	*/
  getPageForPager: function(event,data) {
    var active = this.pagerContainer.getElement('a[class=active]').get('text').toInt();
    var index = event.target.get('class').contains('prev') ? -1 : 1;
    var page = active+index
    if(page==0) page = 1;
    if(page > this.pagerContainer.getElements('a[class$=active]').length) page = this.pagerContainer.getElements('a[class$=active]').length;
    return page;
  },


  /**
	* Kliknuti na stranu ve strankovani
	*/
  eventPager: function(event,data) {
    new Event(event).stop();

    (function(){
      // Zobrazeni preloaderu
      this.showPreloaderObj();

      // Pokud je udalost predchozi nebo dalsi odkaz
      if (parseFloat(event.target.get('text')) != parseInt(event.target.get('text'), 10)) {
        var page = this.getPageForPager(event,data);
        var nextPrev = true;
      } else {
        var page = event.target.get('text').toInt();
        var nextPrev = false;
        var classNameItem = event.target.get('class');
      }

      var startPos = (page-1) * this.numberThumbImg;
      var endPos = startPos+this.numberThumbImg > data[0].length ? data[0].length : startPos+this.numberThumbImg;

      imgObj = new Image();
      imgObj.onload = function(){
        // Zobrazeni velkeho obrazku a skryti preloaderu
        this.showImgAndHidePreloader(data,imgObj,startPos);

        // Zobrazeni nahledu, ktere maji byt viditelne
        this.displayThumb(startPos,endPos,data);

        // Nastaveni tridy pro nahledy
        this.thumbImgContainer.getElements('a').set('class','unselected');
        data[1][startPos].set('class','selected');

        if(this.title) this.title.set('html',data[0][startPos].get('title'));

        // Nastaveni tridy predchozimu a dalsimu odkazu
        if(this.nextBtn!=null && this.prevBtn!=null) {
          this.settingClassPrevNextLink(startPos,data);
        }

        // Pokud jeste neni nastavena trida pro zactatek a pritom se ma zobrazit strana 1 - nastavi se true pro zobrazeni velkeho obrazku
        var beginPriority = false;
        if(!this.pagerContainer.getElement('a[class*=prev]').get('class').contains('begin') && page == 1 ) {
          beginPriority = true;
        }

        // Pokud jeste neni nastavena trida pro konec a pritom se ma zobrazit posledni strana - nastavi se true pro zobrazeni velkeho obrazku
        var endPriority = false;
        if(!this.pagerContainer.getElement('a[class*=next]').get('class').contains('end') && page == this.pagerContainer.getElements('a[class$=active]').length ) {
          endPriority = true;
        }

        // Nastaveni stylu pro strankovani
        this.pagerContainer.getElements('a[class$=active]').set('class', 'inactive');
        if(nextPrev) {
          this.pagerContainer.getElement('a[html='+page+']').set('class', 'active');
          this.setClassNextPrevPager(page);
        } else {
          event.target.set('class', 'active');
          this.setClassNextPrevPager(page);
        }

        var end = this.pagerContainer.getElement('a[class*=next]').get('class').contains('end');
        var begin = this.pagerContainer.getElement('a[class*=prev]').get('class').contains('begin');

      }.bind(this);
      imgObj.src = data[2][startPos];

    }).delay(this.delay, this);
  },


  /**
	* Nastaveni stylu pro dalsi a predchozi link ve strankovani
	*/
  setClassNextPrevPager: function(page) {
    if(page == 1) this.pagerContainer.getElement('a[class*=prev]').addClass('begin');
    if(page > 1) this.pagerContainer.getElement('a[class*=prev]').removeClass('begin');
    if(page == this.pagerContainer.getElements('a[class$=active]').length) this.pagerContainer.getElement('a[class*=next]').addClass('end');
    if(page < this.pagerContainer.getElements('a[class$=active]').length) this.pagerContainer.getElement('a[class*=next]').removeClass('end');
  },


  /**
	* Zobrazeni nahledu
	*/
  displayThumb: function(startPos,endPos,data) {
    this.thumbImgContainer.getElements('a').setStyle('display','none');
    for (var i=startPos; i<endPos; i++) {
      data[1][i].setStyle('display','inline');
    }
  },


  /**
	* Vytvoreni predchoziho a dalsiho odkazu
	*/
  createPrevAndNext: function(data) {
    // Predchozi
    var prevAnchor = new Element('a', {href: '/#', 'class': 'begin', 'html': this.prevText});
    this.prevBtn.grab(prevAnchor);

    // Dalsi
    var nextAnchor = new Element('a', {href: '/#', 'html':this.nextText});
    if(data[0].length == 1) nextAnchor.set('class', 'end');
    this.nextBtn.grab(nextAnchor);
  },


  /**
	* Kliknuti na dalsi nebo predchozi polozku
	*/
  eventPrevAndNext: function(event,data,go) {
    new Event(event).stop();

    (function(){
      var srcActual = this.thumbImgContainer.getElement('.selected').getChildren().get('src');
      data[0].each(function(item, index){ if(item.get('src') == srcActual) indexActual = index;})

      // Zobrazeni preloaderu
      if(data[1][indexActual+go] == null) return;
      if(!$('EB_wrap_img')) this.showPreloaderObj();

      imgObj = new Image();
      imgObj.onload = function(){
        // Zobrazeni velkeho obrazku a skryti preloaderu
        this.showImgAndHidePreloader(data,imgObj,indexActual+go);

        // Pridani tridy pro odkazy predchozi a dalsi
        if(go==1) {
          if(data[0].length-2 == indexActual) this.nextBtn.getElement('a').set('class', 'end');
          this.prevBtn.getElement('a').removeClass('begin');
        } else {
          if(indexActual == 1) this.prevBtn.getElement('a').set('class', 'begin');
          this.nextBtn.getElement('a').removeClass('end');
        }

        if(this.title) this.title.set('html',data[0][indexActual+go].get('title'));

        // Nastaveni tridy pro odkazy u nahledovych obrazku
        data[1][indexActual].set('class','unselected');
        if(data[1][indexActual+go] == null) data[1][indexActual].set('class','selected');
        else data[1][indexActual+go].set('class','selected');

        // EB predchozi a dalsi
        if($('EB_wrap_img'))  {
          var src = this.thumbImgContainer.getElements('a').get('rel')[indexActual+go];
          var img = new Element('img', {'src': src,'id':'EB_img','alt': '','styles':{'position':'relative','opacity':1 }});
          this.loadImageEB(img,src);

          var title = this.thumbImgContainer.getElements('img').get('title');
          $('EB_title').set({'html':title[indexActual+go]});

          if(go==1) {
            if(data[0].length-2 == indexActual) $('EB_next').getElement('a').setStyle('visibility', 'hidden');
            $('EB_prev').getElement('a').setStyle('visibility', 'visible');
          } else {
            $('EB_next').getElement('a').setStyle('visibility', 'visible');
            if(indexActual == 1) $('EB_prev').getElement('a').setStyle('visibility', 'hidden');
          }
        }

        // Ziskani zacatku a konce pro nahledy
        var page = Math.ceil((indexActual+1+go)/this.numberThumbImg);
        var startPos = (page-1) * this.numberThumbImg;
        var endPos = startPos+this.numberThumbImg > data[0].length ? data[0].length : startPos+this.numberThumbImg;

        // Nastaveni stylu pro strankovani
        if(this.pagerContainer != null) {
          var pagerEl = this.pagerContainer.getElements('a[class$=active]');
          if(pagerEl != '')  {
            pagerEl.set('class', 'inactive');
            pagerEl[page-1].set('class', 'active');
            this.setClassNextPrevPager(page);
          }

          // Zobrazeni nahledu, ktere maji byt viditelne
          this.displayThumb(startPos,endPos,data);
        }

      }.bind(this);
      imgObj.src = data[2][indexActual+go];

    }).delay(this.delay, this);
  },


  /**
	* Nastaveni tridy predchozimu a dalsimu odkazu
	*/
  settingClassPrevNextLink: function(pos,data) {
    if(pos == 0) this.prevBtn.getElement('a').set('class', 'begin');
    if(pos > 0) this.prevBtn.getElement('a').removeClass('begin');
    if(pos == data[0].length-1) this.nextBtn.getElement('a').set('class', 'end');
    if(pos < data[0].length-1) this.nextBtn.getElement('a').removeClass('end');
  },


	/**
	* Zobrazeni preloaderu
	*/
  showPreloaderObj: function() {
    var width = this.bigImgContainer.getElement('img').getSize().x;
    var height = this.bigImgContainer.getElement('img').getSize().y;
    $('preloader').setStyles({'position':'absolute','display':'block','left':(width/2)-this.minusPositionPreloader+'px', 'top': height/2+'px'});
  },


	/**
	* Zobrazeni velkeho obrazku a skryti preloaderu
	*/
  showImgAndHidePreloader: function(data,img,index) {
    $('preloader').setStyle('display','none');
    this.bigImgContainer.getElement('img').set({'width':img.width,'height':img.height,'src':data[2][index],'title':data[0][index].get('title'),'alt':data[0][index].get('alt')});

    if(this.enableEasyBox)
    this.bigImgContainer.getElement('a').set({'href':this.thumbImgContainer.getElements('a')[index].get('rel')});
  },


  /**
	* Zobrazeni easy boxu
	*/
  eventShowEB: function(event,data) {
    if($('EB_wrap_img')) return;
    new Event(event).stop();

    (function(){
      var img = new Element('img', {'src': event.target.getParent().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','html':event.target.get('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'});

      if(data[0].length==1 || event.target.getParent().get('href') == data[1][(data[0].length)-1].get('rel')) next.getElement('a').setStyle('visibility','hidden');
      if(data[0].length==1 || event.target.getParent().get('href') == data[1][0].get('rel')) prev.getElement('a').setStyle('visibility','hidden');

      $$('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.eventPrevAndNext.bindWithEvent(this,[data,-1]));
      $('EB_next').getElement('a').addEvent('click', this.eventPrevAndNext.bindWithEvent(this,[data,1]));

      // Testuje se zda je obrazek nacteny
      this.loadImageEB(img,event.target.getParent().get('href'));

      // 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);
  },


  /**
	* Testuje se zda je obrazek nacteny
	*/
  loadImageEB: function(img,url) {
    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;
      $('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);
  }
})


