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

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

        if (this.children('.element').css('position') == 'relative') {
            this.children('.element').wrapInner('<div style="position:relative;padding:'+this.children('.element').css('paddingTop')+' '+this.children('.element').css('paddingRight')+' '+this.children('.element').css('paddingBottom')+' '+this.children('.element').css('paddingLeft')+'" />');
            this.children('.element').css('padding','0');
        }
        this.children('.element').css('position','absolute');
        this.children('.element').css('width',this.width());

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

        this.children('.element:first').addClass('actElement');

        // Options for organicSlide
        this.css('overflow','hidden');
        opts.width  = this.children('.element:first').width();
        opts.left   = this.css('paddingLeft');
        this.children('.element').css('left',opts.width);
        this.children('.actElement').css('left',opts.left);
        opts.left   = opts.left.replace(/px/g,'');

        changeInterval = setInterval(
            function() {
                if (opts.direction) {
                    $.fn.slider.prev.call(this,opts);
                } else {
                    $.fn.slider.next.call(this,opts);
                }
            }
        ,opts.changeSpeed);

        $('.pause').click(function() {$.fn.slider.pause()});
        $('.play').click(function() {$.fn.slider.play(opts)});
        $('.forward').click(function() {
            if (opts.preventClickDuringAnimation && $('#slider').children('.actElement').queue('fx').length <= 0) {
                if (opts.trackDirection) {
                    opts.direction = false;
                }
                $.fn.slider.pause(opts);
                $.fn.slider.next.call(this,opts);
            }
        });
        $('.backward').click(function() {
            if (opts.preventClickDuringAnimation && $('#slider').children('.actElement').queue('fx').length <= 0) {
                if (opts.trackDirection) {
                    opts.direction = true;
                }
                $.fn.slider.pause(opts);
                $.fn.slider.prev.call(this,opts);
            }
        });
    };

    // plugin defaults
    $.fn.slider.defaults = {
        effectType  : 'slide',
        changeSpeed : 5000,
        effectSpeed : 500,
        direction   : false, // true = zurück, false = vorwärts
        trackDirection : false,
        preventClickDuringAnimation : 500
    };

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

    $.fn.slider.play = function(opts) {
        $('.play').hide();
        $('.pause').show();
        $.fn.slider.next(opts);
        changeInterval = setInterval(
            function() {
                if (opts.direction) {
                    $.fn.slider.prev.call(this,opts);
                } else {
                    $.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);
        if (opts.effectType == 'organicSlide') {
            $(nextElement).css('left','-'+opts.width+'px');
            opts.slideTo = opts.width+'px';
        }
        $.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);
        if (opts.effectType == 'organicSlide') {
            $(nextElement).css('left',opts.width+'px');
            opts.slideTo = '-'+opts.width+'px';
        }
        $.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;
            case 'organicSlide':
                $('.actElement').animate({left:opts.slideTo},opts.effectSpeed,function() {
                    $(this).removeClass('actElement');
                });
                $(nextElement).animate({left:opts.left+'px'},opts.effectSpeed,function() {
                    $(this).addClass('actElement');
                });
                break;
        }
    };

})(jQuery);


