/*
 * Agile Carousel v alpha 1.1
 * http://agilecarousel.com/
 *
 * Copyright 2011, Ed Talmadge
 * Dual licensed under the MIT or GPL Version 2 licenses.
 *
 *
 */

(function($)
{

  $.fn.agile_carousel = function(options)
  {

    var defaults = {
      timer : 0,
      continuous_scrolling : false,
      transition_type : "slide",
      transition_time : 600,
      number_slides_visible : 1,
      change_on_hover : "",
      control_set_1 : "",
      control_set_2 : "",
      control_set_3 : "",
      control_set_4 : "",
      control_set_5 : ""
    };

    options = $.extend(defaults, options);

    return this
        .each(function()
        {

          var combined_slide_width = 0;
          var number_of_slides = 0;
          var ac_html = "";
          var ac_content = "";
          var ac_numbered_buttons = "";
          var ac_group_numbered_buttons = "";
          var ac_thumbnails = "";
          var ac_content_buttons = "";
          var ac_pause = "";
          var ac_previous_button = "";
          var ac_next_button = "";
          var ac_hover_previous_button = "";
          var ac_hover_next_button = "";
          var ac_slide_count = "";
          var ac_current_slide_number = "";
          var ac_trigger_type = "ac_click";
          var bd = "";
          var button_type = "";
          var trigger_type = "";
          var button_action = "";
          var go_direct = "";
          var ac_disabled = "";
          var current_slide_number = "";
          var next_slide_number = false;
          var current_slide_index = "";
          var next_slide_index = "";
          var current_slide = "";
          var next_slide = "";
          var continuous_scrolling = options.continuous_scrolling;
          var carousel_outer_width = options.carousel_outer_width;
          var carousel_outer_height = options.carousel_outer_height;
          var carousel_data = options.carousel_data;
          var change_on_hover = options.change_on_hover;
          var slide_width = options.slide_width;
          var slide_height = options.slide_height;
          var control_set_1 = options.control_set_1;
          var control_set_2 = options.control_set_2;
          var control_set_3 = options.control_set_3;
          var control_set_4 = options.control_set_4;
          var control_set_5 = options.control_set_5;
          var no_control_set = options.no_control_set;
          var persistent_content = options.persistent_content;
          var number_slides_visible = options.number_slides_visible;
          var transition_type = options.transition_type;
          var transition_time = options.transition_time;
          var timer = options.timer;
          var content = "";
          var obj_inner = "";
          var content_button = "";
          var $this = "";
          var timer_data = "";
          var ac_timer = "";

          // get the number of slides
          $.each(carousel_data, function(key, value)
          {
            number_of_slides++;
          });

          var slide_remainder = number_of_slides % number_slides_visible;

          var slide_number_conversion_array = [];
          var new_num = "";

          function get_trigger_type(check_me)
          {
            if (change_on_hover !== "") {
              ac_trigger_type = "ac_click";
              var change_on_hover_array = change_on_hover.split(",");
              if ($.inArray(check_me, change_on_hover_array) != -1) {
                ac_trigger_type = "ac_hover";
              }
            }
            return ac_trigger_type;
          } // function

          ////////////////////////
          // Group Numbered Buttons
          ////////////////////////

          var j = 0;
          var i = 0;
          for (i = 0; i < number_of_slides; i++) {

            if (i === 0) {
              ac_group_numbered_buttons += "<div class='group_numbered_buttons_container button_container'>";
            } // if
            var curr_num = Math.floor((i + 1) / number_slides_visible)
                * number_slides_visible;
            if (curr_num !== new_num && curr_num <= number_of_slides) {
              slide_number_conversion_array[j] = curr_num;

              ac_group_numbered_buttons += "<div class='slide_number_"
                  + curr_num
                  + " group_numbered_button slide_button "
                  + get_trigger_type("group_numbered_buttons")
                  + "' data-options='{\"button_type\":\"group_numbered_button\",\"button_action\":\"direct\",\"go_to\":"
                  + curr_num + ", \"trigger_type\":\"" + ac_trigger_type
                  + "\",\"disabled\": false}'>" + (j + 1) + "</div>";

              new_num = curr_num;

              j++;
            }

            if (i === number_of_slides - 1) {
              ac_group_numbered_buttons += "</div>";
            }

          } // for
          ////////////////////////
          // Pause Button
          ////////////////////////
          ac_pause += "<span class='pause_button slide_button pause' data-options='{\"button_type\":\"pause_button\",\"trigger_type\": \"none\",\"disabled\": false,\"paused\": false}'>Pause</span>";

          ////////////////////////
          // Previous Button
          ////////////////////////
          ac_previous_button += "<span class='previous_next_button previous_button slide_button "
              + get_trigger_type("previous_button")
              + "' data-options='{\"button_type\":\"previous_button\",\"button_action\":\"previous\",\"trigger_type\": \""
              + ac_trigger_type + "\",\"disabled\": false}'>Prev</span>";

          ////////////////////////
          // Next Button
          ////////////////////////
          ac_next_button += "<span class='previous_next_button next_button slide_button "
              + get_trigger_type("next_button")
              + "' data-options='{\"button_type\":\"next_button\",\"button_action\":\"next\",\"trigger_type\": \""
              + ac_trigger_type + "\",\"disabled\": false}'>Next</span>";

          ////////////////////////
          // Hover Previous Button
          ////////////////////////
          ac_hover_previous_button += "<div class='hover_previous_next_button hover_previous_button slide_button "
              + get_trigger_type("hover_previous_button")
              + "' data-options='{\"button_type\":\"hover_previous_button\",\"button_action\":\"previous\",\"trigger_type\": \""
              + ac_trigger_type
              + "\",\"disabled\": false}'><span style='opacity: 0;' class='hover_previous_next_button_inner'>Prev</span></div>";

          ////////////////////////
          // Hover Next Button
          ////////////////////////
          ac_hover_next_button += "<div class='hover_previous_next_button hover_next_button slide_button "
              + get_trigger_type("hover_next_button")
              + "' data-options='{\"button_type\":\"hover_next_button\",\"button_action\":\"next\",\"trigger_type\": \""
              + ac_trigger_type
              + "\",\"disabled\": false}'><span style='opacity: 0;' class='hover_previous_next_button_inner'>Next</span></div>";

          ////////////////////////
          // Slide Count
          ////////////////////////
          ac_slide_count += "<span class='slide_count'>" + number_of_slides
              + "</span>";

          ////////////////////////
          // Current Slide Number
          ////////////////////////
          ac_current_slide_number += "<span class='current_slide_number'>1</span>";

          // render beginning of div containers
          ac_html += "<div class='agile_carousel' style='overflow: hidden; position: relative; width: "
              + carousel_outer_width
              + "px; height: "
              + carousel_outer_height
              + "px;'>";

          var obj = $(this);
          i = 1;
          for ( var key in carousel_data) {

            if (carousel_data.hasOwnProperty(key)) {

              obj_inner = carousel_data[key];
              content = obj_inner.content;
              var thumbnail_button = obj_inner.thumbnail_button;
              content_button = obj_inner.content_button;

              ////////////////////////
              // Slides
              ////////////////////////

              if (i === 1) {
                ac_html += "<div class='slides' style='width: " + slide_width
                    * number_of_slides + "px; height: " + slide_height
                    + "px;'>";
              } // if
              if (content) {
                // render
                ac_html += "<div class='slide_"
                    + i
                    + " slide' style='border: none; margin: 0; padding: 0; height: "
                    + slide_height + "px; width: " + slide_width + "px;'>"
                    + content + "</div>";
              } // if obj_inner.content
              if (i === number_of_slides) {
                ac_html += "</div>";
              }

              ////////////////////////
              // Numbered Buttons
              ////////////////////////
              if (i == 1) {
                ac_numbered_buttons += "<div class='numbered_buttons_container  button_container'>";
              } // if
              ac_numbered_buttons += "<div class='slide_number_"
                  + i
                  + " numbered_button slide_button "
                  + get_trigger_type("numbered_buttons")
                  + "' data-options='{\"button_type\":\"numbered_button\",\"button_action\":\"direct\",\"go_to\":"
                  + i + ", \"trigger_type\":\"" + ac_trigger_type
                  + "\",\"disabled\": false}'>" + i + "</div>";

              if (i == number_of_slides) {
                ac_numbered_buttons += "</div>";
              }

              ////////////////////////
              // Thumbnails
              ////////////////////////
              if (thumbnail_button) {

                if (i == 1) {
                  ac_thumbnails += "<div class='thumbnail_buttons_container  button_container'>";
                } // if
                ac_thumbnails += "<div class='slide_number_"
                    + i
                    + " thumbnail_button slide_button "
                    + get_trigger_type("thumbnails")
                    + "'  data-options='{\"button_type\":\"thumbnail_button\",\"button_action\":\"direct\",\"go_to\":"
                    + i + ",\"trigger_type\": \"" + ac_trigger_type
                    + "\",\"disabled\": false}'>" + thumbnail_button + "</div>";

                if (i == number_of_slides) {
                  ac_thumbnails += "</div>";
                } // if

              } // if

              ////////////////////////
              // Content Button
              ////////////////////////
              if (content_button) {

                if (i == 1) {
                  ac_content_buttons += "<div class='content_buttons_container  button_container'>";
                } // if
                ac_content_buttons += "<div class='slide_number_"
                    + i
                    + " content_button_"
                    + i
                    + " content_button slide_button "
                    + get_trigger_type("content_buttons")
                    + "' data-options='{\"button_type\":\"content_button\",\"button_action\":\"direct\",\"go_to\":"
                    + i
                    + ",\"trigger_type\": \""
                    + ac_trigger_type
                    + "\",\"disabled\": false}'><div class='content_button_inner'>"
                    + content_button + "</div></div>";

                if (i == number_of_slides) {
                  ac_content_buttons += "</div>";
                } // if
              }

              i++;

            } // if has own property
          } // for
          var create_control_set = function(set, set_number)
          {
            var control_set_html = "";
            if (set !== "") {
              if (set_number) {
                control_set_html += "<div class='control_set_" + set_number
                    + " control_set'><div class='control_set_" + set_number
                    + "_inner control_set_inner'>";
              }

              var control_set_array = set.split(",");

              for (j = 0; j < control_set_array.length; j++) {

                // numbered_buttons
                if (control_set_array[j] == "numbered_buttons") {
                  control_set_html += ac_numbered_buttons;
                }

                // group_numbered_buttons
                if (control_set_array[j] == "group_numbered_buttons") {
                  control_set_html += ac_group_numbered_buttons;
                }

                // thumbnails
                if (control_set_array[j] == "thumbnails") {
                  control_set_html += ac_thumbnails;
                }
                // content_buttons
                if (control_set_array[j] == "content_buttons") {
                  control_set_html += ac_content_buttons;
                }
                // pause_button
                if (control_set_array[j] == "pause_button") {
                  control_set_html += ac_pause;
                }
                // previous_button
                if (control_set_array[j] == "previous_button") {
                  control_set_html += ac_previous_button;
                }
                // previous_button
                if (control_set_array[j] == "next_button") {
                  control_set_html += ac_next_button;
                }
                // hover_previous_button
                if (control_set_array[j] == "hover_previous_button") {
                  control_set_html += ac_hover_previous_button;
                }
                // hover_next_button
                if (control_set_array[j] == "hover_next_button") {
                  control_set_html += ac_hover_next_button;
                }
                // slide_count
                if (control_set_array[j] == "slide_count") {
                  control_set_html += ac_slide_count;
                }
                // current_slide_number
                if (control_set_array[j] == "current_slide_number") {
                  control_set_html += ac_current_slide_number;
                }

              } // for

              if (set_number) {
                control_set_html += "</div></div>";
              }

              ac_html += control_set_html;

            } // if
          }; // function

          if (options.control_set_1) {
            create_control_set(control_set_1, 1);
          } // if
          if (options.control_set_2) {
            create_control_set(control_set_2, 2);
          } // if
          if (options.control_set_3) {
            create_control_set(control_set_3, 3);
          } // if
          if (options.control_set_4) {
            create_control_set(control_set_4, 4);
          } // if
          if (options.control_set_5) {
            create_control_set(control_set_5, 5);
          } // if
          if (options.no_control_set) {
            create_control_set(no_control_set);
          } // if
          if (persistent_content) {
            ac_html += persistent_content;
          }

          ac_html += "</div>";

          obj.html(ac_html);

          var ac_slides = obj.find(".slide");
          var ac_slides_container = obj.find(".slides");
          var ac_slide_buttons = obj.find(".slide_button");
          var ac_slide_buttons_length = ac_slide_buttons.length;
          var agile_carousel = obj.find(".agile_carousel");

          var ac_previous_buttons = obj
              .find(".previous_button, .hover_previous_button");
          var ac_previous_buttons_length = ac_previous_buttons.length;
          var ac_next_buttons = obj.find(".next_button, .hover_next_button");

          // kludge - above variables not working in disable_buttons function - disabled is undefined in disable_buttons function
          var previous_button = obj.find(".previous_button");
          var previous_button_length = previous_button.length;
          var hover_previous_button = obj.find(".hover_previous_button");
          var hover_previous_button_length = hover_previous_button.length;
          var next_button = obj.find(".next_button");
          var next_button_length = next_button.length;
          var hover_next_button = obj.find(".hover_next_button");
          var hover_next_button_length = hover_next_button.length;

          function disable_buttons(slide_num)
          {

            if (continuous_scrolling === false && number_slides_visible < 2) {

              // if first slide
              if (slide_num == 1) {
                if (previous_button_length > 0) {
                  previous_button.addClass("ac_disabled");
                  previous_button.data("options").disabled = true;
                } // if
                // error
                if (hover_previous_button_length > 0) {
                  hover_previous_button.addClass("ac_disabled");
                  hover_previous_button.data("options").disabled = true;
                } // if
              }
              else {
                if (previous_button_length > 0) {
                  previous_button.removeClass("ac_disabled");
                  previous_button.data("options").disabled = false;
                } // if
                if (hover_previous_button_length > 0) {
                  hover_previous_button.removeClass("ac_disabled");
                  hover_previous_button.data("options").disabled = false;
                } // if
              }

              // if last slide
              if (slide_num == number_of_slides) {
                if (next_button_length > 0) {
                  next_button.addClass("ac_disabled");
                  next_button.data("options").disabled = true;
                } // if
                if (hover_next_button_length > 0) {
                  hover_next_button.addClass("ac_disabled");
                  hover_next_button.data("options").disabled = true;
                } // if
              }
              else {
                if (next_button_length > 0) {
                  next_button.removeClass("ac_disabled");
                  next_button.data("options").disabled = false;
                } // if
                if (hover_next_button_length > 0) {
                  hover_next_button.removeClass("ac_disabled");
                  hover_next_button.data("options").disabled = false;
                } // if
              }

            } // if

            if (continuous_scrolling === false && number_slides_visible > 1) {

              // if first slide
              if (slide_num <= number_slides_visible) {
                if (previous_button_length > 0) {
                  previous_button.addClass("ac_disabled");
                  previous_button.data("options").disabled = true;
                } // if
                if (hover_previous_button_length > 0) {
                  hover_previous_button.addClass("ac_disabled");
                  hover_previous_button.data("options").disabled = true;
                } // if
              }
              else {
                if (previous_button_length > 0) {
                  previous_button.removeClass("ac_disabled");
                  previous_button.data("options").disabled = false;
                } // if
                if (hover_previous_button_length > 0) {
                  hover_previous_button.removeClass("ac_disabled");
                  hover_previous_button.data("options").disabled = false;
                } // if
              }

              // if last slide
              if (slide_num >= (number_of_slides - number_slides_visible + slide_remainder)) {
                if (next_button_length > 0) {
                  next_button.addClass("ac_disabled");
                  next_button.data("options").disabled = true;
                } // if
                if (hover_next_button_length > 0) {
                  hover_next_button.addClass("ac_disabled");
                  hover_next_button.data("options").disabled = true;
                } // if
              }
              else {
                if (next_button_length > 0) {
                  next_button.removeClass("ac_disabled");
                  next_button.data("options").disabled = false;
                } // if
                if (hover_next_button_length > 0) {
                  hover_next_button.removeClass("ac_disabled");
                  hover_next_button.data("options").disabled = false;
                } // if
              }

            } // if

          } // function

          var current_slide_number_display = obj.find(".current_slide_number");
          var current_slide_number_display_length = current_slide_number_display.length;

          // update slide number

          function update_current_slide_number(slide_num)
          {
            if (current_slide_number_display_length > 0) {
              current_slide_number_display.html(slide_num);
            }
          }

          // add/remove class for buttons corresponding to selected slides

          function add_selected_class(slide_num)
          {
            obj.find(".ac_selected").removeClass("ac_selected");
            obj.find(".slide_number_" + slide_num).addClass("ac_selected");
          }

          // prepare carousel for number_slides_visible = 1
          if (number_slides_visible == 1) {
            ac_slides.eq(0).css({
              "position" : "absolute",
              "top" : 0,
              "left" : 0
            });
            ac_slides.slice(1, number_of_slides).css({
              "position" : "absolute",
              "top" : "-5000px",
              "left" : 0
            });
            ac_slides_container.css("width", slide_width + "px");

          }

          // prepare carousel for number_slides_visible > 1
          if (number_slides_visible > 1) {

            agile_carousel.css("width", number_slides_visible * slide_width
                + "px");

            var k = 0;

            for (k = 1; k <= number_of_slides; k++) {

              ac_slides.eq(k).css({
                "position" : "absolute",
                "top" : 0,
                "left" : slide_width * k + "px"

              });
            } // for
          } // if

          var fade_complete = function()
          {
            current_slide.css({
              "z-index" : 10,
              top : -5000
            });
          };

          var slide_complete = function()
          {
            current_slide.css({
              "position" : "absolute",
              "top" : "-5000px",
              "left" : 0
            });
          };

          // prepare carousel for all
          disable_buttons(1);
          update_current_slide_number(1);
          add_selected_class(1);

          // if a hoveer transition button is hovered over for 1 seconds, then simulate click
          button_type = bd.button_type;
          current_slide_number = 1;

          var slide_number_conversion_array_last = slide_number_conversion_array[slide_number_conversion_array.length - 1];

          ///////////////////////////////
          ///////////////////////////////
          ///////// Transition Slides
          ///////////////////////////////
          ///////////////////////////////

          function transition_slides(button_data)
          {

            bd = $(button_data)[0];
            var ac_disabled = bd.disabled;

            if (ac_disabled !== true) {

              button_type = bd.button_type;
              trigger_type = bd.trigger_type;
              button_action = bd.button_action;
              var go_to = bd.go_to;
              ac_disabled = bd.disabled;

              if (next_slide_number !== false) {
                current_slide_number = next_slide_number;
              }

              current_slide_index = current_slide_number - 1;
              current_slide = $(ac_slides).eq(current_slide_index);

              // calculate the next_slide_number
              ///////////////////////////
              ///////////////////////////
              ////// One Slide Visible
              ///////////////////////////
              ///////////////////////////
              if (number_slides_visible < 2) {
                if (button_action == "next"
                    && current_slide_number < number_of_slides) {
                  next_slide_number = current_slide_number + 1;
                }
                else if (button_action == "next"
                    && current_slide_number == number_of_slides) {
                  next_slide_number = 1;
                }

                // go back
                if (button_action == "previous" && current_slide_number > 1) {
                  next_slide_number = current_slide_number - 1;

                  // go to last slide position
                }
                else if (button_action == "previous"
                    && current_slide_number == 1) {
                  next_slide_number = number_of_slides;
                }

              } // if
              ///////////////////////////
              ///////////////////////////
              ////// Multiple Slides Visible
              ///////////////////////////
              ///////////////////////////
              if (number_slides_visible > 1) {

                if (button_action == "next"
                    && current_slide_number < (number_of_slides
                        - number_slides_visible + slide_remainder)) {

                  next_slide_number = slide_number_conversion_array[Math
                      .ceil(current_slide_number / number_slides_visible)];

                }
                else if (button_action == "next"
                    && current_slide_number >= (number_of_slides
                        - number_slides_visible + slide_remainder)
                    && number_slides_visible > 1) {
                  next_slide_number = 1;

                }

                // go back
                if (button_action == "previous"
                    && current_slide_number > number_slides_visible
                    && number_slides_visible > 1) {
                  var curr_lookup = Math.floor(current_slide_number
                      / number_slides_visible);
                  curr_lookup = curr_lookup - 1;
                  next_slide_number = slide_number_conversion_array[curr_lookup];

                  // go to last slide position
                }
                else if (button_action == "previous"
                    && current_slide_number <= number_slides_visible
                    && number_slides_visible > 1) {
                  next_slide_number = slide_number_conversion_array_last;
                }

              } // if
              if (button_action == "direct") {
                next_slide_number = go_to;
              }

              next_slide_index = next_slide_number - 1;
              next_slide = $(ac_slides).eq(next_slide_index);

              add_selected_class(next_slide_number);
              update_current_slide_number(next_slide_number);

              if (next_slide_index != current_slide_index) {

                /////////////////////////////////
                /////////////////////////////////
                ///// Sliding Transition - more than one slide visible
                /////////////////////////////////
                /////////////////////////////////
                if (transition_type == "slide" && number_slides_visible > 1) {

                  ac_slides_container
                      .stop()
                      .animate(
                          {
                            "left" : ((next_slide_number * slide_width) - slide_width)
                                * -1 + "px"
                          }, {
                            duration : transition_time
                          });

                } // if

                /////////////////////////////////
                /////////////////////////////////
                ///// Sliding Transition - 1 slide visible
                /////////////////////////////////
                /////////////////////////////////
                if (transition_type == "slide" && number_slides_visible == 1) {

                  // change slide position - go forward
                  var animate_current_slide_to = "";

                  if (button_action == "next"
                      || (next_slide_number > current_slide_number)
                      && button_action == "direct") {
                    next_slide.css({
                      top : 0,
                      left : slide_width
                    });

                    animate_current_slide_to = slide_width * -1;

                  }

                  // change slide position - go back
                  if (button_action == "previous"
                      || (next_slide_number < current_slide_number && button_action == "direct")) {
                    next_slide.css({
                      top : 0,
                      left : slide_width * -1
                    });

                    animate_current_slide_to = slide_width;
                  }

                  // animate slides

                  //,{  duration:300, complete: fade_complete}
                  current_slide.stop().animate({
                    "left" : animate_current_slide_to + "px"
                  }, {
                    duration : transition_time,
                    complete : slide_complete
                  });
                  next_slide.stop().animate({
                    "left" : "0px"
                  }, {
                    duration : transition_time
                  });

                } // if transition type is slide

                /////////////////////////////////
                /////////////////////////////////
                ///// Fade Transition - 1 slide visible
                /////////////////////////////////
                /////////////////////////////////
                if (transition_type == "fade" && number_slides_visible == 1) {

                  //if(trigger_type == "ac_hover"){
                  //ac_slides.stop();
                  //}
                  // change slide position
                  // rest of the slides
                  ac_slides.not(current_slide, next_slide).css({
                    "top" : "-5000px",
                    "left" : 0,
                    "z-index" : 0,
                    "opacity" : 0
                  });

                  // next slide
                  if (button_action) {
                    next_slide.css({
                      "top" : 0,
                      "left" : 0,
                      "z-index" : 20
                    });

                    // current slide
                    current_slide.css({
                      "z-index" : 10,
                      "opacity" : 1
                    });

                  } // if
                  // animate slides
                  next_slide.stop().animate({
                    "opacity" : 1
                  }, {
                    duration : transition_time,
                    complete : fade_complete
                  });

                } // if transition type is slide
              } // if current slide is not the next slide
            } // if slide button is not disabled && transition complete

            disable_buttons(next_slide_number);
            add_selected_class(next_slide_number);

          } // transition_slides;

          /////////////////////
          ///////// button behavior
          ////////////////////

          var agile_carousel_buttons_click = $('body').find(".ac_click");
          var agile_carousel_buttons_hover = obj.find(".ac_hover");

          // start timer
          if (timer !== 0) {
            ac_timer = setInterval(timer_transition, timer);
          }

          var pause_button = obj.find(".pause_button");

          function pause_slideshow()
          {

            if (pause_button.length > 0) {
              pause_button.html("play");
              pause_button.data("options").paused = true;
              pause_button.addClass("play_button");
            }
            clearInterval(ac_timer);
          } // function

          /////////////////
          //////// click button
          ////////////////

          $(agile_carousel_buttons_click).click(
              function()
              {
                pause_slideshow();
                if (obj.find(':animated').length < 1) {
                  transition_slides($(this).data().options);
                }
                else {
                  $this = $(this);
                  // don't use timer on next & previous buttons... causes strage, infinite cycle
                  if ($this.data("options").button_action != "next"
                      && $this.data("options").button_action != "previous") {
                    function check_transition()
                    {

                      if (ac_slides_container.find(':animated').length < 1) {
                        transition_slides($this.data().options);
                        clearInterval($this.data("options").timeout);
                      } // if
                    } // function

                    t = setInterval(check_transition, 30);

                    $this.data("options").timeout = t;
                  }// if
                } // else

              }); // click

          /////////////////
          //////// hover button
          ////////////////

          $(agile_carousel_buttons_hover).hover(function()
          {
            pause_slideshow();
            if (ac_slides_container.find(':animated').length < 1) {
              transition_slides($(this).data().options);

            }
            else {
              $this = $(this);

              function check_transition()
              {

                if (ac_slides_container.find(':animated').length < 1) {
                  transition_slides($this.data().options);
                  clearInterval($this.data("options").timeout);
                } // if
              } // function

              t = setInterval(check_transition, 30);

              $this.data("options").timeout = t;

            } // else

          }, function()
          {
            $this = $(this);
            clearInterval($this.data("options").timeout);
          });

          ////////////////////////////
          ////////////////////////////
          //////// Timer
          ////////////////////////////
          ////////////////////////////

          timer_data = {
            "button_action" : "next",
            "button_type" : "pause",
            "disabled" : false,
            "trigger_type" : "ac_click"
          };

          function timer_transition()
          {
            transition_slides(timer_data);
          }

          function play_slideshow()
          {
            clearInterval(ac_timer);
            pause_button.html("pause");
            pause_button.data("options").paused = false;
            pause_button.addClass("pause_button");
            pause_button.removeClass("play_button");
            transition_slides(timer_data);
            ac_timer = setInterval(timer_transition, timer);
            return ac_timer;
          } // function
          // play/pause button behavior
          pause_button.click(function()
          {
            var $this = $(this);
            if ($this.data("options").paused === true) {
              play_slideshow();

            }
            else if ($this.data("options").paused === false) {
              pause_slideshow();
              clearInterval(ac_timer);
            }
          }); // click

          // hover previous and hover next buttons

          $('.hover_previous_next_button').hover(
              function()
              {
                $(this).find(".hover_previous_next_button_inner").stop()
                    .fadeTo("fast", 0.85);
              },
              // function
              function()
              {
                $(this).find(".hover_previous_next_button_inner").stop()
                    .fadeTo("fast", 0.00);
              }); // hover

        }); // each
  }; // function
})(jQuery);
