text: // Generated by CoffeeScript 1.6.1
  
  /*!
    # Responsive Slider widget script
    # by w3widgets
    #
    # Author: Lukasz Kokoszkiewicz
    #
    # Copyright © w3widgets 2013 All Rights Reserved
  */
  
  
  (function() {
  
    (function($) {
      var Slider, autoplay, interval, opts, parallax, parallaxDirection, parallaxDistance, spy, touch, transitionTime;
      Slider = function(element, options) {
        this.$element = element;
        this.$slides = this.$element.find('.slides ul li');
        if (this.$slides.length < 1) {
          this.$slides = this.$element.find('[data-group="slides"] ul li');
        }
        this.$prevNext = this.$element.find('[data-jump]');
        this.$pages = this.$element.find('[data-jump-to]');
        this.$slidesContainer = this.$element.find('[data-group="slides"]');
        this.$rel = this.$element.find('[data-group="slides"] ul');
        this.$rel.css('position', 'relative');
        this.slideChangeInProgress = false;
        this.interval = false;
        this.options = options;
        this.current = 2;
        this.slide = 1;
        this.set(2, true);
        return null;
      };
      Slider.prototype = {
        getGlobalWidth: function() {
          return this.$element.width();
        },
        updateControls: function() {
          this.$pages.removeClass('active');
          return this.$pages.filter('[data-jump-to=' + (this.current - 1) + ']').addClass('active');
        },
        runAnimations: function() {
          var captions, r;
          r = this;
          captions = $(this.$slides[this.current - 1]).find('[data-animate]');
          return captions.each(function() {
            var $caption;
            $caption = $(this);
            return r.options.animations[$caption.data('animate')]($caption, $caption.data('delay'), $caption.data('length'));
          });
        },
        hideAnimatedCaptions: function(slide) {
          return $(this.$slides[slide - 1]).find('[data-animate]').css({
            'opacity': 0
          });
        },
        calculateScroll: function(slide) {
          var gWidth;
          gWidth = this.getGlobalWidth();
          return (slide - 1) * gWidth;
        },
        resize: function() {
          return this.$rel.css('right', this.calculateScroll(this.current));
        },
        jump: function(slide, transitionTime, noanimation) {
          var animateOptions, gWidth, r, step;
          if (transitionTime == null) {
            transitionTime = this.options.transitionTime;
          }
          if (noanimation == null) {
            noanimation = false;
          }
          r = this;
          if (slide === r.current) {
            noanimation = true;
          }
          if (this.$slides.length >= slide && !this.slideChangeInProgress) {
            gWidth = this.getGlobalWidth();
            if (!noanimation) {
              this.hideAnimatedCaptions(slide);
            }
            step = void 0;
            if (this.options.parallax) {
              this.currentBgPosition = parseInt(r.$slidesContainer.css('background-position'));
              this.moveStartScroll = parseInt(this.$rel.css('right'), 10);
              step = function() {
                var position;
                position = Math.round(r.currentBgPosition - (r.moveStartScroll - parseInt(r.$rel.css('right'), 10)) * r.options.parallaxDistance * r.options.parallaxDirection) + 'px 0';
                return r.$slidesContainer.css('background-position', position);
              };
            }
            animateOptions = {
              duration: transitionTime,
              step: step,
              done: function() {
                if (slide === 1) {
                  r.hideAnimatedCaptions(r.$slides.length - 1);
                  r.set(r.$slides.length - 1);
                } else if (slide === r.$slides.length) {
                  r.hideAnimatedCaptions(2);
                  r.set(2);
                } else {
                  r.current = slide;
                  r.slide = slide - 1;
                }
                r.updateControls();
                if (!noanimation) {
                  r.runAnimations();
                }
                r.options.onSlideChange.call(r);
                return null;
              },
              always: function() {
                r.slideChangeInProgress = false;
                return null;
              }
            };
            this.slideChangeInProgress = true;
            this.$rel.animate({
              'right': this.calculateScroll(slide)
            }, animateOptions);
          }
          return null;
        },
        set: function(slide, init) {
          var gWidth;
          if (init == null) {
            init = false;
          }
          gWidth = this.getGlobalWidth();
          this.$rel.css('right', this.calculateScroll(slide));
          this.current = slide;
          this.slide = slide - 1;
          this.updateControls();
          return null;
        },
        movestart: function(e) {
          if ((e.distX > e.distY && e.distX < -e.distY) || (e.distX < e.distY && e.distX > -e.distY)) {
            return e.preventDefault();
          } else {
            this.stop();
            if (this.options.parallax) {
              this.currentBgPosition = parseInt(this.$slidesContainer.css('background-position'));
            }
            this.hideAnimatedCaptions(this.current - 1);
            this.hideAnimatedCaptions(this.current + 1);
            this.moveStartScroll = parseInt(this.$rel.css('right'), 10);
            this.$rel.stop();
            this.$rel.addClass('drag');
            return this.timeStart = new Date();
          }
        },
        move: function(e) {
          var position;
          if (this.options.parallax) {
            position = Math.round(this.currentBgPosition - e.distX * this.options.parallaxDistance * this.options.parallaxDirection) + 'px 0';
            this.$slidesContainer.css('background-position', position);
          }
          return this.$rel.css('right', this.moveStartScroll - e.distX);
        },
        moveend: function(e) {
          var absDist, distLeftFrac, gWidth, timeDelta, transitionTime;
          absDist = Math.abs(e.distX);
          timeDelta = (new Date()).getTime() - this.timeStart.getTime();
          gWidth = this.getGlobalWidth();
          distLeftFrac = absDist / gWidth;
          transitionTime = (timeDelta / distLeftFrac) * (1 - distLeftFrac);
          transitionTime = transitionTime < 1000 ? transitionTime : 1000;
          this.$rel.removeClass('drag');
          if (absDist < gWidth / this.options.moveDistanceToSlideChange) {
            return this.jump(this.current, transitionTime, true);
          } else {
            if (e.distX < 0) {
              return this.next(transitionTime);
            } else {
              return this.prev(transitionTime);
            }
          }
        },
        stop: function(permanent) {
          if (permanent == null) {
            permanent = true;
          }
          clearInterval(this.interval);
          if (permanent) {
            this.$element.off('mouseover');
            this.$element.off('mouseleave');
          }
          return null;
        },
        start: function() {
          var r;
          r = this;
          return this.interval = setInterval((function() {
            return r.next();
          }), this.options.interval);
        },
        autoplay: function() {
          var r;
          r = this;
          this.stop();
          this.start();
          this.$element.on('mouseover', function() {
            return r.stop(false);
          });
          return this.$element.on('mouseleave', function() {
            r.stop(false);
            return r.start();
          });
        },
        prev: function(transitionTime, noanimation) {
          if (transitionTime == null) {
            transitionTime = this.options.transitionTime;
          }
          if (noanimation == null) {
            noanimation = false;
          }
          this.jump(this.current - 1, transitionTime, noanimation);
          this.options.onSlidePrev.call(this);
          return this.options.onSlidePageChange.call(this);
        },
        next: function(transitionTime, noanimation) {
          if (transitionTime == null) {
            transitionTime = this.options.transitionTime;
          }
          if (noanimation == null) {
            noanimation = false;
          }
          this.jump(this.current + 1, transitionTime, noanimation);
          this.options.onSlideNext.call(this);
          return this.options.onSlidePageChange.call(this);
        }
      };
      $.fn.responsiveSlider = function(option) {
        var init, options, publicFunc, r, run;
        r = this;
        options = $.extend({}, $.fn.responsiveSlider.defaults, typeof option === 'object' && option);
        options.animations = $.fn.responsiveSlider.animations;
        publicFunc = {
          next: 'next',
          prev: 'prev',
          stop: 'stop',
          start: 'autoplay'
        };
        init = function($this) {
          var $firstSlide, $lastSlide, data, slides;
          options = $.metadata ? $.extend({}, options, $this.metadata()) : options;
          slides = $this.find('ul li');
          if (slides.length > 1) {
            $firstSlide = $(slides[0]);
            $lastSlide = $(slides[slides.length - 1]);
            $firstSlide.before($lastSlide.clone());
            $lastSlide.after($firstSlide.clone());
          }
          $this.data('slider', (data = new Slider($this, options)));
          if (options.autoplay) {
            data.interval = setInterval((function() {
              return data.next();
            }), options.interval);
            data.autoplay();
          }
          $(window).on('resize', function() {
            return data.resize();
          });
          $this.find('[data-jump]').on('click', function() {
            data[$(this).data('jump')]();
            return false;
          });
          $this.find('[data-jump-to]').on('click', function() {
            data.jump($(this).data('jump-to') + 1);
            return false;
          });
          if (options.touch) {
            return $this.find('[data-group="slide"]').on('movestart', function(e, $this) {
              return data.movestart(e);
            }).on('move', function(e) {
              return data.move(e);
            }).on('moveend', function(e) {
              return data.moveend(e);
            });
          }
        };
        run = function() {
          return r.each(function() {
            var $this, data;
            $this = $(this);
            data = $this.data('slider');
            if (!data) {
              init($this, options);
            } else if (typeof option === 'string') {
              data[publicFunc[option]]();
            } else if (typeof option === 'number') {
              data.jump(Math.abs(option) + 1);
            }
            return $this;
          });
        };
        if ($.fn.responsiveSlider.run) {
          return run();
        } else {
          $(window).on('load', run);
          return $.fn.responsiveSlider.run = true;
        }
      };
      $.fn.responsiveSlider.animations = {
        slideAppearRightToLeft: function($caption, delay, length) {
          var animate, css;
          if (delay == null) {
            delay = 0;
          }
          if (length == null) {
            length = 300;
          }
          css = {
            'margin-left': 100,
            'margin-right': -100
          };
          $caption.css(css);
          animate = function() {
            css = {
              'margin-left': 0,
              'margin-right': 0,
              'opacity': 1
            };
            return $caption.animate(css, length);
          };
          if (delay > 0) {
            return setTimeout(animate, delay);
          } else {
            return animate();
          }
        },
        slideAppearLeftToRight: function($caption, delay, length) {
          var animate, css;
          if (delay == null) {
            delay = 0;
          }
          if (length == null) {
            length = 300;
          }
          css = {
            'margin-left': -100,
            'margin-right': 100
          };
          $caption.css(css);
          animate = function() {
            css = {
              'margin-left': 0,
              'margin-right': 0,
              'opacity': 1
            };
            return $caption.animate(css, length);
          };
          if (delay > 0) {
            return setTimeout(animate, delay);
          } else {
            return animate();
          }
        },
        slideAppearUpToDown: function($caption, delay, length) {
          var animate, css;
          if (delay == null) {
            delay = 0;
          }
          if (length == null) {
            length = 300;
          }
          css = {
            'margin-top': 100,
            'margin-bottom': -100
          };
          $caption.css(css);
          animate = function() {
            css = {
              'margin-top': 0,
              'margin-bottom': 0,
              'opacity': 1
            };
            return $caption.animate(css, length);
          };
          if (delay > 0) {
            return setTimeout(animate, delay);
          } else {
            return animate();
          }
        },
        slideAppearDownToUp: function($caption, delay, length) {
          var animate, css;
          if (delay == null) {
            delay = 0;
          }
          if (length == null) {
            length = 300;
          }
          css = {
            'margin-top': -100,
            'margin-bottom': 100
          };
          $caption.css(css);
          animate = function() {
            css = {
              'margin-top': 0,
              'margin-bottom': 0,
              'opacity': 1
            };
            return $caption.animate(css, length);
          };
          if (delay > 0) {
            return setTimeout(animate, delay);
          } else {
            return animate();
          }
        }
      };
      $.fn.responsiveSlider.defaults = {
        autoplay: false,
        interval: 5000,
        touch: true,
        parallax: false,
        parallaxDistance: 1 / 10,
        parallaxDirection: 1,
        transitionTime: 300,
        moveDistanceToSlideChange: 4,
        onSlideChange: function() {},
        onSlideNext: function() {},
        onSlidePrev: function() {},
        onSlidePageChange: function() {}
      };
      $.fn.responsiveSlider.run = false;
      spy = $('[data-spy="responsive-slider"]');
      if (spy.length) {
        opts = {};
        if (autoplay = spy.data('autoplay')) {
          opts.autoplay = autoplay;
        }
        if (interval = spy.data('interval')) {
          opts.interval = interval;
        }
        if (parallax = spy.data('parallax')) {
          opts.parallax = parallax;
        }
        if (parallaxDistance = spy.data('parallax-distance')) {
          opts.parallaxDistance = parseInt(parallaxDistance, 10);
        }
        if (parallaxDirection = spy.data('parallax-direction')) {
          opts.parallaxDirection = parseInt(parallaxDirection, 10);
        }
        if (!(touch = spy.data('touch'))) {
          opts.touch = touch;
        }
        if (transitionTime = spy.data('transitiontime')) {
          opts.transitionTime = transitionTime;
        }
        spy.responsiveSlider(opts);
      }
      return null;
    })(jQuery);
  
  }).call(this);
  