var SimpleSlideShowDemo = new Class({
	options: {
		slides: [],
		startIndex: 0,
		wrap: true,
		onShow: Class.empty, //Mootools 1.2: $empty
		onRotate: Class.empty,
		onStop: Class.empty,
		onAutoPlay: Class.empty,
		onShowSlide: Class.empty,
		slideInterval: 3500,
		auto:false,
		transitionDuration: 700,
		splitter:"&middot;",
		prev:"&laquo; ",
		next:" &raquo",
		play:"&infin;",
		stop:"&phi;",
		bigNavigation : true,
		smallNavigation: true,
		browser:true,
		addBarInside:true,
		hideText:false
	},
	initialize: function(container,options){
		// Erweiterung
		this.events = new Hash({'mousemove': []});
		this.slideshow = container[0].getParent();
		
		var keys = ['slideshow', 'first', 'prev', 'play', 'pause', 'next', 'last', 'images', 'captions', 'controller', 'thumbnails', 'hidden', 'visible', 'inactive', 'active', 'loader'];
		var values = keys.map(function(key, i){
			return key;
		}, this);
		this.classes = values.associate(keys);
		this.classes.get = function(){
			var str = '.' + this.slideshow;
			for (var i = 0, l = arguments.length; i < l; i++)
				str += ('-' + this[arguments[i]]);
			return str;
		}.bind(this.classes);
	  	/*
		if (container[0].getParent().getTag()=='a') {
     		this.containerNest = container[0].getParent().getParent();
    	} else {
      		this.containerNest = container[0].getParent();
    	}
		*/
		this.containerNest = container[0].getParent();

		this.container = container;
		this.setOptions(options);
		this.slides = [];
		this.title = [];
		this.descr = [];
		this.effects = [];
		this.browserArr = [];
		this.playStatus = false;
		if (this.options.auto) this.playStatus = true;

		this.createStructure();
		this.addSlides(this.container);
		if(this.slides.length) this.showSlide(this.options.startIndex);
		if (this.options.auto) {
			this.autoplay();
		 	// this.playStatus = true;
		}
		
	},

	createFx: function(){
		this.slideFx = new Fx(this.slides, {duration: this.options.transitionDuration});
		this.slides.each(function(slide){
			slide.setStyle('opacity',0);
		});
	},	
	createStructure: function() {
  		var oldClass = this.containerNest.getProperty("class");
    	this.containerNest.setProperty('class', '');
	  	this.containerNest.addClass('rgslideshow');
	  
	  	this.test = new Element('div').addClass(oldClass).injectBefore(this.containerNest);
	  	this.containerNest.injectInside(this.test);
	  
	  	if (!this.options.hideText) {
	  	  
      		if (this.options.addBarInside) {
      			this.nestAll = new Element('div', {'id':'rgsnest'}).setProperty('class', 'rgsnest').setStyle('bottom',-90).injectTop(this.containerNest);
        		this.title = new Element('div').setProperty('class', 'rgstitle').injectInside(this.nestAll);
        		this.description = new Element('div').setProperty('class', 'rgsdescription').injectInside(this.nestAll);
				
				//(function() { $('rgsnest').removeClass('hidden')}).delay(2000);
      		}
      		//	  this.nestAll = new Element('div').setProperty('class', 'rgslideshow').injectAfter(this.containerNest);
      
      		// if (this.options.addBarInside) this.titleOp = new Element('div').setProperty('class', 'optitle').injectInside(this.nestAll);
    		//  this.nestDescription = new Element('div').setProperty('class', 'descr').injectInside(this.nestAll);
    		//  if (this.options.addBarInside) this.descriptionOp = new Element('div').setProperty('class', 'opdescr').injectInside(this.nestAll);
      
   
       		if (this.options.browser) {
       
        		this.navigation = new Element('div').setProperty('class', 'rgslideshownav').injectAfter(this.containerNest);
        		this.innerNavigation = new Element('div').setProperty('class', 'rgsnav2').injectInside(this.navigation);
        
        		if(this.options.smallNavigation) this.prevEl = new Element('span').setProperty('class', 'rgsprev').injectInside(this.innerNavigation).setHTML(this.options.prev).addEvent('click', this.cycleBack.bind(this));
        		this.browser = new Element('div').setProperty('class', 'rgsbrowser').injectInside(this.innerNavigation);
       			if(this.options.smallNavigation)  this.nextEl = new Element('span').setProperty('class', 'rgsnext').injectInside(this.innerNavigation).setHTML(this.options.next).addEvent('click', this.cycleForward.bind(this));
        		this.play = new Element('span').setProperty('class', 'rgsplay').injectInside(this.innerNavigation).addEvent('click', this.togglePlay.bind(this));    
  
        		if (!this.playStatus) {
          			this.play.setHTML(this.options.play).setProperty('title',"Play");
        		} else {
          			this.play.setHTML(this.options.stop).setProperty('title',"Stop");
        		}
       		} 
    	}

    	if (this.options.bigNavigation) {
      		this.bigPrev = new Element('a', {'id':'rgsbigprev'}).setProperties({'class': 'rgsbigprev', 'href': "javascript:void(0);"}).injectInside(this.containerNest).addEvent('click', this.cycleBack.bind(this));
      		this.bigNext = new Element('a', {'id':'rgsbignext'}).setProperties({'class': 'rgsbignext', 'href': "javascript:void(0);"}).injectInside(this.containerNest).addEvent('click', this.cycleForward.bind(this));
    	}    
    
    	this.createFx();
    	this.showHideBar();
  	},
	showHideBar: function() {
		var captions = $('rgsnest');
		captions.set({
			'events': {
				'hide': function(hidden){  
					if (!this.retrieve('hidden')) {
						this.store('hidden', true).morph(hidden);
						$('rgsnest').tween('bottom',[-90,0]);
					}
				},
				'show': function(visible){  
					if (this.retrieve('hidden')) {
						this.store('hidden', false).morph(visible);
						$('rgsnest').tween('bottom',[0,-90]);
					}
				}
			}
		});
		this.slideshow.store('captions', captions);
		var mousemove = function(e){
 			var images = $(this.containerNest).getCoordinates();
			if (e.page.x > images.left && e.page.x < images.right && e.page.y > images.top && e.page.y < images.bottom) {
				this.slideshow.retrieve('captions').fireEvent('hide');
			} else {
				this.slideshow.retrieve('captions').fireEvent('show');
			}
		}.bind(this);
		this.events.mousemove.push(mousemove);
		document.addEvent('mousemove', mousemove);
  	},
	
	addSlides: function(slides){
    	var i =1;

		slides.each(function(slide){
			this.slides.include($(slide));
			
			this.effects[this.slides.indexOf(slide)] = new Fx.Tween(slide, {
				fps: 150,
				property: 'left',
				duration: 700
			});

			slide.addClass('rgssimg');
        	var title = "&nbsp;";
        	var descr = "";
        	if (slide.getProperty("title")) {
        		split = slide.getProperty("title").split("|");
          		if (split[0]) {
            		title = split[0];
            		slide.setProperty("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.browser) {  			
        		this.browserEl = new Element('span').setProperties({'class': 'rgsbrowserEl', 'title': title}).setHTML(this.slides.indexOf(slide)+1).injectInside(this.browser);
    			//    this.browserEl.setProperty('id',this.options.paginationSelector+i);
  				this.browserEl.addEvent('click', this.cycleTo.bind(this,this.slides.indexOf(slide)));
  				this.browserArr[this.slides.indexOf(slide)] = this.browserEl;
  			}
			
			if (i!=1) {
      			if(this.options.browser) this.splitter = new Element('span').setProperty('class', 'rgssplitEl').setHTML(this.options.splitter).injectBefore(this.browserEl);
      			slide.setStyle('display','none');
      		} else {
        		if (!this.options.hideText && this.options.addBarInside) {
          			var nestDiv = this.nestAll.getSize();
        		} else {
          			var nestDiv = this.containerNest.getSize();
        	}

			var img = slide.getSize();
/*
    		if(this.options.bigNavigation) {          
          		this.bigPrev.setStyle('height',(slide.getProperty("height")-nestDiv.y)+'px');
          		this.bigNext.setStyle('height',(slide.getProperty("height")-nestDiv.y)+'px');
          		if(!this.options.addBarInside) {
	          		this.bigPrev.setStyle('height',(slide.getProperty("height"))+'px');
	          		this.bigNext.setStyle('height',(slide.getProperty("height"))+'px');
				}					 
        	}
*/    		
			if(this.options.addBarInside) { 
    		  	this.nestAll.setStyle('width',slide.getProperty("width")+'px');
    		}
    	  
		  	if(this.options.browser) {
          		var width =  this.containerNest.getSize();
    		  	this.navigation.setStyle('width',width.x-1+'px');
        	}
     	}
		i++;
		}, this);
	},
	addSlide: function(slide){
		this.addSlides([slide]);
	},
	cycleForward: function(){
		if($chk(this.now) && this.now < this.slides.length-1) {
			this.showSlide((this.now+1), 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.now > 0) this.showSlide((this.now-1), 0);
		//else if(this.options.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.play;
      this.play.setProperty('title',"Play");
    }
    else {
      this.autoplay();
      this.playStatus = true;
      this.play.innerHTML = this.options.stop;
      this.play.setProperty('title',"Stop");
    }
  },
	autoplay: function(){
		this.slideshowInt = this.rotate.periodical(this.options.slideInterval, this);
		fireEvent('onAutoPlay');
	},
	stop: function(){
		clearInterval(this.slideshowInt);
		fireEvent('onStop');
	},  	
	rotate: function(){
		this.cycleForward();
		fireEvent('onRotate');
	},	
	showSlide: function(iToShow,direction){
		
		var now = this.now;		
		var currentSlide = this.slides[now];
		var slide = this.slides[iToShow];
		
		function fadeIn(s){
			s.setStyles({
				display:'block',
				visibility: 'visible',
				left: '940px',
				opacity: 1
			});
			this.effects[this.slides.indexOf(s)].start(0);
			fireEvent('onShow', [slide, iToShow]);
		};
    	
		function fadeInLeft(s){
			s.setStyles({
				display:'block',
				visibility: 'visible',
				left: '-940px',
				opacity: 1
			});
			this.effects[this.slides.indexOf(s)].start(0);
			fireEvent('onShow', [slide, iToShow]);
		};
    	
    	if (!this.options.hideText) {
      		if (this.options.addBarInside) this.description.innerHTML = this.title.innerHTML = "&nbsp;";
      		if(this.options.browser) {
        		this.browserArr.each(function(el) {
          			el.removeClass("rgsact");
        		});
      		}
    	}

		if(slide) {
			if($chk(now) && now != iToShow){ // nach start
				this.effects[now].start(0).chain(function(){
					this.slides[now].setStyle('display', 'block');
					if (direction===0) fadeInLeft.apply(this, [slide]);
					else fadeIn.apply(this, [slide]);
          			if (!this.options.hideText && this.options.addBarInside) {
            			this.description.innerHTML  = this.descr[iToShow];
            			this.title.innerHTML  = this.title[iToShow];
            			if(this.options.browser) this.browserArr[this.now].addClass("rgsact");
          			}
					if (iToShow!==0) $('rgsbigprev').setStyle('opacity',0.8);
					if (iToShow!==(this.slides.length-1)) $('rgsbignext').setStyle('opacity',0.8);
					if (direction===0) {
						this.slides[now].set('tween',{duration: 700}).tween('left', [0,940]);
					} else {
						this.slides[now].set('tween',{duration: 700}).tween('left', [0,-940]);
					}
				}.bind(this));
			} else { // start
        		//fadeIn.apply(this, [slide]);
          		if (!this.options.hideText && this.options.addBarInside) {
  		      		this.description.innerHTML  = this.descr[iToShow];
            		this.title.innerHTML  = this.title[iToShow];
            		if(this.options.browser) this.browserArr[0].addClass("rgsact");
          		}
      		}
			if (iToShow===0) $('rgsbigprev').setStyle('opacity',0);
			if (iToShow===(this.slides.length-1)) $('rgsbignext').setStyle('opacity',0);
			this.now = iToShow;
		}
	}
});
SimpleSlideShowDemo.implement(new Options, new Events);

