/**
 * @author aduchesneau
 * Inspiré de http://clientside.cnet.com/wiki/howtowriteamootoolsclass
 */
var PubSlideShow = new Class({
    options: {
        slides: [],
        startIndex: 0,
        onShow: $empty,
        wrap: true,
		nextLink: false,
		prevLink: false,
		onSlideClick: $empty,
		direction:'forward',
		mesures:{forward:[420,-420],backward:[-420,420]},
		position:10
    },
    initialize: function(options){
        this.setOptions(options)
        this.slides = [];
        this.effects = [];
		this.locked = false;
        this.addSlides(this.options.slides);
		this.setUpNav();
        if (this.slides.length)
            this.showSlide(this.options.startIndex);
		this.timer = this.cycleForward.periodical(7000,this);
    },
    addSlides: function(slides){
        $$(slides).each(function(slide){
            this.slides.include($(slide));
            this.effects[this.slides.indexOf(slide)] = new Fx.Tween(slide, 'left',{duration:475,transition:Fx.Transitions.Quint.easeOut});
        }, this);
    },
    addSlide: function(slide){
        this.addSlides([slide]);
    },
	setUpNav: function(){
		if($(this.options.nextLink)) $(this.options.nextLink).addEvent('click', function(){
				this.cycleForward();
			}.bind(this));
		if($(this.options.prevLink)) $(this.options.prevLink).addEvent('click', function(){
				this.cycleBack();
			}.bind(this));
	},
    cycleForward: function(){
		if(!this.locked){
			this.locked=true;
			this.options.direction='forward';
			$clear(this.timer);
			this.timer = this.cycleForward.periodical(7000,this);
	        if ($chk(this.now) && this.now < this.slides.length - 1)
	            this.showSlide(this.now + 1);
	        else
	            if (this.now && this.options.wrap)
	                this.showSlide(0);
	            else
	                if (!$defined(this.now))
	                    this.showSlide(this.options.startIndex);
		}
    },
    cycleBack: function(){
		if (!this.locked) {
			this.locked = true;
			this.options.direction='backward';
	        if (this.now > 0)
	            this.showSlide(this.now - 1);
	        else
	            if (this.options.wrap)
	                this.showSlide(this.slides.length - 1);
		}
    },
	unlock: function(){
		this.locked = false;
	},
    showSlide: function(iToShow){
		var now = this.now;
        var currentSlide = this.slides[now];
        var slide = this.slides[iToShow];
		function slideIn(s,p){
			s.setStyles({
                display: 'block',
                visibility: 'visible',
                left: p
            });
			this.effects[this.slides.indexOf(s)].start(this.options.position).chain(function(){
				this.unlock();
			}.bind(this));
            this.fireEvent('onShow', [slide, iToShow]);
		}
        if (slide) {
            if ($chk(now) && now != iToShow) {
                this.effects[now].start(this.options.mesures[this.options.direction][1]).chain(function(){
                    this.slides[now].setStyle('display', 'none');
					slideIn.apply(this, [slide,this.options.mesures[this.options.direction][0]]);
                }.bind(this));
            } else {
				slideIn.apply(this, [slide,this.options.mesures[this.options.direction][0]]);
       		}
            this.now = iToShow;
        }
    }
});
PubSlideShow.implement(new Options, new Events);







