dom = document.getElementById ? true : false;
ie4 = document.all ? true : false;
ns4 = document.layers ? true : false;

var zuTimeout, MenueOben, zuAutoTm, menueOver = false;

function Menu(mname)
{
	this.menuTimeout = 0;
	this.menuTime = 0;
	this.menuName = mname;
	this.menuRelativPos = 0;
	
	this.zOffset = this.zBasis;

	//Speicher für Bencheuro
	this.benchTime = new Array();
	this.benchOffset = new Array();

	//Richtung: -1 nach oben, +1 nach unten
	this.richtung = -1;
	
	this.menuOffset = 0;

	if(dom) var hurtz = document.getElementById(mname);
	else if(ie4) var hurtz = document.all[mname];
	else if(ns4) var hurtz = document.layers[mname];
	
	if(ie4) this.menuHeight = hurtz.style.pixelHeight;
	else if(dom) this.menuHeight = hurtz.offsetHeight;
	else if(ns4) this.menuHeight = hurtz.document.height;

	if(ie4) this.menuAbsolutPos = hurtz.style.pixelTop;
	else if(dom) this.menuAbsolutPos = hurtz.offsetTop;
	else if(ns4) this.menuAbsolutPos = hurtz.top;

	this.oeffnen = oeffneMenue;
	this.bewegen = bewegeMenue;
	this.zSetzen = setzeZIndex;
	this.bildWeg = Bildwechsel;
	this.runter = down;
	
	if((this.aktiv == this.menuName)&&(this.aktivMod != 0)) 
		this.oeffnen();

	//alert(
	//	"Erstelle Menu\n----------------\nName: "+
	//	mname+"\nHöhe: "+this.menuHeight+
	//	"\nPosition: "+this.menuAbsolutPos+"\n----------------");
}

function oeffneMenue()
{
	if(this.zuOnMaus || this.richtung < 0)
	{
		if(this.aktivMod/this.optQuant != 3)
		{
			if(zuAutoTm)
			{
				clearTimeout(zuTimeout);
				menueOver = false;
				MenueOben = false;
				if(dom) menue = document.getElementById(this.menuName);
				else if(ie4) menue = document.all[this.menuName];
				else if(ns4) menue = document.layers[this.menuName];			
				if(ie4 || ns4)
				{
					if(ns4) menue.captureEvents(Event.MOUSEOVER|Event.MOUSEOUT);
					menue.onmouseover = bleibDa;
					menue.onmouseout = menuAus;
				}
				else if(dom)
				{
					menue.addEventListener("mouseover", bleibDa, false);
					menue.addEventListener("mouseout", menuAus, false);
				}
			}
			clearTimeout(this.menuTimeout);
			var zMax = this.zBasis;
			var zOpt = this.zBasis;
			for(var key in Menues)
			{
				var that = eval(Menues[key]);
				if((key != this.menuName)&&(that.menuRelativPos > 0))
				{
					zOpt++;
					if(that.zOffset > zMax) zMax = that.zOffset;
					if((key != this.aktiv)||(key == this.aktiv)&&(this.aktivMod != 3))
					{
						that.richtung = (this.aktiv == key && this.aktivMod == 2)? Math.abs(that.richtung) : -Math.abs(that.richtung);
						clearTimeout(that.zuTimeout);
						clearTimeout(that.menuTimeout);
						that.bewegen();
					}
				}
			}
			if(zMax > zOpt)
			{
				for(key in Menues)
				{
					var that = eval(Menues[key]);
					if((key != this.menuName)&&(that.zOffset > 0))
					{
						that.zOffset--;
						that.zSetzen();
					}
				}
			}
			this.zOffset = ++zOpt;
			this.zSetzen();
			if((this.aktiv == this.menuName)&&(this.aktivMod != 0))
			{
				if(this.aktivMod == 3) this.aktivMod *= this.optQuant;
				if(this.aktivRol == 0)
				{
					this.aktivRol++;
					this.menuRelativPos = this.menuHeight;
				}
				if(this.aktivMod/this.optQuant == 2)
				{
					this.menuRelativPos = this.menuHeight;
					this.richtung = -this.richtung;
				}
				if(this.aktivMod == 2)
				{
					this.aktivMod *= this.optQuant;
					//this.menuRelativPos = this.menuHeight;
					//this.richtung = -this.richtung;
				}
			}		
			this.bildWeg(1);
			this.richtung = -this.richtung;
			this.bewegen();
		}
	}
}

