/*!
 * jQuery JavaScript slideshow Plugin v1.0
 *
 * Copyright 2011, Stephan Schröter
 *
 */

(function( $ ){

    var methods = {
        
        init : function( options ) {
            
            var settings = {
                width: 940,
                height: 350,
                animationSpeed: 600,
                autoPlay: true,
                autoPlayInterval: 5000,
                caption: true,
                nextPrev: true,
                counter: true,
                pagination: true
            }
            
            return this.each(function(){
                
                if ( options ) {
                    $.extend( settings, options );
                }
                
                var obj = $(this);
                
                obj
                    .data('curSlideID', 0)
                    .data('sizeSlides', obj.find('div.slideshow-container > div.items > div.item').size())
                    .data('timer', false)
                ;
                
                if (obj.data('sizeSlides') > 1) {
                
                    obj.slideshow('addCssStyle', settings);
                    obj.slideshow('generateCaption', settings);
                    obj.slideshow('generateNextPrev', settings);
                    obj.slideshow('generateCounter', settings);
                    obj.slideshow('generatePagination', settings);
                    obj.slideshow('handleAutoPlay', settings);
                    
                }
                
            });
            
        },
        
        
        // autoPlay
        handleAutoPlay : function( settings ) {
            
            return this.each(function(){
                
                if (settings.autoPlay) {
                
                    var obj = $(this);
                    
                    clearInterval( obj.data('timer') );
                    
                    obj
                        .data(
                            'timer', 
                            setInterval (function() {obj.slideshow('handleSlide', settings, 'next')}, (!obj.data('timer')) ? settings.autoPlayInterval : settings.autoPlayInterval+settings.animationSpeed )
                        )
                    ;
                    
                }
                
            });
            
        },
        
        
        // Slide
        handleSlide : function( settings, slideTo ) {
            
            return this.each(function(){
                
                var obj = $(this);
                
                if (!obj.find('div.slideshow-container > div.items').is(':animated')) {
                
                    var lastSlideID = obj.data('curSlideID');
                    
                    obj.slideshow('updateCurSlideID', settings, slideTo);
                    obj.slideshow('updateCaption', settings);
                    obj.slideshow('updateCounter', settings);
                    obj.slideshow('updatePagination', settings);
                    obj.slideshow('handleAutoPlay', settings);
                    
                    if (slideTo == 'next') {
                        var animW = settings.width * 2;
                    } else if (slideTo == 'prev') {
                        var animW = 0;
                    } else {
                        if (obj.data('curSlideID') > lastSlideID) {
                            var animW = settings.width * 2;
                        } else {
                            var animW = 0;
                        }
                    }
                        
                    obj
                        .find('div.slideshow-container > div.items > div.item:eq('+ obj.data('curSlideID') +')')
                        .css({
                            'left':''+ animW +'px'
                        })
                        .show()
                    ;
                    
                    obj
                        .find('div.slideshow-container > div.items')
                        .animate({
                            'left':'-'+ animW +'px'
                        }, settings.animationSpeed, 'swing', function(){
                            
                            obj
                                .find('div.slideshow-container > div.items')
                                .css({
                                    'left':'-'+ settings.width +'px'
                                })
                            ;
                            
                            obj
                                .find('div.slideshow-container > div.items > div.item:eq('+ obj.data('curSlideID') +')')
                                .css({
                                    'left':''+ settings.width +'px'
                                })
                            ;
                            
                            obj
                                .find('div.slideshow-container > div.items > div.item:eq('+ lastSlideID +')')
                                .css({
                                    'left':''+ settings.width +'px'
                                })
                                .hide()
                            ;
                            
                        })
                    ;
                   
                }
                
            });
            
        },
        
        
        // curSlideID
        updateCurSlideID : function( settings, slideTo ) {
            
            return this.each(function(){
                
                var obj = $(this);
                
                if (slideTo == 'next') {
                    
                    if ( (obj.data('curSlideID')+1) < obj.data('sizeSlides') ) {
                        
                        obj
                            .data( 'curSlideID', (obj.data('curSlideID')+1) )
                        ;
                        
                    } else {
                        
                        obj
                            .data( 'curSlideID', 0 )
                        ;
                        
                    }
                        
                } else if (slideTo == 'prev') {
                    
                    if ( (obj.data('curSlideID')-1) >= 0 ) {
                        
                        obj
                            .data( 'curSlideID', (obj.data('curSlideID')-1) )
                        ;
                        
                    } else {
                        
                        obj
                            .data( 'curSlideID', (obj.data('sizeSlides')-1) )
                        ;
                        
                    }
                        
                } else {
                    
                    if (slideTo >= 0 && slideTo < obj.data('sizeSlides')) {
                        
                        obj
                            .data( 'curSlideID', slideTo )
                        ;
                        
                    } else {
                        
                        obj
                            .data( 'curSlideID', 0 )
                        ;
                        
                    }
                    
                }
                
            });
            
        },
        
        
        // CSS Styles
        addCssStyle : function( settings ) {
            
            return this.each(function(){
                
                var obj = $(this);
                
                obj
                    .children('div.slideshow-container')
                    .css({
                        'position':'relative',
                        'width':''+ settings.width +'px',
                        'height':''+ settings.height +'px',
                        'overflow':'hidden'
                    })
                    .children('div.items')
                    .css({
                        'position':'relative',
                        'width':''+ (settings.width * 3) +'px',
                        'height':''+ settings.height +'px',
                        'top':'0px',
                        'left':'-'+ settings.width +'px'
                    })
                    .children('div.item')
                    .css({
                        'position':'absolute',
                        'width':''+ settings.width +'px',
                        'height':''+ settings.height +'px',
                        'top':'0px',
                        'left':''+ settings.width +'px',
                        'overflow':'hidden'
                    })
                    .hide()
                    .children('div.caption')
                    .hide()
                ;
                
                obj
                    .find('div.slideshow-container > div.items > div.item:first')
                    .show()
                ;
                
            });
            
        },
        
        
        // Caption
        generateCaption : function( settings ) {
            
            return this.each(function(){
                
                if (settings.caption) {
                
                    var obj = $(this);
                    
                    obj
                        .append('<div class="caption"></div>')
                    ;
                    
                    obj
                        .children('div.caption')
                        .empty()
                        .append(obj.find('div.slideshow-container > div.items > div.item:eq('+ obj.data('curSlideID') +') > div.caption').html())
                        .children()
                        .show()
                    ;
                
                }
                
            });
            
        },
        
        updateCaption : function( settings ) {
            
            return this.each(function(){
                
                if (settings.caption) {
                
                    var obj = $(this);
                    
                    obj
                        .children('div.caption')
                        .empty()
                        .append(obj.find('div.slideshow-container > div.items > div.item:eq('+ obj.data('curSlideID') +') > div.caption').html())
                        .children()
                        .hide()
                        .fadeIn(settings.animationSpeed)
                    ;
                
                }
                
            });
            
        },
        
        
        // Next / Prev
        generateNextPrev : function( settings ) {
            
            return this.each(function(){
                
                if (settings.nextPrev) {
                
                    var obj = $(this);
                    
                    obj
                        .append('<span class="prev"></span><span class="next"></span>')
                    ;
                    
                    obj.slideshow('handleNextPrev', settings);
                
                }
                
            });
            
        },
        
        handleNextPrev : function( settings ) {
            
            return this.each(function(){
                
                if (settings.nextPrev) {
                
                    var obj = $(this);
                    
                    obj
                        .children('span.next, span.prev')
                        .click(function(){
                            
                            if ($(this).hasClass('next')) {
                                
                                obj.slideshow('handleSlide', settings, 'next');
                                
                            }
                            
                            if ($(this).hasClass('prev')) {
                                
                                obj.slideshow('handleSlide', settings, 'prev');
                                
                            }
                            
                        })
                    ;
                
                }
                
            });
            
        },
        
        
        // Counter
        generateCounter : function( settings ) {
            
            return this.each(function(){
                
                if (settings.counter) {
                
                    var obj = $(this);
                    
                    obj
                        .append('<span class="counter"></span>')
                    ;
                    
                    obj.slideshow('updateCounter', settings);
                
                }
                
            });
            
        },
        
        updateCounter : function( settings ) {
            
            return this.each(function(){
                
                if (settings.counter) {
                
                    var obj = $(this);
                    
                    obj
                        .children('span.counter')
                        .text(''+ (obj.data('curSlideID')+1) +' / '+ obj.data('sizeSlides') +'')
                    ;
                
                }
                
            });
            
        },
        
        
        // Pagination
        generatePagination : function( settings ) {
            
            return this.each(function(){
                
                if (settings.pagination) {
                
                    var obj = $(this);
                    
                    obj
                        .append('<span class="pagination"></span>')
                    ;
                    
                    for (var i = 0; i < obj.data('sizeSlides'); i++) {
                    
                        obj
                            .children('span.pagination')
                            .append('<span></span>')
                        ;
                    
                    }
                    
                    obj.slideshow('updatePagination', settings);
                    obj.slideshow('handlePagination', settings);
                
                }
                
            });
            
        },
        
        updatePagination : function( settings ) {
            
            return this.each(function(){
                
                if (settings.pagination) {
                
                    var obj = $(this);
                    
                    obj
                        .children('span.pagination')
                        .children('span')
                        .removeClass('active')
                    ;
                    
                    obj
                        .children('span.pagination').children('span:eq('+ obj.data('curSlideID') +')')
                        .addClass('active')
                    ;
                
                }
                
                
            });
            
        },
        
        handlePagination : function( settings ) {
            
            return this.each(function(){
                
                if (settings.pagination) {
                
                    var obj = $(this);
                    
                    obj
                        .children('span.pagination')
                        .children('span')
                        .click(function(){
                            
                            if ( obj.data('curSlideID') != obj.children('span.pagination').children('span').index($(this)) ) {
                            
                                obj.slideshow( 'handleSlide', settings, obj.children('span.pagination').children('span').index($(this)) );
                            
                            }
                            
                        })
                    ;
                
                }
                
                
            });
            
        }
        
    };

    $.fn.slideshow = function( method ) {
    
        if ( methods[method] ) {
            return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.slideshow' );
        }
    
    };

})( jQuery );
