/*
 * dwslideshow.js
 * $Id: dwslideshow.js 674 2009-04-21 15:04:29Z core $
 */

var dwslideshow = Class.create({
    options: {
        slides: [],
        startIndex: 0,
        wrap: true,
        slideInterval: 2.5,
        auto: false,
        transitionDuration: 0.8,
        splitter: "&middot;",
        prev: "&laquo; ",
        next: " &raquo",
        play: "&infin;",
        stop: "&phi;",
        bigNavigation: true,
        smallNavigation: true,
        browser: true,
        addBarInside: true,
        hideText: false
    
    },
    initialize: function(container, options){
        if (container[0].up().match('a')) {
            this.containerNest = container[0].up().up();
        }
        else {
            this.containerNest = container[0].up();
        }
        this.container = container;
        retOp = $H(this.options).merge($H(options));
        this.options = retOp;
        
        this.slides = [];
        this.title = [];
        this.descr = [];
        this.effects = [];
        this.browserArr = [];
        this.playStatus = false;
        if (this.options.get('auto')) 
            this.playStatus = true;
        
        this.createStructure();
        
        this.addSlides(this.container);
        
        if (this.slides.length) {
            this.showSlide(this.options.get('startIndex'));
        }
        if (this.options.get('auto')) {
            this.autoplay();
        }
    },
    createFx: function(){
        this.slides.each(function(mys){
            mys.hide();
            mys.setOpacity(1);
        });
    },
    createStructure: function(){
        var oldClass = this.containerNest.readAttribute("class");
        this.containerNest.writeAttribute('class', '');
        this.containerNest.addClassName('dwslideshow');
        
        this.test = new Element('div', {
            'class': oldClass
        });
        this.containerNest.insert({
            'before': this.test
        });
        this.test.insert({
            'bottom': this.containerNest
        });
        
        if (!this.options.get('hideText')) {
        
            if (this.options.get('addBarInside')) {
                this.nestAll = new Element('div', {
                    'class': 'dwsnest'
                });
                this.containerNest.insert({
                    'top': this.nestAll
                });
                this.title = new Element('div', {
                    'class': 'dwstitle'
                });
                this.nestAll.insert({
                    'bottom': this.title
                });
                this.description = new Element('div', {
                    'class': 'dwsdescription'
                });
                this.nestAll.insert({
                    'bottom': this.description
                });
            }

            if (this.options.get('browser')) {            
                this.navigation = new Element('div', {
                    'class': 'dwslideshownav'
                });
                this.containerNest.insert({
                    'after': this.navigation
                });
                this.innerNavigation = new Element('div', {
                    'class': 'dwsnav2'
                });
                this.navigation.insert({
                    'bottom': this.innerNavigation
                });
                if (this.options.get('smallNavigation')) {
                    this.prevEl = new Element('span', {
                        'class': 'dwsprev'
                    });
                    this.innerNavigation.insert({
                        'bottom': this.prevEl.update(this.options.get('prev'))
                    });
                    this.prevEl.observe('click', this.cycleBack.bind(this));
                }

                this.browser = new Element('div', {
                    'class': 'dwsbrowser'
                });
                this.innerNavigation.insert({
                    'bottom': this.browser
                });
                if (this.options.get('smallNavigation')) {
                    this.nextEl = new Element('span', {
                        'class': 'dwsnext'
                    });
                    this.innerNavigation.insert({
                        'bottom': this.nextEl.update(this.options.get('next'))
                    });
                    this.nextEl.observe('click', this.cycleForward.bind(this));
                }
                this.play = new Element('span', {
                    'class': 'dwsplay'
                });
                this.innerNavigation.insert({
                    'bottom': this.play
                });
                this.play.observe('click', this.togglePlay.bind(this));
                
                if (!this.playStatus) {
                    this.play.update(this.options.get('play')).writeAttribute('title', "Play");
                }
                else {
                    this.play.update(this.options.get('stop')).writeAttribute('title', "Stop");
                }
            }
        }
        
        if (this.options.get('bigNavigation')) {
            this.bigPrev = new Element('a', {
                'class': 'dwsbigprev',
                'href': 'javascript:void(0);'
            });
            this.containerNest.insert({
                'bottom': this.bigPrev
            });
            this.bigPrev.observe('click', this.cycleBack.bind(this));
            this.bigNext = new Element('a', {
                'class': 'dwsbignext',
                'href': 'javascript:void(0);'
            });
            this.containerNest.insert({
                'bottom': this.bigNext
            });
            this.bigNext.observe('click', this.cycleForward.bind(this));
        }
    },
    addSlides: function(slides){
        var i = 1;
        
        slides.each(function(slide){
            if (!this.slides.include($(slide))) {
                this.slides.push($(slide));
            }
            
            slide.addClassName('dwssimg');
            var title = "&nbsp;";
            var descr = "";
            if (slide.readAttribute("title")) {
                split = slide.readAttribute("title").split("|");
                if (split[0]) {
                    title = split[0];
                    slide.writeAttribute("title", title);
                }
                if (split[1]) 
                    descr = split[1];
            }
            
            this.descr[this.slides.indexOf(slide)] = descr;
            this.title[this.slides.indexOf(slide)] = title;
            if (this.options.get('browser')) {
                this.browserEl = new Element('span', {
                    'class': 'dwsbrowserEl',
                    'title': title
                });
                this.browserEl.update(this.slides.indexOf(slide) + 1);
                this.browser.insert({
					'bottom': this.browserEl
				});
                
                this.browserEl.observe('click', this.cycleTo.bind(this, this.slides.indexOf(slide)));
                
                this.browserArr[this.slides.indexOf(slide)] = this.browserEl;
            }
            
            if (i != 1) {
                if (this.options.get('browser')) {
                    this.splitter = new Element('span', {
                        'class': 'splitEl'
                    }).update(this.options.get('splitter'));
                    this.browserEl.insert({
                        'before': this.splitter
                    });
                }
                slide.hide();
            } else {
            
                if (!this.options.get('hideText') && this.options.get('addBarInside')) {
                    var nestDiv = this.nestAll.getDimensions();
                }
                else {
                    var nestDiv = this.containerNest.getDimensions();
                    
                }
                var img = slide.getDimensions();
                
                if (this.options.get('bigNavigation')) {
					this.bigPrev.setStyle({
						'height': (img.height - nestDiv.height) + 'px'
					});
					this.bigNext.setStyle({
						'height': (img.height - nestDiv.height) + 'px'
					});
                    if (!this.options.get('addBarInside')) {
                        this.bigPrev.setStyle({
                            'height': img.height + 'px'
                        });
                        this.bigNext.setStyle({
                            'height': img.height + 'px'
                        });
                    }
                }
                if (this.options.get('addBarInside')) {
                    this.nestAll.setStyle({
                        'width': img.width + 'px'
                    });
                }
                if (this.options.get('browser')) {
                    var width = this.containerNest.getWidth();
                    this.navigation.setStyle({
                        'width': width - 1 + 'px'
                    });
                }
                
            }
            i++;
        }, this);
        this.createFx();
    },
    addSlide: function(slide){
        this.addSlides([slide]);
    },
    cycleForward: function(){
        if (Object.isNumber(this.now) && this.now < this.slides.length - 1) {
            this.showSlide(this.now + 1);
        } else {
            if ((this.now) && this.options.get('wrap')) {
                this.showSlide(0);
            } else {
                if (!Object.isNumber(this.now)) 
                    this.showSlide(this.options.get('startIndex'));
            }
        }
    },
    cycleBack: function(){
        if (this.now > 0) 
            this.showSlide(this.now - 1);
        else 
            if (this.options.get('wrap')) 
                this.showSlide(this.slides.length - 1);
    },
    cycleTo: function(i){
        if (this.playStatus) {
            this.togglePlay();
        }
        this.showSlide(i);
    },
    togglePlay: function(){
        if (this.playStatus) {
            this.stop();
            this.playStatus = false;
            this.play.innerHTML = this.options.get('play');
            this.play.writeAttribute('title', "Play");
        }
        else {
            this.autoplay();
            this.playStatus = true;
            this.play.innerHTML = this.options.get('stop');
            this.play.writeAttribute('title', "Stop");
        }
    },
    autoplay: function(){
		this.slideshowInt = new PeriodicalExecuter(function(pe) {
			this.slideshowInt = pe;
			this.rotate();
		}.bind(this), this.options.get('slideInterval'));
    },
    stop: function(){
        this.slideshowInt.stop();
    },
    rotate: function(){
        this.cycleForward();
    },
	_slideDataUpdate: function(){
		if (!this.options.get('hideText')) {
			if (this.options.get('addBarInside')) {
				this.description.innerHTML = this.title.innerHTML = "&nbsp;";
			}
			if (this.options.get('browser')) {
				this.browserArr.each(function(el){
					el.removeClassName("dwsact");
				});
			}
		}
	},
    showSlide: function(iToShow){
		var now = this.now;
        var currentSlide = this.slides[now];
		var slide = this.slides[iToShow];
        if (slide) {
            if (Object.isNumber(now) && now != iToShow) {
                new Effect.Parallel([new Effect.Fade(this.slides[now], {
                    	sync: true
               		}), new Effect.Appear(slide, {
                    	sync: true
                	})], {
                    	duration: this.options.get('transitionDuration'),
                    	queue: {
                        	position: 'end',
                        	scope: 'myslide'
                    	},
						afterSetup: function(el){
							this._slideDataUpdate();
							if (this.options.get('browser')) {
									this.browserArr[iToShow].toggleClassName("dwsact");
							}
						}.bind(this),
                    	afterFinish: function(el){
                        	if (!this.options.get('hideText') && this.options.get('addBarInside')) {
                            	this.description.innerHTML = this.descr[iToShow];
                            	this.title.innerHTML = this.title[iToShow];
                        	}
                    	}.bind(this)
                });
            } else {
                new Effect.Appear(slide, {
                    duration: this.options.get('transitionDuration'),
                    queue: {
                        position: 'end',
                        scope: 'mySlide'
                    },
					afterSetup: function(el){
						this._slideDataUpdate();
					}.bind(this),
					afterFinish: function(el){
						if (!this.options.get('hideText') && this.options.get('addBarInside')) {
                    		this.description.innerHTML = this.descr[iToShow];
                    		this.title.innerHTML = this.title[iToShow];
                    		if (this.options.get('browser')) {
								this.browserArr[0].toggleClassName("dwsact");
							}
                		}
					}.bind(this)
                });
            }
            this.now = iToShow;
        }
    }
});
