(function($) {
  var Timer = function(interval, callback) {

    var id;

    this.start = function(trigger_now) {
      id = setInterval(callback, interval);
      if (true == trigger_now) {
        callback();
      }
      return this;
    }

    this.stop = function() {
      clearInterval(id);
      return this;
    }

  }

  $.fn.Gallery = function(user_options) {
    var defaults = {delay: 5, duration: 1}
    return this.each(function() {

      function fade_in_out(cur, next) {
        if (use_transitions) {
          if (cur != undefined) {
            $(cur).removeClass('on').addClass('off').addClass('transitioning');
          }
          $(next).removeClass('off').addClass('on').addClass('transitioning');
        } else {
          if (cur != undefined) {
            $(cur).removeClass('on').fadeOut(options.duration * 1000, function() {
              $(this).addClass('off');
            });
          }
          $(next).removeClass('off').fadeIn(options.duration * 1000, function() {
            $(this).addClass('on');
          });
        }
      }


      $(this).addClass('has-gallery');
      var timer;
      var use_transitions = $.browser.webkit;
      use_transitions = false;
      var images = [];
      var options = $.extend(defaults, user_options)
      var i = -1;
      var next = function(cur) {
        c = cur + 1;
        if (c >= images.length) {
          c = 0;
        }
        return c
      }

      use_transitions?$(this).addClass('use-transitions'):void(0);
      images = $(this).find('.img');
      images.each(function(i) {
        if (i > 0) {
          use_transitions?$(this).addClass('off'):$(this).hide();
        }

        use_transitions?$(this).css({'-webkit-transition-duration': options.duration + 's'}):null;
      });


      fade_in_out(undefined, images[i = next(i)])

      timer = new Timer(options.delay * 1000, function() {
        fade_in_out(images[i], images[i=next(i)]);
      });

      timer.start();

      /*$(this).find('.img').bind('webkitTransitionEnd', function() {
        $(this).removeClass('transitioning');
      })*/

      $(this).find('.info').hover(
        function() {
          timer.stop();
        },
        function() {
          timer.start(true);
        }
      );
      $(this).find('.info a').click(function() {
        timer.stop();
      })
    })
  }

})(jQuery)


$(function() {
  $('div.gallery').Gallery();
})
