function cSlideShow(SlideLeinwand, SlideBox, SlideElemente, prevButton, nextButton)
{	
	this.__construct = function(SlideLeinwand, SlideBox, SlideElemente, prevButton, nextButton)
	{
		this.SlideLeinwand 			= SlideLeinwand;
		this.SlideBox 				= SlideBox;
		this.prevButton 			= prevButton;
		this.nextButton 			= nextButton;

		this.SlideElemente 			= (SlideElemente) ? SlideElemente : false;
	}

	//--- SlideShow Initialisieren - Objecte Laden, SlideElemente suchen, Buttons mit Event belegen
	this.init = function(ausrichtung,SliderDisplay)
	{
		this.SlideLeinwand 			= new CElement(this.SlideLeinwand);	//--- Box in der die Slideshow gezeigt wird
		this.SlideBox 				= new CElement(this.SlideBox);		//--- Box mit SlideElementen
		this.prevButton 			= new CElement(this.prevButton);	//--- Anfang des ID-Namens um Elemente zu identifizieren
		this.nextButton 			= new CElement(this.nextButton);	//--- Alle SlideElemente als Object
		
		this.arSlideElemente 		= new Array();						//--- Enthält alle SlideElemente
		
		this.countElemente 			= 0;								//--- count(arSlideElemente)
		this.visisbleElemente 		= 0;								//--- anzahl aller sichtbaren Elemente
		this.abweichungen			= 0;								//--- Der IE spinnt ein wenig wenn man die Elemente im DOM verschiebt, es kann zu height differenzen kommen
		
		//--- Brech das initialisieren ab wenn eines der objekte nicht vorhanden ist ODER keine Elemente gefunden wurden
		if(!this.SlideLeinwand.obj || !this.SlideBox.obj || !this.SlideElemente || !this.prevButton.obj || !this.nextButton.obj
			|| !this._searchElemente(this.SlideBox.obj)
		)
		{			
			return false;
		}
		
		step = false;
		jumpStep = false;		
		this.SliderDisplay			= (SliderDisplay) ? true : false;
		this.ausrichtung 			= (ausrichtung == true) ? "marginTop" : "marginLeft";		
		this.step 					= (step) ? step : 7;
		this.jumpStep 				= (jumpStep) ? jumpStep : 1;	

		this.interval 				= false;
		this.stepInterval 			= 0;

		this.SlideElementBegrenzung = 0;
		this.SlideJump 				= 0;
		this.standingElement 		= 0;	
		
		this._setCSS();
		this._setSlideJump();
		
		return this.setButtons((this.countElemente > this.visisbleElemente));
	}
	
	//--- Rechnet die sichtbaren Elemente aus und setzt den SlideJumper
	this._setSlideJump = function()
	{
		//--- Groeß eines Elementes ausrechnen & wieviele Elemente auf der Leinwand sichtbar sind
		this.SlideBox.setStyle("display","none");  //--- Workaround für den dummen IE, der das width anhand der inneren Box setzt
		this.SlideLeinwand.getProp();
		if(this.ausrichtung == "marginLeft")
		{			
			this.SlideElementBegrenzung = this.arSlideElemente[0].prop['abs_width'];
			this.SlideBox.setStyle("width",this.SlideElementBegrenzung * this.countElemente);
			this.visisbleElemente = Math.round(this.SlideLeinwand.prop['width'] / this.SlideElementBegrenzung);
		}else{			
			this.SlideElementBegrenzung = this.arSlideElemente[0].prop['abs_height'];
			this.SlideBox.setStyle("height",this.SlideElementBegrenzung * this.countElemente);			
			this.visisbleElemente = Math.round(this.SlideLeinwand.prop['height'] / this.SlideElementBegrenzung);
		}
		this.SlideBox.setStyle("display","");
		
		//--- Jumper aktivieren wenn genug Elemente links und Rechts vorhanden sind		
		if(this.countElemente <= this.visisbleElemente + 1)
		{
			this.SlideJump = 0;
		}else{
			this.SlideJump = Math.round(this.SlideElementBegrenzung / 10);
		}	
	}
	
	//--- SlideShow Button aktivieren falls genug Elemente vorhanden sind, ansonsten ausblenden
	this.setButtons = function(checker)
	{
		if(checker)
		{
			addEvent(this.prevButton.obj , "click" , this.prev.scope(this));
			addEvent(this.nextButton.obj , "click" , this.next.scope(this));
			this.prevButton.setStyle("display","");
			this.nextButton.setStyle("display","");		
			this._replaceSlideElementeFront();		
		}else if(!this.SliderDisplay){
			this.prevButton.setStyle("display","none");
			this.nextButton.setStyle("display","none");		
		}
		
		return checker;
	}
	
	//--- Leinwand stylen
	this.setLeinwandStyle = function(style,wert)
	{
		this.SlideLeinwand.setStyle(style,wert);
		this._setSlideJump();
	}
	
	//--- Eigenschaft von prevButton zurückgeben  (wird für Teaser gebraucht)
	this.prevButtonStyle = function(eigenschaft)
	{
		prevButton = new CElement(this.prevButton);
		if(prevButton.prop[eigenschaft])
		{
			return prevButton.prop[eigenschaft];
		}else{
			return prevButton.getStyle(eigenschaft);
		}		
	}

	//--- Eigenschaft von nextButton zurückgeben  (wird für Teaser gebraucht)
	this.nextButtonStyle = function(eigenschaft)
	{
		nextButton = new CElement(this.nextButton);
		if(nextButton.prop[eigenschaft])
		{
			return nextButton.prop[eigenschaft];
		}else{
			return nextButton.getStyle(eigenschaft);
		}		
	}
	
	//--- zurück bewegen
	this.prev = function(e)
	{
		if(this.interval)
		{
			return false;
		}
		this.standingElement++;
		this.jumpStep = Math.abs(this.jumpStep);
		this.step = Math.abs(this.step) * -1;		
		if(this.SlideJump === 0)
		{
			this._replaceSlideElementeBack();
		}
		this.interval = window.setInterval(this._slideJump.scope(this,"slide"),1);		
	}

	//--- vorwärts bewegen
	this.next = function(e)
	{		
		if(this.interval)
		{
			return false;
		}
		this.standingElement--;
		this.jumpStep = Math.abs(this.jumpStep) * -1;
		this.step = Math.abs(this.step);
		this.interval = window.setInterval(this._slideJump.scope(this,"slide"),1);		
	}

	//--- Element von hinten nach vorne holen
	this._replaceSlideElementeFront = function()
	{
		this.arSlideElemente[this.countElemente - 1].insertBefore(this.arSlideElemente[0].obj);			
		this.SlideBox.setStyle(this.ausrichtung,this.SlideElementBegrenzung * -1);
		var dummy = this.arSlideElemente[this.countElemente - 1];
		for(var i = this.countElemente - 1; i > 0;i--)
		{				
			this.arSlideElemente[i] = this.arSlideElemente[i - 1];
		}
		this.arSlideElemente[0] = dummy;
	}

	//--- Element von vorne nach hinten holen
	this._replaceSlideElementeBack = function()
	{
		//--- SlideShow nach vorne bewegen - erstes Element hinten anhängen		
		this.SlideBox.getProp();
		this.abweichungHeight = this.SlideBox.prop['height'];
//		decho("D Height: " + this.SlideBox.prop['height'] + " - Width: " + this.SlideBox.prop['width']);
//		decho("D Margin: " + this.SlideBox.getStyle("marginTop") + " " + this.SlideBox.getStyle("marginRight") + " " + this.SlideBox.getStyle("marginBottom") + " " + this.SlideBox.getStyle("marginLeft"));
//		decho("D Padding: " + this.SlideBox.getStyle("paddingTop") + " " + this.SlideBox.getStyle("paddingRight") + " " + this.SlideBox.getStyle("paddingBottom") + " " + this.SlideBox.getStyle("paddingLeft"));
//		decho("D Top: " + this.SlideBox.prop['abs_top'] + " Left: " + this.SlideBox.prop['abs_left']);
		this.arSlideElemente[0].appendNode(this.SlideBox.obj);
		this.SlideBox.getProp();
//		decho("Height: " + this.SlideBox.prop['height'] + " - Width: " + this.SlideBox.prop['width']);
//		decho("Margin: " + this.SlideBox.getStyle("marginTop") + " " + this.SlideBox.getStyle("marginRight") + " " + this.SlideBox.getStyle("marginBottom") + " " + this.SlideBox.getStyle("marginLeft"));
//		decho("Padding: " + this.SlideBox.getStyle("paddingTop") + " " + this.SlideBox.getStyle("paddingRight") + " " + this.SlideBox.getStyle("paddingBottom") + " " + this.SlideBox.getStyle("paddingLeft"));
//		decho("Top: " + this.SlideBox.prop['abs_top'] + " Left: " + this.SlideBox.prop['abs_left']);
		this.abweichungHeight = this.abweichungHeight - this.SlideBox.prop['height'];
		this.SlideBox.setStyle(this.ausrichtung,this.SlideElementBegrenzung * (this.countElemente - this.visisbleElemente - 1) * -1);
		var marginTop = parseFloat(this.SlideBox.getStyle("marginTop"));
		if(!marginTop)
		{
			marginTop = 0;
		}
		this.SlideBox.setStyle("marginTop", marginTop + this.abweichungHeight);			 
/*		this.SlideBox.getProp();
		var heightCache = this.SlideBox.prop['abs_height'];		
		this.arSlideElemente[0].appendNode(this.SlideBox.obj);
		this.SlideBox.getProp();
		this.abweichungen += heightCache - this.SlideBox.prop['abs_height'];
		this.SlideBox.setStyle(this.ausrichtung,this.SlideElementBegrenzung * (this.countElemente - this.visisbleElemente - 1) * -1 + this.abweichungen);
*/		
//		alert("wo ist das Fehlerchen?");
		var dummy = this.arSlideElemente[0];
		for(var i = 0; i < this.countElemente - 1;i++)
		{				
			this.arSlideElemente[i] = this.arSlideElemente[i + 1];
		}
		this.arSlideElemente[this.countElemente - 1] = dummy;
	}
	
	//--- Wenn 2 Elemente mehr vorhanden sind als sichtbar erhält die SlideShow einen Jump Effekt
	this._slideJump = function(e, arArray)
	{		
		if(Math.abs(this.stepInterval + this.jumpStep) < this.SlideJump)
		{			
			var step = parseFloat(this.SlideBox.getStyle(this.ausrichtung)) + this.jumpStep;
			this.SlideBox.setStyle(this.ausrichtung,step);
			this.stepInterval += this.jumpStep;
		}else{			
			//--- aufgrund von Rundungsfehlern muss die SlideBox nach dem Jump pixel genau positioniert werden
			if(this.jumpStep > 0)
			{
				var step = parseFloat(this.SlideBox.getStyle(this.ausrichtung)) - this.stepInterval + this.SlideJump;	
			}else{
				var step = parseFloat(this.SlideBox.getStyle(this.ausrichtung)) - this.stepInterval - this.SlideJump;
			}
			this.SlideBox.setStyle(this.ausrichtung,step);
		
			window.clearInterval(this.interval);
			this.stepInterval = 0;			
			this.interval = false;
			if(arArray[1] == "slide")
			{
				this.interval = window.setInterval(this._slide.scope(this),1);
			}
		}
	}
	
	//--- Eigentlicher Slide effekt
	this._slide = function()
	{		
		if(Math.abs(this.stepInterval + this.step) < this.SlideElementBegrenzung + this.SlideJump * 2)
		{
			var step = parseFloat(this.SlideBox.getStyle(this.ausrichtung)) + this.step;
			this.SlideBox.setStyle(this.ausrichtung,step);
			this.stepInterval += this.step;
		}else{						
			if(this.step > 0)
			{	
				this._replaceSlideElementeFront();
				//--- damit die Box nicht über das Ziel hinausschiesst wird sie auf letzte möglichen punkt gesetzt				
				var step = ((this.SlideElementBegrenzung * 1) - this.SlideJump) * -1;
			}else{
				if(this.SlideJump > 0)
				{
					this._replaceSlideElementeBack();
				}
				//--- damit die Box nicht über das Ziel hinausschiesst wird sie auf letzte möglichen punkt gesetzt
				var step = ((this.SlideElementBegrenzung * 1) + this.SlideJump) * -1;
			}
			this.SlideBox.setStyle(this.ausrichtung,step + this.abweichungen);
			window.clearInterval(this.interval);
			this.interval = false;			
			this.stepInterval = 0;			
			this.interval = window.setInterval(this._slideJump.scope(this),1);			
		}
	}

	//--- SlideShow Elemente anhand der Anfangs Id raussuchen
	this._searchElemente = function(knoten)
	{		
		if(knoten)
		{			
			if(knoten != this.SlideBox.obj && knoten.id && knoten.id.indexOf(this.SlideElemente) == 0)
			{					
				this.arSlideElemente[this.arSlideElemente.length] = new CElement(knoten);
			}
			
			if(knoten.hasChildNodes())
			{
				for(var i = 0;i <= knoten.childNodes.length; i++)
				{
					this._searchElemente(knoten.childNodes[i]);
				}
			}
		}

		this.countElemente = this.arSlideElemente.length;		
		if(this.countElemente > 0) 
		{
			return true;
		}else{
			return false;
		}
	}
	
	//--- das notwendige CSS setzen
	this._setCSS = function()
	{
		this.SlideLeinwand.setStyle("overflow","auto");
		this.SlideLeinwand.setStyle("overflowX","hidden");
		this.SlideLeinwand.setStyle("overflowY","hidden");		
	}
	this.__construct(SlideLeinwand, SlideBox, SlideElemente, prevButton, nextButton);
}