/*
 * License
 * autor
 *
 * defaults
 *
 */
(function($){
    $.fn.superBanner = function(options) {

        //Default settings
        var defaults = {

            autoplayDelay: 2000,
            numberPagination: true,
            dotPagination: false,
            smallArrows: false,
            loop: true,
            hover: false,
            order: 'sequence',
            pauseable: false,
            speed: 3000,
            restartDelay: 2500,
            transition: 'innerFade',
            transitionDuration: 1000,
            width: 980,
            height: 277,
            beforeTransition: null,
            afterTransition: null
        };

        options = $.extend(defaults, options);

        return this.each(function(){

            var wrapper       = $(this),
                ul            = $(this).find('ul'),
                elements      = $(ul).children(),
                totalSlides   = $("li", wrapper).length,
                currentSlide  = 0;

            var autoplayDelay       = options.autoplayDelay,
                numberPagination    = options.numberPagination,
                dotPagination       = options.dotPagination,
                smallArrows         = options.smallArrows,
                loop                = options.loop,
                order               = options.order,
                pauseable           = options.pauseable,
                speed               = options.speed,
                transition          = options.transition,
                transitionDuration  = options.transitionDuration,
                width               = options.width,
                height              = options.height;

            var interval         = null,
                restart          = null;

            //Set banners width
            $("li",wrapper).css('width', width+'px');

             
            //try
            if (elements.length > 1) {
                for ( var i = 0; i < elements.length; i++ ) {
                    $(elements[i]).css('z-index', String(elements.length-i));
                    $(elements[i]).hide();
                }
            }

            //If there is a control needed
            if (numberPagination == true || dotPagination == true || pauseable == true)
            {
                //append control
                $(ul).after('<div class="control"></div>');
            }

            //Order sequence
            if (order == 'sequence')
            {
				$(elements[currentSlide]).show();
			}

            
            //dot pagination
            if (dotPagination == true)
            {
                numberPagination = false;
                for ( i = 0; i < elements.length; i++ ) {
                    $('div.control', wrapper).append('<div class="dot"></div>');
                }
                
                $('div.control > div.dot:first', wrapper).addClass('dot-selected').removeClass('dot');
                $('div.control', wrapper).css('border','0px');
                $('div.control', wrapper).css('background','none');

                //Goto dot
                $('div.control > div.dot', wrapper).live('click', function(){
                var last         = currentSlide;
                    currentSlide = $(this).index();
                clearInterval(interval);
                clearTimeout(restart);
                animate(last,currentSlide);
                restartAnimation();
            });

            }

            //Numbering Pagination
            if (numberPagination == true)
            {
                dotPagination = false;
                for ( i = elements.length; i >= 1 ; i-- ) {
                    $('div.control', wrapper).append('<div class="number">'+ i +'</div>');
                }

                $('div.control > div.number:contains(1)', wrapper).addClass('number-active').removeClass('number');
            }

            //Small Arrow seek
            if (smallArrows == true)
            {
                $('div.control', wrapper).prepend('<div class="small-arrow-left"></div>');
                $('div.control', wrapper).prepend('<div class="small-arrow-right"></div>');

                var $next = $('div.control > div.small-arrow-right', wrapper),
                $back = $('div.control > div.small-arrow-left', wrapper);

                $next.live('click', function(){
                    var last         = currentSlide;
                        currentSlide = (currentSlide==(totalSlides-1)) ? 1 : currentSlide+1;

                    clearInterval(interval);
                    clearTimeout(restart);
                    animate(last,currentSlide);
                    restartAnimation();
                });

                $back.live('click', function(){
                    var last         = currentSlide;
                        currentSlide = (currentSlide==0) ? (totalSlides-1) : currentSlide-1;
                    clearInterval(interval);
                    clearTimeout(restart);
                    animate(last,currentSlide);
                    restartAnimation();
                });
            }

            //pauseable
            if (pauseable==true)
            {
                $('div.control', wrapper).prepend('<div class="pause"></div>');
                var $pause = $('div.control > div.pause', wrapper);

                $pause.live('click', function(){
                    clearInterval(interval);
                    clearTimeout(restart);

                    $pause.addClass('pause-active');
                    $pause.removeClass('pause');
                });

                $('div.control > div.pause-active', wrapper).live('click',function(){
                    restartAnimation();
                    $pause.addClass('pause');
                    $pause.removeClass('pause-active');
                });

            }

            //ajust position of control here
            $('div.control', wrapper).css('top',height-$('div.control', wrapper).height()-25);
            if($.browser.msie && ($.browser.version == "6.0" || $.browser.version == "7.0"))
            {
                /*OD: Temporary fix for ie6 and ie7*/
                $('div.control', wrapper).css('right',width-$('div.control', wrapper).width()+30);
            }
            else
            {
                $('div.control', wrapper).css('left',width-$('div.control', wrapper).width()-30);
            }

            $('div.control > div.number', wrapper).live('click', function(){
                var last         = currentSlide;
                    currentSlide = $(this).text()-1;
                clearInterval(interval);
                clearTimeout(restart);
                animate(last,currentSlide);
                restartAnimation();
            });
            
            if ( autoplayDelay > 0 ) {
                var auto = function() {

                  var last         = currentSlide;
                      currentSlide = (currentSlide==totalSlides-1) ? 0 : currentSlide+1;

                  animate(last,currentSlide);

                  if ( !loop && currentSlide>=totalSlides ) {
                    clearInterval(interval);
                  }
                }
                restartAnimation();
            }

            function restartAnimation()
            {
                restart = setTimeout(function() {
                    auto();
                    interval = setInterval(auto, speed);
                }, speed);
            }

            function animate(last, current, callback) {
                current = parseInt(current);
                switch(transition)
                {
                    case 'slide':

                        //Gotta pimp this
                        $(elements[last]).slideUp(transitionDuration, function(){
                            $(elements[current]).slideDown(transitionDuration);
                        });

                        break;
                    default:
                    case 'innerFade':
                        $(elements[last]).fadeOut(transitionDuration);
                        $(elements[current]).delay(transitionDuration/2).fadeIn(transitionDuration);

                        if (numberPagination == true)
                        {
                            $('div.number-active').addClass('number');
                            $('div.number-active').removeClass('number-active');

                            $('div.number:contains('+ (current+1) +')').addClass('number-active');
                            $('div.number:contains('+ (current+1) +')').removeClass('number');
                        }
                        else
                        {
                            $('div.dot-selected').addClass('dot');
                            $('div.dot-selected').removeClass('dot-selected');

                            $('div.dot:eq('+ (current) +')').addClass('dot-selected');
                            $('div.dot:eq('+ (current) +')').removeClass('dot');
                        }

                        break;
                }

            }

        });


    };
})(jQuery);
