/* v 0.2.6 */
/* dodano goToElement, setActiveNav, detailNav, detailNavContainer, dodatkowy warunek if (options.detailNav)... */
/* Poprawki w setActiveNav z dodawaniem klasy act
 * TODO: błędy, gdy simplFader uruchomiony jest bez parametrów nextNav, PrevNav.
 * */

(function( $ ){
    jQuery.fn.simplFader = function(options) {
        
        var $thiz = this;
        var simplFaderContanier = this;
        var simplFaderElements = simplFaderContanier.children();
        // outers = suma borderów, marginesów i paddingów dla elementów Fadera
        
        var settings = { // parametry dla nawigacji muszą byc obiektami jQuery
            'navNext' : false, // default
            'navPrev' : false, //  default
            'detailNav' : false, // dodatkowa nawigacja np. kropki/numery pod sliderem
            'detailNavContainer': false, // domyślny element
            'autoPlay' : false,
            'autoPlaySpeed' : 500,
            'clickFadeSpeed' : 300,
            'speed' : 350
        };
        
        if (options) { // dodajemy do obiektu settings pola obiektu options, czyli przekazujemy mu parametry dla nawigacji, parametry muszą być obiektami jQuery
            $.extend(settings,options);
        }
        
        (function(){ // Init
            simplFaderElements.not(':first').hide();
            simplFaderContanier.find(':first').addClass('active');
        })();
        
        var simplFader = {         
            
            container : simplFaderContanier,
            elements :  simplFaderElements,
            current: 1,
            getActive: function() {
                return simplFaderContanier.find('.active');
            },
            goToElement: function(num, obj) { // przechodzi do podanego elementu. obj musi być obiektem jQuery, num oznacza jego indeks.
                var thz = this;
                var speed = settings.clickFadeSpeed;
                if (!this.elements.is(':animated')) {
                    thz.current = num+1;
                    if (settings.detailNav) {
                        setActiveNav();
                    }
                    this.getActive().fadeOut(speed,function(){
                        thz.getActive().removeClass('active');
                        obj.fadeIn(speed,function(){
                            $(this).addClass('active');
                            if (settings.detailNav) {
                                setActiveNav();
                            }
                        });
                    });
                }
            },
            nextElement: function(event) {
                var thz = this;
                var speed = settings.speed;
                if (event === 'click') { // jeśli animacja jest wywołana przez kliknięcie dajemy inną animację, żeby nie zamulało
                    speed = settings.clickFadeSpeed;
                } 
                
                if (!this.elements.is(':animated')) {
                    if (this.current < this.elements.length) { // jeśli element nie jest ostatnim elementem
                        thz.current++;
                        if (settings.detailNav) {
                            setActiveNav();
                        }
                        this.getActive().fadeOut(speed,function(){
                            thz.getActive().removeClass('active').next().fadeIn(speed,function(){
                                $(this).addClass('active');
                                 if (settings.detailNav) {
                                     setActiveNav();
                                }
                            });
                        });
                    }
                    
                    else {
                        thz.current = 1;
                        if (settings.detailNav) {
                            setActiveNav();
                        }
                        this.getActive().fadeOut(speed,function(){
                            thz.getActive().removeClass('active');
                            simplFaderContanier.children(':first').fadeIn(speed,function(){
                               $(this).addClass('active');
                            });
                        });
                    }
                }
            },
            prevElement: function(event) {
                var thz = this;
                var speed = settings.speed;
                if (event === 'click') { // jeĹli animacja jest wywoĹana przez klikniÄcie dajemy innÄ animacjÄ, Ĺźeby nie zamulaĹo
                    speed = settings.clickFadeSpeed;
                } 
                
                if (!this.elements.is(':animated')) {
                    thz.current--;
                    setActiveNav();
                    if (this.current !== 0) { // jeĹli element nie jest ostatnim elementem
                        this.getActive().fadeOut(speed,function(){
                            thz.getActive().removeClass('active').prev().fadeIn(speed,function(){
                                $(this).addClass('active');
                            });
                        });

                    }
                    else {
                        thz.current = thz.elements.length;
                        setActiveNav();
                        this.getActive().fadeOut(speed,function(){
                            thz.getActive().removeClass('active');
                            simplFaderContanier.children(':last').fadeIn(speed,function(){
                               $(this).addClass('active');
                            });
                        });
                    }
                }
            },
            autoPlay: (function(){ // obejście problemu z zasięgiem 'this' w setInterval znalezione na http://www.switchonthecode.com/tutorials/javascript-tutorial-using-setinterval-and-settimeout

                if (options.autoPlay) {
                    function autoplay(){
                        function timoutFunc(){
                            simplFader.nextElement();
                        }

                        this.causeTimeout = function(speed){
                            setInterval(timoutFunc, speed);
                        }  
                    }

                    var play  = new autoplay();
                    play.causeTimeout(settings.autoPlaySpeed);
                }

            })(),
            seNav: (function() {
                if (!options.navNext) { // jeśli elemenyy nawigacji nie są zdefiniowane kliknięcie na element galerii pokazuje kolejny element
                    simplFaderElements.click(function(event){
                        simplFader.nextElement(event.type);
                    })
                }
                else { // jeśli parametr nav został podany tworzymy nawigację
                    settings.navNext.click(function(event){
                        simplFader.nextElement(event.type);
                        return false;
                    });
                    settings.navPrev.click(function(event){
                        simplFader.prevElement(event.type);
                        return false;
                    });
                }
                
                if (options.detailNav) {
                    
                    var detailNavContainer;
                    var num;
                    
                    if (!options.detailNavContainer) { // jeśli nie jest podany element, to tworzymy prostą listę z numerami zdjęć
                     
                        $('<div class="detailNavContainer"></div>').insertAfter(simplFaderContanier);
                        detailNavContainer = $('.detailNavContainer');
                        
                        for (var i=1; i<=simplFaderElements.length; i++) {
                            $('<a href="#">'+i+'</a>').appendTo(detailNavContainer);
                        }
                    }
                    else { // jeżeli podany jest element kopiujemy jego zawartość i powielamy tyle razy ile jest zdjęć w galerii
                        detailNavContainer = options.detailNavContainer;
                        var elem = detailNavContainer.children().clone(); // element, z którego tworzymy nawigację, najlepiej IMG
                        var elemTagname = detailNavContainer.children()[0].nodeName; // Gdyby nawigacją nie był pojedynczy element, ale np. div i to co ma w środku.
                        for (i=1; i<simplFaderElements.length; i++) {
                            elem=elem.clone();
                            elem.appendTo(detailNavContainer);
                        }
                        $(detailNavContainer).children(':first').addClass('act');
                    }
               
                    detailNavContainer.children().click(function(){
                        if (!simplFader.elements.is(':animated')) {
                            num = $(this).index(); // pozycja
                            var obj = $(simplFaderElements[num]); // element galerii o określonej pozycji.
                            simplFader.goToElement(num, obj);
                        }
                        return false;
                    });
                    
                    setActiveNav = function() {
                       var pos = simplFader.current;
                       detailNavContainer.find('.act').removeClass('act');
                       $(detailNavContainer).find(elemTagname+':eq('+parseInt(pos-1)+')').addClass('act');
                    }
                }
                
            })()
           
        }
        
        return simplFader;
    }
  })(jQuery);
