/*!
 * SeedGallery jQuery plugin
 * http://userte.ch/
 *
 * Copyright 2010, Jan Beranek
 * Release: Fall 2010
 */
(function( $ ){
    $.fn.SeedGallery = function( options ) {  

        var s = {
          'diff'    : 1024,
          'speed'   : 1500,
          'intervalSpeed' : 7500,
          'viewport' : '1024px',
          'currentMain' : 0,
          'items' : '',
          'bullets' : '',
          'timerLine' : '',
          'leftBtn' : '',
          'rightBtn' : '',
          'mainClass' : 'main',
          'bulletsActiveClass' : 'active',
          'bulletsHelperClass' : 'active2',
          'carouselEasing' : 'swing',
          'carouselInterval' : null,
          'carouselTimeout' : null,
          'variableDiff' : false,
          'variableDiffOffset' : 0
        };
        var oThis = this;
        
        var methods = {
            init : function( s ) {
                //if there are no items do not proceed
                if(!s.items) return;
                
                //spread out all the items
                var x = 0;
                if(!s.variableDiff){
                    $(s.items).each(function(){
                        $(this).css({left: s.diff*x+'px'});
                        x++;
                    });
                }else{
                    var sum = 0;
                    $(s.items).each(function(){
                        if(x>0){
                            sum += $(s.items+':nth-child('+(x)+')').width()+s.variableDiffOffset;
                            //sum += $(this).width();
                        }
                        $(this).css({left: sum+'px'});
                        x++;
                    }); 
                }


                //set the first item as main
                $(s.items + ':first').addClass(s.mainClass);
                
                //set the first bullet as active
                
                if(s.bullets){
                    $(s.bullets + ':first').addClass(s.bulletsActiveClass);
                    var x = 0;
                    $(s.bullets).each(function(){
                        var ix = x;
                        $(this).click(function(){
                            methods.moveTo(s,ix);
                            //$('html, body').animate({scrollTop:$(oThis).offset().top}, 'slow');
                            return false;
                        });
                        x++;
                    });
                }
                
                if(s.leftBtn){
                    $(s.leftBtn).click(function(){
                        methods.moveLeft(s);
                        //$('html, body').animate({scrollTop:$(oThis).offset().top}, 'slow');
                        return false;
                    });
                }
                if(s.rightBtn){
                    $(s.rightBtn).click(function(){
                        methods.moveRight(s);
                        //$('html, body').animate({scrollTop:$(oThis).offset().top}, 'slow');
                        return false;
                    });
                }
            },
            carousel : function( s ) {
                //animate timerline
                if(s.timerLine)
                    $(s.timerLine).animate({width:'100%'},{duration:s.intervalSpeed-100,easing:'linear'}).animate({width:'10%'},100);
                    
                s.carouselInterval = setInterval(function(){
                    s.currentMain++;
                    if(s.currentMain >= $(s.items).size())
                        s.currentMain = 0;

                    if(s.variableDiff){
                        s.diff = $(s.items+':nth-child('+(s.currentMain)+')').width()+s.variableDiffOffset;
                        if(s.diff==0 || s.diff==s.variableDiffOffset)
                            s.diff = $(s.items+':last').width()+s.variableDiffOffset;
                    }
                        
                    
                    //main animation
                    $(s.items).animate({left:'-='+s.diff},{duration:s.speed,easing:s.carouselEasing});
                    //reset timerline
                    if(s.timerLine)
                        $(s.timerLine).stop().animate({width:'100%'},{duration:s.intervalSpeed-100,easing:'linear'}).animate({width:'10%'},100);
                        
                    //set new active bullet
                    methods.setActiveBullet(s,s.currentMain);
                        
                    setTimeout(function(){
                        //first item to the end
                        if(s.variableDiff){
                            var max = x = maxX = 0;
                            $(s.items).each(function(){
                                var w = $(this).position().left;
                                if($(this).position().left>max){
                                    max = w;
                                    maxX = x;
                                }
                                x++;
                            });
                            s.lastpos = (max+$(s.items+':nth-child('+(maxX+1)+')').width())+s.variableDiffOffset;
                        }
                        $(s.items + '.' + s.mainClass).css({left: s.lastpos + 'px'}).removeClass(s.mainClass);
                        
                        //set current item as main
                        $(s.items+':nth-child('+(s.currentMain+1)+')').addClass(s.mainClass);

                    },s.speed+100);
                },s.intervalSpeed);
            },
            moveTo : function( s , i ) {
                //dont do anything if items are currently animated
                if($(s.items+':animated').get(0)) return;
                
                //clear carousel interval and timeout
                clearInterval(s.carouselInterval);
                clearTimeout(s.carouselTimeout);
                
                methods.vistaPositions(s);

                var difference = i-s.currentMain;

                if(difference<0){
                    $(s.items).animate({left:'+='+(-1*difference)*s.diff},s.speed);
                }else if(difference>0)
                    $(s.items).animate({left:'-='+difference*s.diff},s.speed);
                
               
                $(s.items).removeClass(s.mainClass);
                $(s.items+':nth-child('+(i+1)+')').addClass(s.mainClass);
                
                methods.setActiveBullet(s,i);
                s.currentMain = i;
                
                methods.restartCarousel(s);
            },
            moveLeft : function( s ) {
                methods.moveTo(s,((s.currentMain-1 <= 0) ? $(s.items).size()-1 : s.currentMain-1));
            },
            moveRight : function( s ) {
                methods.moveTo(s, ((s.currentMain+1 >= $(s.items).size()) ? 0 : s.currentMain+1));
            },
            linePositions : function( s ) {
                $(s.items).each(function(){
                    if($(this).position().left < 0){
                        $(this).css({left: (($(this).position().left/s.diff+$(s.items).size())*s.diff) + 'px'});
                    }
                });
            },
            vistaPositions : function( s ) {
                var x = 0;
                $(s.items).each(function(){
                    var left = (x-s.currentMain)*s.diff;
                    $(this).css({left: (left) + 'px'});
                    x++;
                });
            },
            restartCarousel : function ( s ){
                s.carouselTimeout = setTimeout(function(){
                    methods.linePositions(s);
                    methods.carousel(s);
                },s.intervalSpeed);
            },
            setActiveBullet : function (s,i){
                $(s.bullets).removeClass(s.bulletsActiveClass);
                $(s.bullets+':nth-child('+(i+1)+')').addClass(s.bulletsActiveClass);
            }
        };
        
        
        //core of the plugin
        return this.each(function() {        
            if ( options ) { 
                $.extend( s, options );
            }
            if(!s.variableDiff){
                s.lastpos = ($(s.items).size()-1)*s.diff;
            }else{
                var sum = x = 0;
                $(s.items).each(function(){
                    if(x>0){
                        sum += $(s.items+':nth-child('+(x)+')').width();
                    }
                    x++;
                }); 
                s.lastpos = sum;
            }
           
            //initialize
            methods.init(s);
            
            //run carousel
            methods.carousel(s);
            
        });

    };
})( jQuery );
