
jQuery.fn.slideshow = function(options) {

	var ss = this;

	ss.options = {
		delay: 2000
	};
	ss.options = $.extend(ss.options, options);

	ss.paused = false;

    ss.current = 0;

    ss.images = ss.find('.images img');

    ss.thumbs = ss.find('.thumbs img');

    ss.controls = ss.find('.images .control');

	ss.onHover = function(e) {
		ss.paused = (e.type == 'mouseenter') ? true : false;

        if (ss.paused) {
            ss.controls.show();
        } else {
            ss.controls.hide();
        }
	};

	ss.onControl = function(e) {
        e.stopPropagation();

		var el = $(e.target);

		if (el.hasClass('next')) {
            ss.gotoNext();
		}

        if (el.hasClass('prev')) {
            ss.gotoPrev();
		}

		return false;
	};

    ss.onThumb = function(e) {
        e.stopPropagation();

        var idx = ss.thumbs.index(e.target);

        ss.gotoSlide(idx);

        return false;
    }

    ss.hideSlides = function(except) {
        ss.images.each(function(idx, el) {
            if (idx == except || idx == ss.current) {
                return;
            }

            $(el).hide();
        });
    }

    ss.renumber = function(i) {
        i = (i >= ss.images.length) ? 0 : i;
        i = (i < 0) ? ss.images.length - 1 : i;
        ss.current = i;

        ss.images.each(function(idx, el) {
            var i = ss.images.length - idx - 1 + ss.current;

            if (i >= ss.images.length) {
                i -= ss.images.length;
            }

            $(el).css({'z-index': i});
        });
    }

    ss.onTimer = function() {
        if (!ss.paused) {
            ss.gotoNext();
        }
    }

    ss.gotoSlide = function(idx) {
        ss.hideSlides(idx);
        ss.renumber(idx);
        ss.currentSlide().hide().fadeIn({complete: ss.gotoComplete});
    }

    ss.gotoComplete = function() {
        ss.images.show();
    }

    ss.gotoNext = function() {
        ss.currentSlide().fadeOut({complete: ss.nextComplete});
    }

    ss.nextComplete = function() {
        ss.currentSlide().show();
        ss.renumber(ss.current + 1);
    }

    ss.gotoPrev = function() {
        ss.renumber(ss.current - 1);
        ss.currentSlide().hide().fadeIn();
    }

    ss.currentSlide = function() {
        return $(ss.images[ss.current]);
    }

//  ss.find('.images').hover(ss.onHover, ss.onHover);
    ss.hover(ss.onHover, ss.onHover);
    ss.controls.click(ss.onControl);
    ss.thumbs.click(ss.onThumb);
    ss.renumber(0);
	ss.everyTime(ss.options.delay, ss.onTimer);

	return this;
};

