/* 
	Copyright:	(c) 2000-2001, IDEAL communications
				Alle Rechte vorbehalten
*/

		function ic_hasDOM()
		{
			return ( document.implementation && document.implementation.hasFeature('HTML','') );
		}

		function ic_getObject(id)
		{
			if ( ic_hasDOM() )
			{
				return document.getElementById(id);
			}
			else if ( document.all )
			{
				return document.all[id];
			}
			else if ( document.layers )
			{
				// Netscape kann zwar - ueber spezielle Kollektionen - auch andere 
				// Objekte ansprechen, aber wir interessieren uns nur fuer
				// Layer.
				
				return document.layers[id];
			}

			return null;
		}
		
		function ic_hideObject(obj)
		{
			// Kompensieren fuer Netscape 4 (der Ansatz
			// ist von DreamWeaver geklaut)
			
			if ( obj.style ) { obj = obj.style; }
			obj.visibility = 'hidden';
		}

		function ic_showObject(obj)
		{
			if ( obj.style ) { obj = obj.style; }
			obj.visibility = 'visible';
		}
		
		function ic_isObjectVisible(obj)
		{
			if ( obj.style ) { obj = obj.style; }
			return (obj.visibility == 'visible');
		}
		
		function ic_pointInObject(x, y, obj)
		{
			// FIXME -- funktioniert nicht wirklich; scheitert in erster Linie
			// daran, dass es keinen allgemeingueltigen Weg gibt, Breite und
			// Hoehe eines Objekts festzustellen ...
			
			// In Netscape 6 zum Beispiel koennen nur die Attribute abgefragt 
			// werden, die im Stylesheet explizit gesetzt sind!

			if ( obj.style ) { obj = obj.style; }
			
			return x >= obj.left && x <= obj.left + obj.width &&
			       y >= obj.top && y <= obj.top + obj.height;
		}
		
		function ic_registerMenu(menu, parent)
		{
			// Netscape kann zwar offiziell "onMouseOver" und "onMouseOut"
			// Events fuer Layer aber aus irgendeinem Grund muss man diese
			// explizit installieren (vielleicht ist das nur ein Macintosh
			// Problem - aber so genau will das niemand wissen ...)
			
			// Frage: Warum arbeiten wir nicht generell mit selbst installierten
			// EventHandlern? Anrwort: die Unterschiede zwischen den Browsern sind
			// einfach zu gross. (Einmal kriegen die Handler den aktuellen
			// Event als Parameter, einmal nicht. Einmal heisst das Attribut, das 
			// den Empfaenger des Events angibt, target einmal srcElement ...) 
			
			if ( document.layers )
			{
				objPopup  = ic_getObject(menu);
				objParent = ic_getObject(parent);
			
				objPopup.parent = objParent;
				objPopup.onMouseOver = ic_popupMouseOver;
				objPopup.onMouseOut = ic_popupMouseOut;

				// Zusaetzlich gibt es das Problem, dass EventHandler fuer Layer
				// die mit "position: relative" arbeiten, nicht funktionieren,
				// daher ist in Netscape 4 nur der Link in der Menueleiste
				// aktiv ...
			
//				objParent.menu = objPopup;
//				objParent.onMouseOver = ic_parentMouseOver;
//				objParent.onMouseOut = ic_parentMouseOut;
			}
		}
		
		function ic_hideMenu(menu)
		{
			ic_hideObject(ic_getObject(menu));
			window.currentMenu = null;
		}
		
		function ic_parentMouseOver(evt, menu, parent)
		{
			// dieser EventHandler wird immer (auch in Netscape 4) direkt 
			// aufgerufen, daher muessen wir nicht tricksen (siehe unten)
			
			objPopup  = ic_getObject(menu);
			objParent = ic_getObject(parent);

			// Wenn mehrere Menues vorhanden sind, muss hier das alte 
			// entfernt werden. Dieser Fall kann eintreten, wenn die Maus
			// von einem Menuetitel in den naechsten bewegt wird (wegen
			// dem Ausblenden mit Timer ...)
	
			if ( window.currentMenu && window.currentMenu != objPopup )
			{
				ic_hideObject(window.currentMenu);
			}

			if ( ! ic_isObjectVisible(objPopup) ) 
			{
				if ( document.layers )
				{
					objPopup.left = objParent.pageX + 4;
					objPopup.top = objParent.pageY + objParent.clip.height;
				}
				else if ( document.all )
				{
					// Explorer unterstuetzt zwar theoretisch die W3C DOM
					// (zumindest teilweise), aber irgenwie gibt hier Troubles
					// (Internet Explorer 4 Windows, Internet Explorer 5 Macintosh),
					// daher dieser Fall zuerst ...
					
					// Am Macintosh funktionieren Zuweisungen an objPopup.style.left 
					// nicht, aber dafuer geht objPopup.style.posLeft (gefunden in 
					// einem HTML-Dude Artikel, der damit eigentlich nicht wirklich 
					// was zu tun hatte)

					objPopup.style.posLeft = objParent.offsetLeft + objParent.offsetParent.offsetLeft + 4;
					
					// FIXME -- Ich verstehe es nicht und ich will es auch nicht 
					// verstehen. Entweder die Dokumentation ist falsch, oder ich 
					// verstehe sie nicht ...
						
					// Im Notfall koennen wir "top" ueberhaupt nicht setzen,
					// und uns darauf verlassen, dass das Menue unmittelbar 
					// nach der Menueleiste kommt ...
					
					// objPopup.style.top = objParent.offsetTop + objParent.offsetParent.offsetTop;
				}
				else if ( ic_hasDOM() )
				{
					objPopup.style.left = objParent.offsetLeft + 4;
					objPopup.style.top = objParent.sc + objParent.height;
				}
				
				ic_showObject(objPopup);
			}
			
			return true;
		}
				
		function ic_parentMouseOut(evt, menu, parent) 
		{
			// bei Internet Explorer ist alles ganz anders, da bekommen die
			// EventHandler den aktuellen Event offensichtlich nicht als
			// Parameter mitgeschickt ...
			
//			if ( ! evt ) evt = window.event;
					
			objPopup  = ic_getObject(menu);
			objParent = ic_getObject(parent);

			// Die Maus wird aus der Menueleiste herausbewegt; wenn sie ins
			// aufgeklappte Menue hineinwandert, dann sollte das Menue
			// sichtbar bleiben, ansonsten verschwinden ...
			
			// Leider gibt es keine sinnvolle und generelle Methode diese
			// Faelle zu unterscheiden (weil zwar die Position aber nicht
			// die Groesse des Menues festgestellt werden kann). Daher 
			// tricksen wir mit einem Timer ...
			
//			if ( ic_hasDOM() )
//			{
//				if ( ! ic_pointInObject(evt.clientX, evt.clientY, objPopup) )
//				{
//					ic_hideObject(objPopup);
//				}
//			else if ( document.all )
//			{
//				if ( ! objParent.contains(evt.toElement) || ! objPopup.contains(evt.toElement) ) 
//				{
//					ic_hideObject(objPopup);
//				}
//			}
//			else if ( document.layers )
//			{
//				if ( ! ic_pointInObject(evt.pageX, evt.pageY, objPopup) )
//				{
//					ic_hideObject(objPopup);
//				}
//			}

			window.currentTimer = window.setTimeout("ic_hideMenu('" + menu + "')", 500);
						
			return true;
		}

		// die bereits erwaehnten zusaetzlichen EventHandler fuer den Hyperlink
		// im Menuetitel (Netscape 4 Kompensation). Bei anderen Browsern
		// sind diese natuerlich ueberfluessig und fuehren zu Problemen ...
		
		function ic_parentMouseOverNetscape(evt, menu, parent) 
		{
			if ( document.layers)
			{
				// Hack - normalerweise sollte das Registrieren im onLoad 
				// passieren, aber das ist mit WebAuthor nicht passend. Nachdem
				// das nur fuer Netscape benoetigt wird, haengen wir uns
				// hier ein ...
				
				ic_registerMenu(menu, parent);
				return ic_parentMouseOver(evt, menu, parent);
			}
			
			return false;
		}

		function ic_parentMouseOutNetscape(evt, menu, parent) 
		{
			if ( document.layers)
			{
				return ic_parentMouseOut(evt, menu, parent);
			}
			
			return false;
		}
		
		function ic_popupMouseOver(evt, menu, parent) 
		{
			if ( ! evt ) evt = window.event;

			// in Netscape 4 muessen wir die EventHandler selber installieren,
			// daher kriegen sie nur einen Parameter, naemlich den Event, aus
			// dem wir den Rest extrahieren (siehe registerMenu).
			
			if ( document.layers )
			{
				objPopup = evt.target;
				objParent = objPopup.parent;
			}
			else
			{
				objPopup  = ic_getObject(menu);
				objParent = ic_getObject(parent);
			}

			window.clearTimeout(window.currentTimer);
			window.currentMenu = objPopup;

			return true;
		}
		
		function ic_popupMouseOut(evt, menu, parent) 
		{
			if ( ! evt ) evt = window.event;
			
			if ( document.layers )
			{
				objPopup = evt.target;
				objParent = objPopup.parent;
			}
			else
			{
				objPopup  = ic_getObject(menu);
				objParent = ic_getObject(parent);
			}
					
//			if ( ic_hasDOM() )
//			{
//				if ( ! ic_pointInObject(evt.clientX, evt.clientY, objParent) )
//				{
//					ic_hideObject(objPopup);
//				}
//			else if ( document.all )
//			{
//				if ( ! objParent.contains(evt.toElement) || ! objPopup.contains(evt.toElement) ) 
//				{
//					ic_hideObject(objPopup);
//				}
//			}
//			else if ( document.layers )
//			{
//				if ( ! ic_pointInObject(evt.pageX, evt.pageY, objParent) )
//				{
//					ic_hideObject(objPopup);
//				}
//			}
			
			// Diese Routine wird auch von selbst-installierten EventHandlern
			// aufgerufen, die nur den Event als Parameter bekommen, daher
			// koennen wir hier die Variable "menu" nicht verwenden.
			
			window.currentTimer = window.setTimeout("ic_hideMenu('" + objPopup.id + "')", 500);
						
			return true;
		}
