(function($) {

      $.fn.slideshow = function(options) {

        var o = $.extend({}, $.fn.slideshow.defaults, options);

        return this.each(function() {
        
        	$this = $( this );
        	
        	$images = $( 'img', $this );
        	
        	width = $images.eq( 0 ).width();
        	height = $images.eq( 0 ).height();
        	
        	totalImages = $images.length;
        
        	var vars = {
        		test: '',
        		currentImage: false,
        		nextImage: false,
        		prevImage: false,
        		totalImages: totalImages,
        		stop: true,
        		kenBurnsLoop: 0
        	};
          
          $this.data('slider:vars', vars);         

          $images.css({

            position: 'absolute',

            top: 0,

            left: 0,

            display: 'none'

          });
                    
          $this.css({
            position: 'relative',
            overflow: 'hidden'
          });
          
          if( o.reflection ) {

            $images.clone().insertAfter( $this );
            $reflectImages = $( '~ img', $this );
            $reflectImages.wrapAll( '<div class="sw-reflect" />' ).addClass( 'reflect rheight'+o.refHeight+' ropacity60' );
            
            $reflectContainer = $( '.sw-reflect' );
            $reflectContainer.css({ 
            
              position: 'relative', 
              height: height * ( o.refHeight / 100 )
              
            });
            
            $( 'img', $reflectContainer ).css({ 
            
              display: 'block'
            
            });
          
          }
          
          $( '#play' ).click( function() {
          
          	$.fn.slideshow.controls.play( o );
          
          });
          
          $( '#pause' ).click( function() {
          
          	$.fn.slideshow.controls.stop();
          
          });
          
          $.fn.slideshow.controls.play( o );

        });    

      };

      $.fn.slideshow.transitions = {

        kenBurns: function( o ) {
        	
        	newWidth = width * o.zoom;
        	newHeight = height * o.zoom;
        	
        	switch( $this.data( 'slider:vars' ).kenBurnsLoop ) {
        	
        		case 0:
        		
        			top = 0;
        			left = 0;
        			bottom = 0;
        			right = 0;
        			
        			break;
        			
        		case 1:
        		
        			top = 0;
        			left = width - newWidth;
        			bottom = 0;
        			right = 0;
        			
        			break;
        			
        		case 2:
        		
        			top = height - newHeight;
        			bottom = 0;
        			right = 0;
        			left = width - newWidth;
        			
        			break;
        			
        		case 3:
        		
        			top = height - newHeight;
        			bottom = 0;
        			right = 0;
        			left = 0;
        			
        			break;
        	
        	}
 					
 					if( $this.data( 'slider:vars' ).currentImage ) {
 
        		$this.data( 'slider:vars' ).currentImage.delay( 3000 ).fadeOut( o.fadeTime );
        	
        	}
        	
        	$this.data( 'slider:vars' ).nextImage.css({
        	
        		top: 0,
        		left: 0,
        		bottom: 0,
        		right: 0,
        		opacity: 0,
        		display: 'block',	
      			width: width,
      			height: height
        		
        	}).animate({
        	
        		opacity: 1,
        		width: newWidth,
        		height: newHeight,
        		top: top,
        		left: left,
        		bottom: bottom,
        		right: right        		
        	
        	}, o.pause );
        	
        	$.fn.slideshow.helper.kenBurnsLoop();
        	

        },

        fade: function( o ) {
        
        	if( $this.data( 'slider:vars' ).currentImage ) {
          	
          	$this.data( 'slider:vars' ).currentImage.fadeOut( o.fadeTime );
          	
          	if( o.reflection ) {
          	
              $( 'div', $reflectContainer ).eq( $this.data( 'slider:vars' ).currentNr ).fadeOut( o.fadeTime );
              
            }
          
          }
          
          $this.data( 'slider:vars' ).nextImage.fadeIn( o.fadeTime );
          
          if( o.reflection ) {
 
            $( 'div', $reflectContainer ).eq( $this.data( 'slider:vars' ).nextNr ).css({ 
              
              position: 'absolute',
              display: 'none'
               
            }).fadeIn( o.fadeTime );
            
          }
          

        }

      };
      
      $.fn.slideshow.controls = {
      
      	play: function( o ) {
      		
      		if( $this.data( 'slider:vars' ).stop === true ) {
      		
	      		$this.data( 'slider:vars' ).stop = false;
	      		
	      		if( !$this.data( 'slider:vars' ).currentImage ) {
	      			
	      			$this.data( 'slider:vars' ).nextNr = o.startImage;
	      			$this.data( 'slider:vars' ).nextImage = $images.eq( o.startImage );
	      		
	      		}
	      	
	      		switch( o.transition ) {
	      		
	      			case 'fade':
	      			
	      				$.fn.slideshow.transitions.fade( o );	      			
	      			
	      				timer = setInterval( function() { 
	      				
	      					$.fn.slideshow.transitions.fade( o );
	      					$.fn.slideshow.controls.cycle( o );
	      					
	      				}, o.pause );
	      			
	      				break;
	      				
	      			case 'kenBurns':
	      			
	      				$.fn.slideshow.transitions.kenBurns( o );	
	      			
	      				timer = setInterval( function() { 
	      				
	      					$.fn.slideshow.transitions.kenBurns( o );
	      					$.fn.slideshow.controls.cycle( o );	      					
	      					
	      				}, o.pause );
	      			
	      				break;
	      		
	      		}
	      		
	      		$.fn.slideshow.controls.cycle( o );
	      		
	      	}
      	
      	},
      	
      	cycle: function( o ) {
      			      		
    			$this.data( 'slider:vars' ).currentNr = $this.data( 'slider:vars' ).nextNr;
    			$this.data( 'slider:vars' ).nextNr = $.fn.slideshow.helper.nextNr();
    		
    			$this.data( 'slider:vars' ).currentImage = $this.data( 'slider:vars' ).nextImage;
    			$this.data( 'slider:vars' ).nextImage = $images.eq( $this.data( 'slider:vars' ).nextNr );
      	
      	},
      	
      	stop: function() {
      	
      		clearInterval( timer );
      		$this.data( 'slider:vars' ).stop = true;
      	
      	}
      
      };
      
      $.fn.slideshow.helper = {
      
      	nextNr: function() {
      	
      		nextNr = $this.data( 'slider:vars' ).currentNr + 1;
      		
      		if( nextNr == totalImages ) {
      		
      			nextNr = 0;
      		
      		}
      		
      		return nextNr;
      	
      	},
      	
      	kenBurnsLoop: function() {
      	
      		if( $this.data( 'slider:vars' ).kenBurnsLoop == 4 ) {
      		
      			$this.data( 'slider:vars' ).kenBurnsLoop = 0;
      		
      		} else {
      		
      			$this.data( 'slider:vars' ).kenBurnsLoop++;
      		
      		}
      	
      	}
      
      }

      $.fn.slideshow.defaults = {

        transition: 'fade',
        startImage: 0,
        pause: 5000,
        fadeTime: 2000,
        zoom: 1.4,
        reflection: true,
        refHeight: 20

      };

    })(jQuery);
