/*! ResponsiveSlides.js v1.32

 * http://responsiveslides.com

 * http://viljamis.com

 *

 * Copyright (c) 2011-2012 @viljamis

 * Available under the MIT license

 */



/*jslint browser: true, sloppy: true, vars: true, plusplus: true, indent: 2 */



(function ($, window, i) {

  $.fn.responsiveSlides = function (options) {



    // Default settings

    var settings = $.extend({

      "auto": true,             // Boolean: Animate automatically, true or false

      "speed": 1000,            // Integer: Speed of the transition, in milliseconds

      "timeout": 4000,          // Integer: Time between slide transitions, in milliseconds

      "pager": false,           // Boolean: Show pager, true or false

      "nav": false,             // Boolean: Show navigation, true or false

      "random": false,          // Boolean: Randomize the order of the slides, true or false

      "pause": false,           // Boolean: Pause on hover, true or false

      "pauseControls": false,   // Boolean: Pause when hovering controls, true or false

      "prevText": "Previous",   // String: Text for the "previous" button

      "nextText": "Next",       // String: Text for the "next" button

      "maxwidth": "",           // Integer: Max-width of the slideshow, in pixels

      "controls": "",           // Selector: Where controls should be appended to, default is after the <ul>

      "namespace": "rslides",   // String: change the default namespace used

      before: function () {},   // Function: Before callback

      after: function () {}     // Function: After callback

    }, options);



    return this.each(function () {



      // Index for namespacing

      i++;



      var $this = $(this),



        // Local variables

        selectTab,

        startCycle,

        restartCycle,

        rotate,

        $tabs,



        // Helpers

        index = 0,

        $slide = $this.children(),

        length = $slide.size(),

        fadeTime = parseFloat(settings.speed),

        waitTime = parseFloat(settings.timeout),

        maxw = parseFloat(settings.maxwidth),



        // Namespacing

        namespace = settings.namespace,

        namespaceIdx = namespace + i,



        // Classes

        navClass = namespace + "_nav " + namespaceIdx + "_nav",

        activeClass = namespace + "_here",

        visibleClass = namespaceIdx + "_on",

        slideClassPrefix = namespaceIdx + "_s",



        // Pager

        $pager = $("<ul class='" + namespace + "_tabs " + namespaceIdx + "_tabs' />"),



        // Styles for visible and hidden slides

        visible = {"float": "left", "position": "relative"},

        hidden = {"float": "none", "position": "absolute"},



        // Fading animation

        slideTo = function (idx) {

          settings.before();

          $slide

            .stop()

            .fadeOut(fadeTime, function () {

              $(this)

                .removeClass(visibleClass)

                .css(hidden);

            })

            .eq(idx)

            .fadeIn(fadeTime, function () {

              $(this)

                .addClass(visibleClass)

                .css(visible);

              settings.after();

              index = idx;

            });

        };



      // Random order

      if (settings.random) {

        $slide.sort(function () {

          return (Math.round(Math.random()) - 0.5);

        });

        $this

          .empty()

          .append($slide);

      }



      // Add ID's to each slide

      $slide.each(function (i) {

        this.id = slideClassPrefix + i;

      });



      // Add max-width and classes

      $this.addClass(namespace + " " + namespaceIdx);

      if (options && options.maxwidth) {

        $this.css("max-width", maxw);

      }



      // Hide all slides, then show first one

      $slide

        .hide()

        .eq(0)

        .addClass(visibleClass)

        .css(visible)

        .show();



      // Only run if there's more than one slide

      if ($slide.size() > 1) {



        // Make sure the timeout is at least 100ms longer than the fade

        if (waitTime < fadeTime + 100) {

          return;

        }



        // Pager

        if (settings.pager) {

          var tabMarkup = [];

          $slide.each(function (i) {

            var n = i + 1;

            tabMarkup +=

              "<li>" +

              "<a href='#' class='" + slideClassPrefix + n + "'>" + n + "</a>" +

              "</li>";

          });

          $pager.append(tabMarkup);



          $tabs = $pager.find("a");



          // Inject pager

          if (options.controls) {

            $(settings.controls).append($pager);

          } else {

            $this.after($pager);

          }



          // Select pager item

          selectTab = function (idx) {

            $tabs

              .closest("li")

              .removeClass(activeClass)

              .eq(idx)

              .addClass(activeClass);

          };

        }



        // Auto cycle

        if (settings.auto) {



          startCycle = function () {

            rotate = setInterval(function () {



              // Clear the event queue

              $slide.stop(true, true);



              var idx = index + 1 < length ? index + 1 : 0;



              // Remove active state and set new if pager is set

              if (settings.pager) {

                selectTab(idx);

              }



              slideTo(idx);

            }, waitTime);

          };



          // Init cycle

          startCycle();

        }



        // Restarting cycle

        restartCycle = function () {

          if (settings.auto) {

            // Stop

            clearInterval(rotate);

            // Restart

            startCycle();

          }

        };



        // Pause on hover

        if (settings.pause) {

          $this.hover(function () {

            clearInterval(rotate);

          }, function () {

            restartCycle();

          });

        }



        // Pager click event handler

        if (settings.pager) {

          $tabs.bind("click", function (e) {

            e.preventDefault();



            if (!settings.pauseControls) {

              restartCycle();

            }



            // Get index of clicked tab

            var idx = $tabs.index(this);



            // Break if element is already active or currently animated

            if (index === idx || $("." + visibleClass + ":animated").length) {

              return;

            }



            // Remove active state from old tab and set new one

            selectTab(idx);



            // Do the animation

            slideTo(idx);

          })

            .eq(0)

            .closest("li")

            .addClass(activeClass);



          // Pause when hovering pager

          if (settings.pauseControls) {

            $tabs.hover(function () {

              clearInterval(rotate);

            }, function () {

              restartCycle();

            });

          }

        }



        // Navigation

        if (settings.nav) {

          var navMarkup =

            "<a href='#' class='" + navClass + " prev'>" + settings.prevText + "</a>" +

            "<a href='#' class='" + navClass + " next'>" + settings.nextText + "</a>";



          // Inject navigation

          if (options.controls) {

            $(settings.controls).append(navMarkup);

          } else {

            $this.after(navMarkup);

          }



          var $trigger = $("." + namespaceIdx + "_nav"),

            $prev = $("." + namespaceIdx + "_nav.prev");



          // Click event handler

          $trigger.bind("click", function (e) {

            e.preventDefault();



            // Prevent clicking if currently animated

            if ($("." + visibleClass + ":animated").length) {

              return;

            }



            //  Adds active class during slide animation

            //  $(this)

            //    .addClass(namespace + "_active")

            //    .delay(fadeTime)

            //    .queue(function (next) {

            //      $(this).removeClass(namespace + "_active");

            //      next();

            //  });



            // Determine where to slide

            var idx = $slide.index($("." + visibleClass)),

              prevIdx = idx - 1,

              nextIdx = idx + 1 < length ? index + 1 : 0;



            // Go to slide

            slideTo($(this)[0] === $prev[0] ? prevIdx : nextIdx);

            if (settings.pager) {

              selectTab($(this)[0] === $prev[0] ? prevIdx : nextIdx);

            }



            if (!settings.pauseControls) {

              restartCycle();

            }

          });



          // Pause when hovering navigation

          if (settings.pauseControls) {

            $trigger.hover(function () {

              clearInterval(rotate);

            }, function () {

              restartCycle();

            });

          }

        }



      }



      // Max-width fallback

      if (typeof document.body.style.maxWidth === "undefined" && options.maxwidth) {

        var widthSupport = function () {

          $this.css("width", "100%");

          if ($this.width() > maxw) {

            $this.css("width", maxw);

          }

        };



        // Init fallback

        widthSupport();

        $(window).bind("resize", function () {

          widthSupport();

        });

      }



    });



  };

})(jQuery, this, 0);



