(function($) {

  /*
    Image Slideshow for sentres
    ===========================

    Requirements:
    -------------
    - jQuery 1.4 
    - jQuery Tools 1.2.0 + components: scrollable, scrollable.autoscroll, scrollable.navigator
    - jQuery TouchWipe 1.0 by Andreas Waltl, netCU Internetagentur (http://www.netcu.de)
    - jQuery HoverIntent r5 http://cherne.net/brian/resources/jquery.hoverIntent.html

    Usage:
    ------

		TODO


    Minimum CSS:
    ------------

    .slider,
    .slider .swrap {
      width:972px;
      height:506px;
    }

    .slider {
      position:relative;
      overflow:hidden;
    }

    .slider .swrap {
      position:relative;
      overflow:hidden;
    }

    .slider .items {
      width:20000em;
      position:absolute;
    }

    .slider .items > * {
      float:left;
    }


    Change slideshow dimensions:
    ----------------------------

    #slider1,
    #slider1 .swrap {
      height:500px;
    }

    If you modify width, you will also have to change the overlay css.


    Options:
    --------

    $("#slider").senSlide({
      description: true,           // show descriptions (title-tags oder p-elements) (default: true)
      autoHideDescription: true,   // show description only on mouseover
      controls: true,              // show controls (l/r arrows) (default: true)
      minimap: true,               // show minimap (default: true)
      minimap_cols 3,              // maximum number of cols in minimap (default: 3)
      minimap_mincols: 2,          // minimum number of cols in minimap (default: 2)
      minimap_width: 12,           // col-width in px
      circular: true,              // start from beginning after last slide (default: true)
      autoscroll: 5000,            // automatic scrolling every X miliseconds (default: false)
      stop_on_swipe: true,         // stop autoscroll on touchscreen swipe (default: true)
      pause_on_hover: true,        // pause autoscrolling when cursor hovers slider (default: true)
      copyright: "&copy; me",      // show copyright badge if img[data-copyright] is present (default: false)
      copyright_url: '/copyright'  // link to copyright page (default: #)
    });

 */

  $.fn.senSlide = function(options) {
    var opts = $.extend({}, $.fn.senSlide.defaults, options); // Options
    var images = opts.additional_images;
    var is_hovered = false;
    var slider = this; // Slider Dom Object
		var api; // Jquery Tools API

		var addControllOverlay = function() {
			slider.append(
        '<div class="overlay">' +
        '<div class="controls">' +
        (opts.controls === true ? '<a class="prev" />' : '') +
        (opts.minimap  === true ? '<div class="minimap" />' : '') +
        (opts.controls === true ? '<a class="next" />' : '') +
        '</div>' +
        (opts.description === true ? '<p class="descr"><span /></p>' : '') +
        '</div>' +
        (opts.copyright ? '<a class="copyright" href=' + (opts.copyright_url ? opts.copyright_url : '#') + '>' + opts.copyright + '</a>' : '')
      );
		};

		var flashforward = function() {
      slider.find(".next").animate({ opacity: 0.0 }, {queue:true, complete: function() {
        $(this).animate({ opacity: 1.0 }, {queue:true});
      }});
    };

		var extendScrollableApi = function() {

      var first_slide = true;

      // hide image description before slide
      api.onBeforeSeek(function() {
        if (first_slide && is_hovered && opts.autoscroll > 0) {
          api.stop();
          first_slide = false;
          return false;
        }
        this.hideDescription();
      });

      // set image description on slide
      api.onSeek(function(e, i) {
        first_slide = false;
        if (opts.description === true && images[i].title) {
          this.setDescription(images[i].title);
          if (! opts.autoHideDescription || is_hovered) {
            api.getRoot().removeClass("nodescr").addClass("descr");
            this.showDescription();
          }
        } else {
          api.getRoot().removeClass("descr").addClass("nodescr");
        }
        this.setCopyright(opts.copyright, images[i].copyright_url);
      });

      // jquery tools api

      api.hideDescription = function(callback) {
        var root = this.getRoot();

        root.find(".overlay .descr > span").fadeOut("fast", function() {
          if (typeof callback == "function") {
            callback();
          }
        });
      };

      api.showDescription = function(callback) {
        var root = this.getRoot();
        var span = root.find(".overlay .descr > span");

        if (span.css("display") != "block" && ! root.hasClass("nodescr")) {
          span.fadeIn("fast", function() {
            if (typeof callback == "function") {
              callback();
            }
          });
        } else {
          if (typeof callback == "function") {
            callback();
          }
        }
      };

      api.setDescription = function(descr) {
        if (descr === false) {
          api.hideDescription;
          return true;
        }

        if (opts.description === false) {
          return false;
        }
        this.getRoot().find(".overlay .descr > span").html(descr);
      };

      // set (and hide) description on load
      if (opts.autoHideDescription) {
        api.getRoot().find(".overlay .descr > span").hide();
      }

      api.setDescription(images[0].title);

      // show copyright on hover

      api.setCopyright = function(str, url) {
        if (! url) url = opts.copyright_url;
        this.getRoot().find(".copyright").attr("href", url).text(str);
      };

      api.setCopyright(opts.copyright, images[api.getIndex()].copyright_url);

      $(window).blur( function() {
        if(typeof api.stop == "function") {
          api.stop();
        }
      }).focus( function() {
        if(typeof api.play == "function") {
          api.play();
        }
      });
		};
		
		
		var loadCopyrightBehaviour = function(){
			slider.find(".copyright").hover(function() {
        var i = api.getIndex();
        api.setCopyright(images[i].copyright, images[i].copyright_url);
      }, function() {
        api.setCopyright(opts.copyright, images[api.getIndex()].copyright_url);
      });
		};
		
		var preventTitlesOnHover = function(){
			slider.find('.items').children().hover(function() {
				var elem = $(this);
        if (! elem.attr("data-real_title")) {
          elem.attr("data-real_title", elem.attr('title'));
        }
        elem.attr('title', '');
      }, function() {
				var elem = $(this);
        elem.attr('title', elem.attr("data-real_title"));
				elem.attr('data-real_title', '');
      });
		};
		
		var onOver = function() {
      if (! is_hovered) {
        is_hovered = true;
        if (typeof api.stop == "function") {
          api.stop();
          slider.find(".pause").remove();
          $('<div class="pause"><span>Paused</span></div').insertAfter(slider.find(".swrap"));
        }

        if (opts.autoHideDescription && images[api.getIndex()].title) {
          api.getRoot().removeClass("nodescr").addClass("descr");
          api.showDescription();

        }
      }
    };

    var onOut = function() {
      is_hovered = false;
      slider.find(".pause").fadeOut();

      window.setTimeout(function() {
        if (is_hovered === false && typeof api.play === "function") {
          api.play();
        }

      }, opts.autoscroll);

      if (opts.autoHideDescription) {
        api.hideDescription(function() {
          api.getRoot().addClass("nodescr").removeClass("descr");
        });
      }

    };

    var setup_minimap = function() {
      // setup minimap grid
      var mmap = slider.find(".minimap");
      if (mmap && mmap.length > 0) {
        var items =	api.getItems();
        var mmap_cols = Math.ceil(items.length / opts.minimap_cols);
				if (mmap_cols < opts.minimap_mincols && items.length >= opts.minimap_mincols) {
          mmap_cols = opts.minimap_mincols;
        }
        mmap.width((mmap_cols * opts.minimap_width) + "px");
      }
    };
		
    var initialize = function() {
			// IE7 fix
	    if (jQuery.browser.msie && parseInt(jQuery.browser.version,10) == 7) {
	      opts.autoHideDescription = false;
	    }
      // disable slider if not necessary
      if (images.length < 2) {
        opts.circular = false;
        opts.autoscroll = false;
        opts.minimap = false;
        opts.controls = false;
      }

			addControllOverlay();

      if (opts.flashforward) {
        flashforward();
      }

      slider.scrollable({
        circular: opts.circular,
        speed: opts.speed
      });

      if (opts.autoscroll > 0) {
        slider.autoscroll({
          interval: opts.autoscroll,
          autopause: false
        });
      }

      api = slider.data("scrollable");

			extendScrollableApi();
			loadCopyrightBehaviour();
			preventTitlesOnHover();

      var config_class = ''; // why? IE6

      if (opts.description === false) {
        config_class += '_nodescr';
        slider.addClass("nodescr");
      }

      if (opts.autoHideDescription === true) {
        config_class += '_autohidedescr';
        slider.addClass("autohidedescr");
        slider.addClass("nodescr");
      }

      if (opts.controls === false) {
        config_class += '_nocontrols';
        slider.addClass("nocontrols");
      }

      if (opts.minimap !== false) {
        slider.navigator({
          navi: ".minimap",
          autopause: true
        });
        setup_minimap();
      } else {
        config_class += '_nominimap';
      }

      config_class = config_class.replace(/^_+/, '').replace(/_+$/, ''); // trim:"_"
      slider.addClass(config_class);

      if (opts.description === false || opts.autoHideDescription === true) {
        api.hideDescription();
      } else {
        // set initial description
        slider.find(".overlay .descr > span").html(images[0].title);
      }

      api.getRoot().hoverIntent({
        over: onOver,
        out: onOut,
        timeout: 750
      });

    }; // end initialize

    // postload all but first image
		$(document).ready(function() {
			slider.wrapInner('<div class="items" />').wrapInner('<div class="swrap" />');
	    var items = slider.find('.items');
      for (var i=1; i<images.length; i++) {
          if (typeof images[i] == "undefined") continue;
          var item = images[i];
					items.append(
						$('<img />').attr({
              'alt': item.alt,
              'height': item.height,
              'width': item.width,
              'title': item.title,
              'src': item.src,
              'copyright': item.copyright,
              'copyright_url': item.copyright_url
          }));
		  }
			initialize();
		});
  }; // end senSlide

  $.fn.senSlide.defaults = {
		additional_images: [],
    description: true,
    autoHideDescription: true,
    controls: true,
    minimap: true,
    minimap_cols: 3,
    minimap_mincols: 2,
    minimap_width: 12,
    autoscroll: false,
    stop_on_swipe: true,
    pause_on_hover: true,
    circular: true,
    flashforward: false,
    speed: 400,
    copyright: false,
    copyright_url: '#'
  };

})(jQuery);

