text: /**
   * @preserve
   *
   * slippry v1.2.1 - Simple responsive content slider
   * http://slippry.com
   *
   * Author(s): Lukas Jakob Hafner - @saftsaak 
   *
   * Copyright 2013, booncon oy - http://booncon.com
   *
   * Thanks @ http://bxslider.com for the inspiration!
   *
   * Released under the MIT license - http://opensource.org/licenses/MIT
   */
  
  (function ($) {
    "use strict";
    var defaults;
  
    defaults = {
      // general elements & wrapper
      slippryWrapper: '<div class="sy-box" />', // wrapper to wrap everything, including pager
      slideWrapper: '<div class="sy-slides-wrap" />', // wrapper to wrap sildes & controls
      slideCrop: '<div class="sy-slides-crop" />', //additional wrapper around just the slides
      boxClass: 'sy-list', // class that goes to original element
      elements: 'li', // elments cointaining slide content
      activeClass: 'sy-active', // class for current slide
      fillerClass: 'sy-filler', // class for element that acts as intrinsic placholder
      loadingClass: 'sy-loading',
  
      // options
      adaptiveHeight: true, // height of the sliders adapts to current slide
      start: 1, // num (starting from 1), random
      loop: true, // first -> last & last -> first arrows
      captionsSrc: 'img', // img, el [img takes caption from alt or title, el from title of slide element]
      captions: 'overlay', // Position: overlay, below, custom, false
      captionsEl: '.sy-caption', // $ selector for captions wrapper
      initSingle: true, // initialise even if there is only one slide
      responsive: true,
      preload: 'visible', // visible, all | resources to wait for until showing slider
  
      // pager
      pager: true,
      pagerClass: 'sy-pager',
  
      // controls
      controls: true,
      controlClass: 'sy-controls',
      prevClass: 'sy-prev',
      prevText: 'Previous',
      nextClass: 'sy-next',
      nextText: 'Next',
      hideOnEnd: true,
  
      // transitions
      transition: 'fade', // fade, horizontal, vertical, kenburns, false
      kenZoom: 120, // max zoom for kenburns (in %)
      slideMargin: 0, // spacing between slides (in %)
      transClass: 'transition', // [Class applied to [element] while a transition is taking place.]
      speed: 800, // time the transition takes (ms)
      easing: 'swing', // easing to use in the animation [(see... [jquery www])]
      continuous: true, // seamless first/ last transistion, only works with loop
      useCSS: true, // true, false -> fallback to js if no browser support
  
      //slideshow
      auto: true,
      autoDirection: 'next',
      autoHover: true,
      autoHoverDelay: 100,
      autoDelay: 500,
      pause: 4000,
  
      // callback functions
      onSliderLoad: function () { // when slider loaded
        return this;
      },
      onSlideBefore: function () { // before page transition starts
        return this;
      },
      onSlideAfter: function () {  // after page transition happened
        return this;
      }
    };
  
    $.fn.slippry = function (options) {
      var slip, el, prepareFiller, getFillerProportions, init, updateCaption, initPager, initControls, ready, transitionDone, whichTransitionEvent,
        initCaptions, updatePager, setFillerProportions, doTransition, updateSlide, updateControls, updatePos, supports, preload, start, elFromSel, doKens;
  
      // reference to the object calling the function
      el = this;
  
      // if no elements just stop
      if (el.length === 0) {
        return this;
      }
      // support mutltiple elements
      if (el.length > 1) {
        el.each(function () {
          $(this).slippry(options);
        });
        return this;
      }
  
      // variable to access the slider settings across the plugin
      slip = {};
      slip.vars = {};
  
      whichTransitionEvent = function () { // Thanks! http://stackoverflow.com/a/18672988
        var t, div, transitions;
        div = document.createElement('div');
        transitions = {
          'WebkitTransition' : 'webkitTransitionEnd',
          'MozTransition'    : 'transitionend',
          'MSTransition'     : 'msTransitionEnd',
          'OTransition'      : 'oTransitionEnd',
          'transition'       : 'transitionEnd transitionend'
        };
        for (t in transitions) {
          if (div.style[t] !== undefined) {
            return transitions[t];
          }
        }
      };
  
      supports = (function () {  // Thanks! http://net.tutsplus.com/tutorials/html-css-techniques/quick-tip-detect-css-support-in-browsers-with-javascript/
        var div = document.createElement('div'),
          vendors = ['Khtml', 'Ms', 'O', 'Moz', 'Webkit'],
          len = vendors.length;
        return function (prop) {
          if (prop in div.style) {
            return true;
          }
          prop = prop.replace(/^[a-z]/, function (val) {
            return val.toUpperCase();
          });
          while (len--) {
            if (vendors[len] + prop in div.style) {
              return true;
            }
          }
          return false;
        };
      }());
  
      elFromSel = function (sel, prop) {
        var props, newelement, id, className;
        props = prop.split('.');
        newelement = $(sel);
        id = '';
        className = '';
        $.each(props, function (i, val) {
          if (val.indexOf('#') >= 0) {
            id += val.replace(/^#/, '');
          } else {
            className += val + ' ';
          }
        });
        if (id.length) {
          newelement.attr('id', id);
        }
        if (className.length) {
          newelement.attr('class', $.trim(className));
        }
        return newelement;
      };
  
      doKens = function () {
        var kenStart, kenTime, animProp, cssProp;
        animProp = {};
        cssProp = {};
        kenStart = 100 - slip.settings.kenZoom;
        cssProp.width = slip.settings.kenZoom + '%';
        if (slip.vars.active.index() % 2 === 0) {
          cssProp.left = kenStart + '%';
          cssProp.top = kenStart + '%';
          animProp.left = '0%';
          animProp.top = '0%';
        } else {
          cssProp.left = '0%';
          cssProp.top = '0%';
          animProp.left = kenStart + '%';
          animProp.top = kenStart + '%';
        }
        kenTime = slip.settings.pause + slip.settings.speed * 2;
        slip.vars.active.css(cssProp);
        slip.vars.active.animate(animProp, {duration: kenTime, easing: slip.settings.easing, queue: false});
      };
  
      ready = function () {
        if (slip.vars.fresh) {
          slip.vars.slippryWrapper.removeClass(slip.settings.loadingClass);
          slip.vars.fresh = false;
          if (slip.settings.auto) {
            el.startAuto();
          }
          if (!slip.settings.useCSS && slip.settings.transition === 'kenburns') {
            doKens();
          }
          slip.settings.onSliderLoad.call(undefined, slip.vars.active.index());
        } else {
          $('.' + slip.settings.fillerClass, slip.vars.slideWrapper).addClass('ready');
        }
      };
  
      setFillerProportions = function (width, height) {
        var ratio, p_top, $filler;
        ratio = width / height;
        p_top = 1 / ratio * 100 + '%';  //cool intrinsic trick: http://alistapart.com/article/creating-intrinsic-ratios-for-video
        $filler = $('.' + slip.settings.fillerClass, slip.vars.slideWrapper);
        $filler.css({paddingTop: p_top}); // resizing without the need of js, true responsiveness :)
        ready();
      };
  
      // gets the aspect ratio of the filler element
      getFillerProportions = function ($slide) {
        var width, height;
        if (($('img', $slide).attr("src") !== undefined)) {
          $("<img />").load(function () {
            width = $slide.width();
            height = $slide.height();
            setFillerProportions(width, height);
          }).attr("src", $('img', $slide).attr("src"));
        } else {
          width = $slide.width();
          height = $slide.height();
          setFillerProportions(width, height);
        }
      };
  
      // prepares a div to occupy the needed space
      prepareFiller = function () {
        if ($('.' + slip.settings.fillerClass, slip.vars.slideWrapper).length === 0) {
          slip.vars.slideWrapper.append($('<div class="' + slip.settings.fillerClass + '" />'));
        }
        if (slip.settings.adaptiveHeight === true) {  // if the slides shoud alwas adapt to their content
          getFillerProportions($('.' + slip.settings.activeClass, el));  // set the filler height on the active element
        } else {  // otherwise get the highest element
          var $highest, height, loop;
          height = 0;
          loop = 0;
          $(slip.vars.slides).each(function () {
            if ($(this).height() > height) {
              $highest = $(this);
              height = $highest.height();
            }
            loop = loop + 1;
            if (loop === slip.vars.count) {
              if ($highest === undefined) {
                $highest = $($(slip.vars.slides)[0]);
              }
              getFillerProportions($highest);
            }
          });
        }
      };
  
      updatePager = function () {
        if (slip.settings.pager) {
          $('.' + slip.settings.pagerClass + ' li', slip.vars.slippryWrapper).removeClass(slip.settings.activeClass);
          $($('.' + slip.settings.pagerClass + ' li', slip.vars.slippryWrapper)[slip.vars.active.index()]).addClass(slip.settings.activeClass);
        }
      };
  
      updateControls = function () {
        if (!slip.settings.loop && slip.settings.hideOnEnd) {
          $('.' + slip.settings.prevClass, slip.vars.slippryWrapper)[slip.vars.first ? 'hide' : 'show']();
          $('.' + slip.settings.nextClass, slip.vars.slippryWrapper)[slip.vars.last ? 'hide' : 'show']();
        }
      };
  
      updateCaption = function () {
        var caption, wrapper;
        if (slip.settings.captions !== false) {
          if (slip.settings.captionsSrc !== 'img') {
            caption = slip.vars.active.attr('title');
          } else {
            caption = $('img', slip.vars.active).attr('title') !== undefined ? $('img', slip.vars.active).attr('title') : $('img', slip.vars.active).attr('alt');
          }
          if (slip.settings.captions !== 'custom') {
            wrapper = $(slip.settings.captionsEl, slip.vars.slippryWrapper);
          } else {
            wrapper = $(slip.settings.captionsEl);
          }
          if ((caption !== undefined) && (caption !== '')) {
            wrapper.html(caption).show();
          } else {
            wrapper.hide();
          }
        }
      };
  
      el.startAuto = function () {
        if ((slip.vars.timer === undefined) && (slip.vars.delay === undefined)) {
          slip.vars.delay = window.setTimeout(function () {
            slip.vars.autodelay = false;
            slip.vars.timer = window.setInterval(function () {
              slip.vars.trigger = 'auto';
              el.goToSlide(slip.settings.autoDirection);
            }, slip.settings.pause);
          }, slip.vars.autodelay ? slip.settings.autoHoverDelay : slip.settings.autoDelay);
        }
        if (slip.settings.autoHover) {
          slip.vars.slideWrapper.unbind('mouseenter').unbind('mouseleave').bind('mouseenter', function () {
            if (slip.vars.timer !== undefined) {
              slip.vars.hoverStop = true;
              el.stopAuto();
            } else {
              slip.vars.hoverStop = false;
            }
          }).bind('mouseleave', function () {
            if (slip.vars.hoverStop) {
              slip.vars.autodelay = true;
              el.startAuto();
            }
          });
        }
      };
  
      el.stopAuto = function () {
        window.clearInterval(slip.vars.timer);
        slip.vars.timer = undefined;
        window.clearTimeout(slip.vars.delay);
        slip.vars.delay = undefined;
      };
  
      // refreshes the already initialised slider
      el.refresh = function () {
        slip.vars.slides.removeClass(slip.settings.activeClass);
        slip.vars.active.addClass(slip.settings.activeClass);
        if (slip.settings.responsive) {
          prepareFiller();
        } else {
          ready();
        }
        updateControls();
        updatePager();
        updateCaption();
      };
  
      updateSlide = function () {
        el.refresh();
      };
  
      transitionDone = function () {
        slip.vars.moving = false;
        slip.vars.active.removeClass(slip.settings.transClass);
        if (!slip.vars.fresh) {
          slip.vars.old.removeClass('sy-ken');
        }
        slip.vars.old.removeClass(slip.settings.transClass);
        slip.settings.onSlideAfter.call(undefined, slip.vars.active, slip.vars.old.index(), slip.vars.active.index());
      };
  
      doTransition = function () {
        var pos, jump, old_left, old_pos, kenTime, ref, cssProp;
        slip.settings.onSlideBefore.call(undefined, slip.vars.active, slip.vars.old.index(), slip.vars.active.index());
        if (slip.settings.transition !== false) {
          slip.vars.moving = true;
          if ((slip.settings.transition === 'fade') || (slip.settings.transition === 'kenburns')) {
            if (slip.vars.fresh) {
              if (slip.settings.useCSS) {
                slip.vars.slides.css({transitionDuration: slip.settings.speed + 'ms', opacity: 0});
              } else {
                slip.vars.slides.css({opacity: 0});
              }
              slip.vars.active.css('opacity', 1);
              if (slip.settings.transition === 'kenburns') {
                if (slip.settings.useCSS) {
                  kenTime = slip.settings.pause + slip.settings.speed * 2;
                  slip.vars.slides.css({animationDuration: kenTime + 'ms'});
                  slip.vars.active.addClass('sy-ken');
                }
              }
              transitionDone();
            } else {
              if (slip.settings.useCSS) {
                slip.vars.old.addClass(slip.settings.transClass).css('opacity', 0);
                slip.vars.active.addClass(slip.settings.transClass).css('opacity', 1);
                if (slip.settings.transition === 'kenburns') {
                  slip.vars.active.addClass('sy-ken');
                }
                $(window).off('focus').on('focus', function () { // bugfix for safari 7 which doesn't always trigger ontransitionend when switching tab
                  if (slip.vars.moving) {
                    slip.vars.old.trigger(slip.vars.transition);
                  }
                });
                slip.vars.old.one(slip.vars.transition, function () {
                  transitionDone();
                  return this;
                });
              } else {
                if (slip.settings.transition === 'kenburns') {
                  doKens();
                }
                slip.vars.old.addClass(slip.settings.transClass).animate({
                  opacity: 0
                }, slip.settings.speed, slip.settings.easing, function () {
                  transitionDone();
                });
                slip.vars.active.addClass(slip.settings.transClass).css('opacity', 0).animate({
                  opacity: 1
                }, slip.settings.speed, slip.settings.easing);
              }
            }
            updateSlide();
          } else if ((slip.settings.transition === 'horizontal') || (slip.settings.transition === 'vertical')) {
            ref = (slip.settings.transition === 'horizontal') ? 'left' : 'top';
            pos = '-' + slip.vars.active.index() * (100 + slip.settings.slideMargin) + '%';
            if (slip.vars.fresh) {
              el.css(ref, pos);
              transitionDone();
            } else {
              cssProp = {};
              if (slip.settings.continuous) {
                if (slip.vars.jump && ((slip.vars.trigger === 'controls') || (slip.vars.trigger === 'auto'))) {
                  jump = true;
                  old_pos = pos;
                  if (slip.vars.first) {
                    old_left = 0;
                    slip.vars.active.css(ref, slip.vars.count * (100 + slip.settings.slideMargin) + '%');
                    pos = '-' + slip.vars.count * (100 + slip.settings.slideMargin) + '%';
                  } else {
                    old_left = (slip.vars.count - 1) * (100 + slip.settings.slideMargin) + '%';
                    slip.vars.active.css(ref, -(100 + slip.settings.slideMargin) + '%');
                    pos = (100 + slip.settings.slideMargin) + '%';
                  }
                }
              }
              slip.vars.active.addClass(slip.settings.transClass);
              if (slip.settings.useCSS) {
                cssProp[ref] = pos;
                cssProp.transitionDuration = slip.settings.speed + 'ms';
                el.addClass(slip.settings.transition);
                el.css(cssProp);
                $(window).off('focus').on('focus', function () { // bugfix for safari 7 which doesn't always trigger ontransitionend when switching tab
                  if (slip.vars.moving) {
                    el.trigger(slip.vars.transition);
                  }
                });
                el.one(slip.vars.transition, function () {
                  el.removeClass(slip.settings.transition);
                  if (jump) {
                    slip.vars.active.css(ref, old_left);
                    cssProp[ref] = old_pos;
                    cssProp.transitionDuration = '0ms';
                    el.css(cssProp);
                  }
                  transitionDone();
                  return this;
                });
              } else {
                cssProp[ref] = pos;
                el.stop().animate(cssProp, slip.settings.speed, slip.settings.easing, function () {
                  if (jump) {
                    slip.vars.active.css(ref, old_left);
                    el.css(ref, old_pos);
                  }
                  transitionDone();
                  return this;
                });
              }
            }
            updateSlide();
          }
        } else {
          updateSlide();
          transitionDone();
        }
      };
  
      updatePos = function (slide) {
        slip.vars.first = false;
        slip.vars.last = false;
        if ((slide === 'prev') || (slide === 0)) {
          slip.vars.first = true;
        } else if ((slide === 'next') || (slide === slip.vars.count - 1)) {
          slip.vars.last = true;
        }
      };
  
      el.goToSlide = function (slide) {
        var current;
        if (!slip.vars.moving) {
          current = slip.vars.active.index();
          if (slide === 'prev') {
            if (current > 0) {
              slide = current - 1;
            } else if (slip.settings.loop) {
              slide = slip.vars.count - 1;
            }
          } else if (slide === 'next') {
            if (current < slip.vars.count - 1) {
              slide = current + 1;
            } else if (slip.settings.loop) {
              slide = 0;
            }
          } else {
            slide = slide - 1;
          }
          slip.vars.jump = false;
          if ((slide !== 'prev') && (slide !== 'next') && ((slide !== current) || (slip.vars.fresh))) {
            updatePos(slide);
            slip.vars.old = slip.vars.active;
            slip.vars.active = $(slip.vars.slides[slide]);
            if (((current === 0) && (slide === slip.vars.count - 1)) || ((current === slip.vars.count - 1) && (slide === 0))) {
              slip.vars.jump = true;
            }
            doTransition();
          }
        }
      };
  
      el.goToNextSlide = function () {
        el.goToSlide('next');
      };
  
      el.goToPrevSlide = function () {
        el.goToSlide('prev');
      };
  
      initPager = function () {
        if ((slip.settings.pager) && (slip.vars.count > 1)) {
          var count, loop, pager;
          count = slip.vars.slides.length;
          pager = $('<ul class="' + slip.settings.pagerClass + '" />');
          for (loop = 1; loop < count + 1; loop = loop + 1) {
            pager.append($('<li />').append($('<a href="#' + loop + '">' + loop + '</a>')));
          }
          slip.vars.slippryWrapper.append(pager);
          $('.' + slip.settings.pagerClass + ' a', slip.vars.slippryWrapper).click(function () {
            slip.vars.trigger = 'pager';
            el.goToSlide(parseInt(this.hash.split('#')[1], 10));
            return false;
          });
          updatePager();
        }
      };
  
      initControls = function () {
        if ((slip.settings.controls) && (slip.vars.count > 1)) {
          slip.vars.slideWrapper.append(
            $('<ul class="' + slip.settings.controlClass + '" />')
              .append('<li class="' + slip.settings.prevClass + '"><a href="#prev">' + slip.settings.prevText + '</a></li>')
              .append('<li class="' + slip.settings.nextClass + '"><a href="#next">' + slip.settings.nextText + '</a></li>')
          );
          $('.' + slip.settings.controlClass + ' a', slip.vars.slippryWrapper).click(function () {
            slip.vars.trigger = 'controls';
            el.goToSlide(this.hash.split('#')[1]);
            return false;
          });
          updateControls();
        }
      };
  
      initCaptions = function () {
        if (slip.settings.captions !== false) {
          if (slip.settings.captions === 'overlay') {
            slip.vars.slideWrapper.append($('<div class="sy-caption-wrap" />').html(elFromSel('<div />', slip.settings.captionsEl)));
          } else if (slip.settings.captions === 'below') {
            slip.vars.slippryWrapper.append($('<div class="sy-caption-wrap" />').html(elFromSel('<div />', slip.settings.captionsEl)));
          }
        }
      };
  
      // actually show the first slide
      start = function () {
        el.goToSlide(slip.vars.active.index() + 1);
      };
  
      // wait for images, iframes to be loaded
      preload = function (slides) {
        var count, loop, elements, container;
        container = (slip.settings.preload === 'all') ? slides : slip.vars.active;
        elements = $('img, iframe', container);
        count = elements.length;
        if (count === 0) {
          start();
          return;
        }
        loop = 0;
        elements.each(function () {
          $(this).one('load error', function () {
            if (++loop === count) {
              start();
            }
          }).each(function () {
            if (this.complete) {
              $(this).load();
            }
          });
        });
      };
  
      el.getCurrentSlide = function () {
        return slip.vars.active;
      };
  
      el.getSlideCount = function () {
        return slip.vars.count;
      };
  
      el.destroySlider = function () {
        if (slip.vars.fresh === false) {
          el.stopAuto();
          slip.vars.moving = false;
          slip.vars.slides.each(function () {
            if ($(this).data("sy-cssBckup") !== undefined) {
              $(this).attr("style", $(this).data("sy-cssBckup"));
            } else {
              $(this).removeAttr('style');
            }
            if ($(this).data("sy-classBckup") !== undefined) {
              $(this).attr("class", $(this).data("sy-classBckup"));
            } else {
              $(this).removeAttr('class');
            }
          });
          if (el.data("sy-cssBckup") !== undefined) {
            el.attr("style", el.data("sy-cssBckup"));
          } else {
            el.removeAttr('style');
          }
          if (el.data("sy-classBckup") !== undefined) {
            el.attr("class", el.data("sy-classBckup"));
          } else {
            el.removeAttr('class');
          }
          slip.vars.slippryWrapper.before(el);
          slip.vars.slippryWrapper.remove();
          slip.vars.fresh = undefined;
        }
      };
  
      el.reloadSlider = function () {
        el.destroySlider();
        init();
      };
  
      // initialises the slider, creates needed markup
      init = function () {
        var first;
        slip.settings = $.extend({}, defaults, options);
        slip.vars.slides = $(slip.settings.elements, el);
        slip.vars.count = slip.vars.slides.length;
        if (slip.settings.useCSS) { // deactivate css transitions on unsupported browsers
          if (!supports('transition')) {
            slip.settings.useCSS = false;
          }
          slip.vars.transition = whichTransitionEvent();
        }
        el.data('sy-cssBckup', el.attr('style'));
        el.data('sy-classBackup', el.attr('class'));
        el.addClass(slip.settings.boxClass).wrap(slip.settings.slippryWrapper).wrap(slip.settings.slideWrapper).wrap(slip.settings.slideCrop);
        slip.vars.slideWrapper = el.parent().parent();
        slip.vars.slippryWrapper = slip.vars.slideWrapper.parent().addClass(slip.settings.loadingClass);
        slip.vars.fresh = true;
        slip.vars.slides.each(function () {
          $(this).addClass('sy-slide ' + slip.settings.transition);
          if (slip.settings.useCSS) {
            $(this).addClass('useCSS');
          }
          if (slip.settings.transition === 'horizontal') {
            $(this).css('left', $(this).index() * (100 + slip.settings.slideMargin) + '%');
          } else if (slip.settings.transition === 'vertical') {
            $(this).css('top', $(this).index() * (100 + slip.settings.slideMargin) + '%');
          }
        });
        if ((slip.vars.count > 1) || (slip.settings.initSingle)) {
          if ($('.' + slip.settings.activeClass, el).index() === -1) {
            if (slip.settings.start === 'random') {
              first = Math.round(Math.random() * (slip.vars.count - 1));
            } else if (slip.settings.start > 0 && slip.settings.start <= slip.vars.count) {
              first = slip.settings.start - 1;
            } else {
              first = 0;
            }
            slip.vars.active = $(slip.vars.slides[first]).addClass(slip.settings.activeClass);
          } else {
            slip.vars.active = $('.' + slip.settings.activeClass, el);
          }
          initControls();
          initPager();
          initCaptions();
          preload(slip.vars.slides);
        } else {
          return this;
        }
      };
  
      init(); // on startup initialise the slider
  
      return this;
    };
  }(jQuery));