(function($) {
    $.fn.slider = function(options) {

        // if nothing is selected, return nothing; can't chain anyway
        if (!this.length || this.children('.element').size() < 2) {
            return;
        }

        // build main options before element iteration
        var opts   = $.extend({}, $.fn.slider.defaults, options);

        this.children('.element:first').addClass('actElement');
        changeInterval = setInterval(function() {$.fn.slider.next(opts)},opts.changeSpeed);

        $('.pause').click(function() {$.fn.slider.pause()});
        $('.play').click(function() {$.fn.slider.play(opts)});
        $('.forward').click(function() {
            $.fn.slider.pause();
            $.fn.slider.next.call(this,opts);
        });
        $('.backward').click(function() {
            $.fn.slider.pause();
            $.fn.slider.prev.call(this,opts);
        });
    };

    // plugin defaults
    $.fn.slider.defaults = {
        effectType  : 'slide',
        changeSpeed : 5000,
        effectSpeed : 500
    };

    $.fn.slider.pause = function() {
        $('.pause').hide();
        $('.play').show();
        clearInterval(changeInterval);
    };

    $.fn.slider.play = function(opts) {
        $('.play').hide();
        $('.pause').show();
        $.fn.slider.next(opts);
        changeInterval = setInterval(function() {$.fn.slider.next.call(this,opts)},opts.changeSpeed);
    };

    $.fn.slider.prev = function(opts) {
        var indexAct    = $('.element').index($('.actElement'));
        var indexPrev   = indexAct-1;
        var indexFirst  = $('.element').index($('.element:first'));
        var nextElement = (indexPrev == indexFirst-1) ? $('.element:last') : $('.element').eq(indexPrev);
        $.fn.slider.change(opts,nextElement);
    };

    $.fn.slider.next = function(opts) {
        var indexAct    = $('.element').index($('.actElement'));
        var indexNext   = indexAct+1;
        var indexLast   = $('.element').index($('.element:last'));
        var nextElement = (indexNext == indexLast+1) ? $('.element:first') : $('.element').eq(indexNext);
        $.fn.slider.change(opts,nextElement);
    };

    $.fn.slider.change = function(opts,nextElement) {
        switch (opts.effectType) {
            case 'fade':
                $('.actElement').fadeOut(opts.effectSpeed,function() {
                    $(this).removeClass('actElement');
                });
                $(nextElement).fadeIn(opts.effectSpeed,function() {
                    $(this).addClass('actElement');
                });
                break;
            case 'slide':
                $('.actElement').slideUp(opts.effectSpeed,function() {
                    $(this).removeClass('actElement');
                });
                $(nextElement).slideDown(opts.effectSpeed,function() {
                    $(this).addClass('actElement');
                });
                break;
        }
    };

})(jQuery);


