// Slideshow plugin.
(function($) {
	
	$.fn.slideshow = function(args) {
		
		var defaults = {
			slideDuration: 2000,
			autoplay: true
		};
		var opts = $.extend(defaults, args);
		var place = $(this);
		
		var ss = {};
		ss.slides = place.find('li');
		ss.pos = ss.slides.length-1;
		ss.controls = $("<div class='controls'><span></span><a href='#' class='previous'>&larr;</a><a href='#' class='pause'>||</a><a href='#' class='next'>&rarr;</a></div>");
		ss.controls.hide().appendTo(place);

		// Add some public methods
		ss.showControls = function() {
			ss.slideTitle();
			place.find('div.controls')
				.css({height: 0, opacity:0})
				.animate({height:'5em', opacity:1}, 150);
		};
		ss.hideControls = function() {
			place.find('div.controls').animate({height:0, opacity:0}, 600);
			ss.controlsvisible = false;
		};
		ss.slideTitle = function() {
			var title = ss.slides.eq(ss.pos).text();
			place.find('div.controls span').text(title);	
		};
    ss.startPlaying = function() {
      if (ss.timer) return;
      ss.showNext();
      ss.timer = setInterval(function(){
        ss.showNext();
      }, opts.slideDuration);
      place.addClass("playing");
      place.removeClass("paused");
    };
    ss.stopPlaying = function() {
      clearTimeout(ss.timer);
      ss.timer = null;
      place.removeClass("playing");
      place.addClass("paused");
    };
		ss.showNext = function() {
      var nextPos = (ss.pos+1) % ss.slides.length;
      if (ss.isLoaded(ss.pos) && ss.isLoaded(nextPos)) ss.transition(ss.pos = nextPos);
    }
		ss.showPrev = function() {
      var prevPos = (ss.slides.length + ss.pos-1) % ss.slides.length;
      if (ss.isLoaded(prevPos)) ss.transition(ss.pos = prevPos);
    }
		ss.pause = function() {
      ss.timer ? ss.stopPlaying() : ss.startPlaying();
    }
		ss.next = function() {
      ss.showNext();
      ss.stopPlaying();
		};
		ss.previous = function() {
      ss.showPrev();
      ss.stopPlaying();
		};
		ss.transition = function(slideNum) {	
			ss.slides.eq(slideNum)
				.css({opacity:0})
				.show()
				.insertBefore(ss.controls)
				.animate({opacity:1}, 1000);
			ss.slideTitle();
		};
    ss.isLoaded = function(slideNum) {
      return imagesLoaded[ss.slides.eq(slideNum).find("img").attr("src")];
    }
				
		// events
		place.hover(
			function(){
				ss.showControls();
			},
			function(){
				ss.hideControls();
			}
		);
		place.click(function(ev){
      $(ev.target).blur();
      var handler = ss[ev.target.className];
      if (handler) {
        handler.apply();
        return false;
      }
		});

		if(opts.autoplay) {
			ss.startPlaying();
		}
		return ss;
	};
	
})(jQuery);
