/*
 * @name:     Gallery
 * @version:  0.1 
 * @release:  2008-10-15
 * @type:     jQuery plugin
 * @author:   David Sklar
--------------------------------------- */
(function ($) {


  var Gallery = function (box, opts) {

    var $this = box;    // obalovy box

    var frame;          // maskovaci ramecek
    var slider;         // pojizdny box s nahledy
    var slide;          // nahled

    var btnPrev;        // button pro posun vpred
    var btnNext;        // button pro posun vzad

    var fWidth = 0;     // sirka maskovaciho ramecku
    var sWidth = 0;     // sirka pojizdneho boxu

    var count = 0;      // pocet nahledu
    var page = 1;       // aktualni stranka
    var pages = 0;      // pocet stranek

    var status = true;

    var options = opts;
    var length = opts.length - 1;   // pocet zobrazenych nahledu

    var msie7 = ($.browser.msie && parseInt(navigator.userAgent.toLowerCase().match(/msie (\d\.0)/)[1]) == 7) ? true : false;



    //
    $this.find('a').wrapAll('<div class="g-frame"><div class="g-slider"></div></div>');
    $this
      .append('<a class="prev"></a>')
      .append('<a class="next"></a>');

    //
    slide = $this.find('img');
    slide.each(function (j) {
      sWidth += $(this).width() + parseInt($(this).css('margin-right')) + parseInt($(this).css('margin-left')) + 8;

      if (j < length) {
        fWidth += $(this).width() + parseInt($(this).css('margin-right')) + parseInt($(this).css('margin-left')) + 8; 
      } else if (j == length) {
        fWidth += $(this).width();
      }
      count++;

      if (!msie7) {
        $(this)
          .css({'opacity': options.opacity})
          .hover(
            function () {
              $(this).fadeTo(100, 1.0);
            },
            function () {
              $(this).fadeTo(300, options.opacity);
            }
          );
      }


    });

    pages = Math.ceil(count/(length + 1));
    
    //
    slider = $this.find('div.g-slider');
    slider.width(sWidth)
          .css({
            'padding':    0,
            'margin':     0,
            'position':   'relative'
          });
    //
    frame = $this.find('div.g-frame');
    frame
        .width(fWidth)
        .css({
          'padding':    0,
          'margin':     0,
          'position':   'relative',
          'overflow':   'hidden'
        });

    //
    btnPrev = $this.find('a.prev');
    btnPrev
      .addClass(options.css)
      .bind('click', function (e) {
        if (status && page > 1) {
          rewind();
          status = false;
        }
        e.preventDefault();
      });

    //
    btnNext = $this.find('a.next');
    btnNext.bind('click', function (e) {
      if (status && page < pages) {
        forward();
        status = false;
      }
      e.preventDefault();
    }); 



    /*
    --------------------------- */
    var forward = function  () {
      var x = slider.position().left - (fWidth + parseInt(slide.css('margin-right')) + parseInt(slide.css('margin-left')));
      run(x);
      page++;
    };

    //
    var rewind = function () {
      var x = slider.position().left + (fWidth + parseInt(slide.css('margin-right')) + parseInt(slide.css('margin-left')));
      run(x);
      page--;
    };

    //
    var run = function (x) {
      btnPrev.addClass(options.css);
      btnNext.addClass(options.css);

      slider.animate(
        {'left': x +'px'}, 
        {queue: false, easing: options.easing, duration: options.duration, complete: function () {
          if (page > 1) {
            btnPrev.removeClass(options.css);
          }
          if (page < pages) {
            btnNext.removeClass(options.css);
          }

          status = true;
        }
      });

    };

  };






  /*
  --------------------------- */
  $.fn.gallery = function (options) {
    //
    var opts = $.extend({}, {
    
      length:     5,                // @number  pocet nahledu v rade
      easing:     'swing',          // @string   
      duration:   500,              // @number  doba trvani animace posunu [ms]
      opacity:    0.5,              // @number  pocatecni pruhlednost nahledu
      css:        'disabled'        // @string  css trida pro neaktivni button

    }, options);

    //
    return this.each(function () {

      return new Gallery($(this), opts);

    });
  };




})(jQuery);
