(function($){
    $.fadingGallery = function(el, options){
        // To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;
        
        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;
		base.iter = 0;

		//alert(base.el);
        
        // Add a reverse reference to the DOM object
        base.$el.data("fadingGallery", base);
        
        base.init = function(){
            base.options = $.extend({},$.fadingGallery.defaultOptions, options);
		
			base.activElementNb = 0;
			base.nextElementNb = 0;

            // Put your initialization code here
			if(base.getElements()){
				base.initElements();
				base.play();
			}			
        };
       
		// Recupère les éléments sur lesquels appliqués l'animation
		base.getElements = function(){

			base.firstElement = base.$el.find('*:first'); // recupération du premier element
			base.elements =  base.firstElement.add(base.firstElement.siblings()); 			

			base.activElement = base.firstElement;

			base.nextElement = base.elements.eq( base.activElementNb + 1)

			if(base.nextElement.length == 0){
				base.active = false;
			}else{
				base.active = true;
				base.nextElementNb++;
			}

			if(base.elements.length >= 1){
				return true;
			}else {
				return false;
			}
		};

		base.updateActiv = function(){
			base.activElement = base.nextElement;
			base.activElementNb = base.nextElementNb; 
			base.nextElement = base.elements.eq( base.activElementNb + 1)

			if(base.nextElement.length == 0){
				base.nextElement = base.elements.eq(0);
				base.nextElementNb = 0; 
			}else{
				base.nextElementNb++;
			}
		}

		base.initElements = function(){
			var elementsToHide = base.elements.slice(1);
			elementsToHide.css({
				display: 'block',
				opacity: 0,
				zIndex:500
			});
			base.activElement.css({zIndex:1000});
		}

		base.play = function(){
			if(base.active){
				base.playing = true;
			 	base.timer = setTimeout(function(){base.animate()},base.options.stayTime);
			}
		}


		base.animate = function(){
			if(base.active && base.playing){
				var activ = base.activElement;
				var next = base.nextElement;

				activ.before(next);

				activ.css('z-index',750);
				next.css('z-index',1000);

				next.animate({
					opacity: 1
				},base.options.fadeTime);

				activ.animate({
					opacity: 0
				},base.options.fadeTime,function(){					
					activ.css({
						zIndex: 500
					});
				});

				base.updateActiv();
				base.play();
			}
		}

		base.stop = function(){
			base.playing = false;
		}
        // Sample Function, Uncomment to use
        // base.functionName = function(paramaters){
        // 
        // };
       

        // Run initializer
        base.init();
    };
    
    $.fadingGallery.defaultOptions = {
			fadeTime: 1000,
			stayTime: 2500	
    };
    
    $.fn.fadingGallery = function(options){
        return this.each(function(){
            (new $.fadingGallery(this, options));
        });
    };
    
    // This function breaks the chain, but returns
    // the FadingGallery if it has been attached to the object.
    $.fn.getFadingGallery = function(){
        return this.data("fadingGallery");
    };
    
})(jQuery);




