/**
 * imagerotator
 * Wechselt per Ajax-Request übergebene Bilder und Texte in einem definierten Element aus
 *
 * @author J.Hahn <info@buero-hahn.de>
 * @version 2009-07-09
 */
 
 	var imageRotator = Class.create();
	
	imageRotator.prototype = {
			
		initialize: function(params) {
			
			this.defaultParams = new Object({
				imageSelector : '.cmtImageRotatorImageContainer',
				textSelector : '.cmtImageRotatorTextContainer',
				textContainerID : 'cmtImageRotatorContentContainer',
				imageContainerID : 'cmtImageRotatorImageContainer',
				fadeInSeconds : 1,
				fadeOutSeconds : 1,
				initialFadeInSeconds : 0.3,
				showContentSeconds : 10
			})
			this.params = this.mergeParams(params);

			Event.observe(document, 'dom:loaded', this.initRotator.bindAsEventListener(this));
		
		},
		
		initRotator: function() {
			
			// Alle Bilder und Texte auslesen
			this.images = $$(this.params.imageSelector);
			this.texts = $$(this.params.textSelector);
			
			this.imagesCount = this.images.length;
			
			// Container referenzieren
			this.imageContainer = $(this.params.imageContainerID);
			this.textContainer = $(this.params.textContainerID);

			// Inhalte und weiteren Content ausblenden
			this.hideAllContainer();
			this.hideAllContent();

			// starten, wenn erstes Bild geladen
			this.startRotator();
		},

		startRotator: function(ev) {
			// Containerinhalte anzeigen
			this.hideAllContent();
			
			// Container einblenden
			this.showAllContainer();
			
			// Aktueller Bildzähler
			this.currentImage = 0;

			// Mit erstem Bild starten
			this.showContent(this.currentImage);

			// Warteschleife starten
			if (this.imagesCount > 1) {
				this.startWaiting();
			}
		},
		
		nextContent: function() {
			this.contentChangeExecuter.stop();
			
			// Altes Bild ausblenden
			this.hideContent(this.currentImage);
			
			// hochzählen und neues Bild anzeigen
			this.currentImage += 1;
			if (!this.images[this.currentImage]) {
				this.currentImage = 0;
			}
			this.showContent(this.currentImage);
			
			// Warteschleife erneut starten
			this.startWaiting();
		},

		showContent: function(index) {
			this.images[index].appear({duration: this.params.fadeInSeconds});
			this.texts[index].appear({duration: this.params.fadeInSeconds});
		},

		hideContent: function(index) {
			this.images[index].fade({duration: this.params.fadeOutSeconds});
			this.texts[index].fade({duration: this.params.fadeOutSeconds});
		},
	
		hideAllContainer: function() {
			this.imageContainer.hide();
			this.textContainer.hide();
		},

		showAllContainer: function() {
			this.imageContainer.appear({duration: this.params.initialFadeInSeconds});
			this.textContainer.appear({duration: this.params.initialFadeInSeconds});
		},
		
		hideAllContent: function() {
			this.images.each(
				function(s) {
					//$(s).setStyle({display: 'block'});
					//$(s).setOpacity(0);
					$(s).hide();
				}
			)
			this.texts.each(
				function(s) {
					$(s).setStyle({display: 'block'});
					$(s).hide();
				}
			)
		},
		
		startWaiting: function() {
			this.contentChangeExecuter = new PeriodicalExecuter(this.nextContent.bind(this), this.params.showContentSeconds);
		},
		
		
		/**
		 * function mergeParams();
		 * 
		 * simuliert ein array_merge
		 * 
		 * @param object Parameter, die mit this.defaultParams verknüpft werden sollen.
		 * @return object Zusammengeführte Objekte
		 */
		mergeParams: function(params) {
			return Object.extend(this.defaultParams, params);
		}
	};
	
	is = new imageRotator();