function bewegeMenue()
{
	this.menuTime = Math.round(Math.asin(this.menuRelativPos/this.menuHeight)*this.Geschwindigkeit*10/Math.PI);
	this.menuOffset = Math.ceil(Math.acos(this.menuRelativPos/this.menuHeight)*this.Geschwindigkeit/Math.PI);

	if(this.menuOffset == 0) this.menuOffset++;
	
	//this.menuRelativPos = ((this.richtung == 1)||(this.menuName == this.aktiv && this.aktivMod == 2 && this.richtung == -1))? this.menuRelativPos+this.menuOffset : this.menuRelativPos-this.menuOffset;
	this.menuRelativPos = (this.richtung == 1)? this.menuRelativPos+this.menuOffset : this.menuRelativPos-this.menuOffset;

	if(this.menuRelativPos > this.menuHeight) this.menuRelativPos = this.menuHeight;
	else if(this.menuRelativPos < 0) this.menuRelativPos = 0;

	if(dom) document.getElementById(this.menuName).style.top = this.menuAbsolutPos-this.menuRelativPos;
	else if(ie4) document.all[this.menuName].style.top = this.menuAbsolutPos-this.menuRelativPos;
	else if(ns4) document.layers[this.menuName].top = this.menuAbsolutPos-this.menuRelativPos;

	//Benschmark-Messung...
	this.benchTime[this.benchTime.length] = this.menuTime;
	this.benchOffset[this.benchOffset.length] = this.menuOffset;

	if((this.menuRelativPos != this.menuHeight)&&(this.menuRelativPos != 0))
		this.menuTimeout = Zeitaus(this.menuName,this.menuTime,"bewegen");
	
	else
	{
		if(this.menuRelativPos == 0)
			this.bildWeg(0);			
		else
		{
			if(zuAutoTm > 0)
			{
				if((this.aktiv != this.menuName)||(this.aktivMod == 0)||(this.aktivMod/this.optQuant == 1))
				{
					MenueOben = this.menuName;
					//zuTimeout = Zeitaus(this.menuName,this.zuAutoTm*1000,"bewegen");
					if(!menueOver) menuAus();
				}
				else if((this.aktiv == this.menuName)&&(this.aktivMod == 1))
					this.aktivMod *= this.optQuant;
			}
		}
			
		/*Test-Ausgabe
		if(this.benchTime.length > 0)
		{
			//alert("Position eingenommen\nDurschnittliche Geschw.: "+
			//	eval(this.benchTime.join('+'))/this.benchTime.length+
			//	"\nEinzelwerte (ab Start): "+this.benchTime.join(", ")+
			//	"\nOffsetwerte: "+this.benchOffset.join(", "));
			this.benchTime  = new Array();
			this.benchOffset = new Array();
		}*/
	}
}

function bleibDa()
{
	if(!MenueOben) menueOver = true;
	else
	{
		clearTimeout(zuTimeout);
	}
}

function menuAus()
{
	if(!MenueOben) menueOver = false;
	else
	{
		zuTimeout = Zeitaus(MenueOben,zuAutoTm*1000,"runter");
	}
}

function down()
{
	this.richtung = -this.richtung;
	menueOver = false;
	MenueOben = false;
	this.bewegen();
}

function setzeZIndex()
{
	if(ie4) document.all[this.menuName].zIndex = this.zOffset;
	else if(dom) document.getElementById(this.menuName).style.zIndex = this.zOffset;
	else if(ns4) document.layers[this.menuName].zIndex = this.zOffset;
}

function Bildwechsel(knipps)
{
	if(dom || ie4)
	{
		if(!dom) menue = document.all[this.menuName];
		else menue = document.getElementById(this.menuName);
		menue.style.visibility = knipps ? "visible" : "hidden";
		document.images[this.menuName].src = eval(this.menuName+"_"+knipps).src;
	}
	else if(ns4)
	{
		document.layers[this.menuName].visibility = knipps ? "show" : "hide";
		document.layers["Layout"].document.images[this.menuName].src = eval(this.menuName+"_"+knipps).src;
	}
}

function Zeitaus(mname,mtime,mtode)
{
	return setTimeout("Menues."+mname+"."+mtode+"()",mtime);
}

function MenuInit()
{
	Menu.prototype.aktivRol = 1;
	Menu.prototype.aktivMod = 1;
	Menu.prototype.zuOnMaus = 0;
	zuAutoTm = 3;
	Menu.prototype.zBasis = 20;
	Menu.prototype.optQuant = 10;
	Menu.prototype.Geschwindigkeit = (dom && !ie4)? 10 : 18;
	Menu.prototype.Beschleunigung = 0;
	Menues = new Object();
	for(var i=0; i<arguments.length; i++)
		Menues[arguments[i]] = new Menu(arguments[i]);
}
