/************************ 

SpSlider V 1.8 BETA
@joaquinrivero
https://bitbucket.org/joaquinrivero/

************************/
(function($) {
        $.fn.spSlider = function(options) {
                var settings = {
                        spInterval : 4000,
                        spFadeIn : 1000,
                        spFadeOut : 1000,
                        counterClassDefault : 'spCounter',
                        counterClassActive : 'spCounterActive',
                        spClass : 'sp',
                        spClassActive : 'spActive',
                        spLastActive : 'spLastActive',
                        NextButton : 'spArrowHolder_next',
                        PrevButton : 'spArrowHolder_prev',
                        beforeStartSlide : false,
                        afterStartSlide : false,
                        firstStartSlide : false,
                        lastStartSlide : false,
                        nextStartSlide : false,
                        prevStartSlide : false
                };
                return this.each(function() {
                        // If options exist, lets merge them
                                // with our default settings
                                if (options) {
                                        $.extend(settings, options);
                                }
                                // General Variables
                                var spInterval = settings.spInterval + settings.spFadeOut + settings.spFadeIn;
                                var playtime;
                                var $spParent;
                                var spClass = settings.spClass;
                                $spParent = jQuery(this);
                                $spChildren = $spParent.children();
                                $firstChild = $spParent.children(':first');
                                $type = jQuery('.' + settings.counterClassDefault).parent().attr('type');
                                var total = $spChildren.length;
                                var firstSlide = 1;
                                var lastSlide = total;
                                var spCurrentSlide = firstSlide;
                                var x = 1;
                                $spParent.children().css( {
                                        listStyle : 'none',
                                        position : 'absolute',
                                        top : 0,
                                        left : 0,
                                        zIndex : 98
                                });
                                $spParent.find('.' + settings.spClass).each(function() {
                                        jQuery(this).attr('rel', x);
                                        x++;
                                });
                                goToSlide(spCurrentSlide, $type);
                                // next function
                                function nextiTem() {
                                        spCurrentSlide = jQuery('.' + settings.spClassActive).attr(
                                                        'rel');
                                        var nextindex = parseFloat(spCurrentSlide) + 1;
                                        $spChildren.removeClass(settings.spClassActive);
                                        if (nextindex > total) {
                                                var nextindex = 1;
                                        }
                                        // next slide callback
                                        if (typeof settings.nextStartSlide == 'function') {
                                                settings.nextStartSlide(nextindex, $type, spClass);
                                        }
                                        // call goToSlide function
                                        goToSlide(nextindex, $type);
                                }
                                ;
                                // prev function
                                function previTem() {
                                        spCurrentSlide = jQuery('.' + settings.spClassActive).attr(
                                                        'rel');
                                        var previtem = parseFloat(spCurrentSlide) - 1;
                                        if (previtem < 1) {
                                                var previtem = jQuery('.' + settings.spClass).last()
                                                                .attr('rel');
                                        }
                                        // prev slide callback
                                        if (typeof settings.prevStartSlide == 'function') {
                                                settings.prevStartSlide(previtem, $type);
                                        }
                                        // call goToSlide function
                                        goToSlide(previtem, $type);

                                }
                                ;

                                function goToSlide(slideIndex, $type) {
                                        if ($type) {
                                                if ($type == 1) {
                                                        jQuery('.' + settings.counterClassDefault).not('[rel=' + slideIndex + ']').removeClass(settings.counterClassActive).find('img:first').show();
                                                        jQuery('.' + settings.counterClassDefault + '[rel=' + slideIndex + ']').find( 'img:first').hide();
                                                        jQuery( '.' + settings.counterClassDefault+ '[rel=' + slideIndex + ']').addClass(settings.counterClassActive).find('img:last').show();
                                                } else if ($type == 2) {
                                                        jQuery('.' + settings.counterClassDefault).not('[rel=' + slideIndex + ']').removeClass(settings.counterClassActive);
                                                        jQuery('.' + settings.counterClassDefault+ '[rel=' + slideIndex + ']').addClass(settings.counterClassActive).show();
                                                } else if ($type == 3) {
                                                        jQuery('.' + settings.counterClassDefault).not('[rel=' + slideIndex + ']').removeClass(settings.counterClassActive).hide();
                                                        jQuery('.' + settings.counterClassDefault+ '[rel=' + slideIndex + ']').addClass(settings.counterClassActive).show();
                                                }
                                        }
                                        // beforeStartSlide callback function
                                        if (typeof settings.beforeStartSlide == 'function') {
                                                settings.beforeStartSlide(slideIndex, $type, spClass);
                                        }
                                        if (slideIndex == firstSlide) {
                                                if (typeof settings.firstStartSlide == 'function') {
                                                        settings.firstStartSlide(slideIndex, $type, spClass);
                                                }
                                        }
                                        if (slideIndex == lastSlide) {
                                                if (typeof settings.lastStartSlide == 'function') {
                                                        // lastStartSlide callback function
                                                        settings.lastStartSlide(slideIndex, $type);
                                                }
                                        }
                                        $spChildren.not('[rel=' + slideIndex + ']').animate( {
                                                opacity : 0
                                        }, settings.LrFadeOut).css('zIndex', 98).removeClass(
                                                        settings.spClassActive);
                                        // fade in the current slide
                                        jQuery('.' + settings.spClass + '[rel=' + slideIndex + ']')
                                                        .css('zIndex', 99).animate( {
                                                                opacity : 1
                                                        },
                                                                        settings.LrFadeIn,
                                                                        function() {
                                                                                // ie fade fix
                                                                        if (jQuery.browser.msie) {
                                                                                jQuery(
                                                                                                '.' + settings.spClass
                                                                                                                + '[rel=' + slideIndex
                                                                                                                + ']').get(0).style
                                                                                                .removeAttribute('filter');
                                                                        }
                                                                        ;
                                                                });
                                        jQuery('.' + settings.spClass + '[rel=' + slideIndex + ']')
                                                        .addClass(settings.spClassActive);
                                                        
                                        if (typeof settings.afterStartSlide == 'function') {
                                                settings.afterStartSlide(slideIndex, $type);
                                        }

                                }
                                // Play function

                                function play() {
                                        playtime = setInterval(nextiTem, spInterval);
                                }
                                ;
                                // Pause function

                                function pause() {
                                        clearTimeout(playtime);
                                }
                                ;
                                // Pagination
                                jQuery('.' + settings.counterClassDefault).bind(
                                                'click',
                                                function(e) {
                                                        var goTo = jQuery(this).attr('rel');
                                                        spCurrentSlide = jQuery(
                                                                        '.' + settings.spClassActive).attr('rel');
                                                        if (spCurrentSlide != goTo) {
                                                                pause();
                                                                goToSlide(goTo, $type);
                                                                playtime = setInterval(nextiTem, spInterval);
                                                                e.preventDefault();
                                                        } else {
                                                                return false;
                                                        }
                                                });
                                // On click Next button
                                jQuery('#' + settings.NextButton).bind('click', function(e) {
                                        pause();
                                        nextiTem();
                                        playtime = setInterval(nextiTem, spInterval);
                                        e.preventDefault();
                                });
                                // On click Prev button
                                jQuery('#' + settings.PrevButton).bind('click', function(e) {
                                        pause();
                                        previTem();
                                        playtime = setInterval(nextiTem, spInterval);
                                        e.preventDefault();
                                });
                                // Run!
                                if(total > 1){
                                play();
                                }
                                

                        });

        };
})(jQuery);
