	  /* Not in a package:
	  *
	  * ...
	  *
	  * @author		Fraunhofer Institute for Computer Graphics (IGD),
	  * 			Department Corporate Communication Center,
	  * 			Fraunhoferstr. 5, 64283 Darmstadt, Germany.
	  *
	  * @copyright	Copyright (c) 1997 - 2005 by Fraunhofer IGD. All rights reserved.<br>
	  * 			IGD provides this product without warranty of any kind
	  *				and shall not be liable for any damages caused by the use
	  *				of this product. 
	  *
	  * @filepath	global/v3
	  * @filename   CM_DOM.js	
	  *
	  * @package	None
	  *
	  * @history	<b>Modification History</b>
	  * -			xx.xx.xxxx  Jutta Schaub: Creation
	  * -			27.10.2005  Stefan Daun: Copyright header added
	  */
	  
var CM_ID;              // for timeout on level 1 and 2
var CM_timer = 1000;
var CM_actual_menue_item = 0; // menue code of active menue_item
var CM_actual_has_sub = 0;    // menue item has submenue
var CM_available = false;	// wait until menue has been defined completely

function CM_findNode(code)
{
	if (!document.getElementById(code)) alert (code +" not found");
	return document.getElementById(code); // DOM
}

function CM_findMenuItemNode(code)
{
	return CM_findNode("p"+code); 
}

function CM_findMenuNode(code)
{
	return CM_findNode("m"+code); 
}

/*
function CM_findImageItemNode(code)
{
	return CM_findNode("i"+code); 
}
*/

function CM_partitionCode(code) {
			var co = code.substr(0,6);
			var app = code.substr(6,2);
			var sub = co % 100;
			var menue = (co - sub)/100  % 100;
			var top = Math.floor(co / 10000) ;
			// alert ("code, top, menue, sub:" + co+", "+ top+", " + menue+", " +sub);
			return new Array (top, menue, sub, app);
}

function CM_getParent(code) {
			var codep = CM_partitionCode(code);
			var a = "";
			for ( var i=0;i<3;i++) {
			   a += codep[i+1] ? code.substr(2*i,2): "00";
			}
			return a;
}

function CM_handleTimeout(code) {
			var old_code, codep, old_codep;
			var top, menue, sub, old_top, old_menue, old_sub;
			var thiscode;
			if ( !CM_actual_menue_item) return;
			
			clearTimeout(CM_ID);

			old_code = CM_actual_menue_item;
			// hide what is no longer in use
			// if (code.substr(6,2)=="-A")alert("CM_handleTimeout: code = " + code + ", old_code = " + old_code + ", sub = " + CM_actual_has_sub );
			codep = CM_partitionCode(code);
			old_codep = CM_partitionCode(old_code);
			top = codep[0]; menue = codep[1]; sub = codep[2];
			old_top = old_codep[0]; old_menue = old_codep[1]; old_sub = old_codep[2];

			if (top != old_top)
				CM_hide_all(CM_actual_menue_item, CM_actual_has_sub);
			else if (old_codep[1]) {
						if (codep[1]!=old_codep[1]) {
						   if (old_codep[2]) {
									   CM_hide_menue(CM_actual_menue_item, CM_actual_has_sub);
					   	   thiscode = old_code.substr(0,2*2) + "00";   
						      CM_hide_menue(thiscode, 1);
						   } else {                         // thiscode == old_code
						      CM_hide_menue(CM_actual_menue_item, CM_actual_has_sub); 
						   }

						} else if (old_codep[2]) {// subtree is re-entered
						   if (codep[2]!=old_codep[2]) {
						      if (old_codep[3]) {
									      CM_hide_menue(CM_actual_menue_item, CM_actual_has_sub);
					   	      thiscode = old_code.substr(0,2*3);   
						         CM_hide_menue(thiscode, 1);
						      } else {                         // thiscode == old_code
						         CM_hide_menue(CM_actual_menue_item, CM_actual_has_sub); 
						      }
									} else if (old_codep[3]) {// appended level
						      CM_hide_menue(CM_actual_menue_item, CM_actual_has_sub); 
									}
						}
			}
			CM_actual_menue_item = 0;
			CM_actual_has_sub = 0;
}

function CM_show_menue(code, sub) {
	var menue;
	var me, myBox;

	// alert("show: code = " + code + ", sub = " + sub );

	// wait until menue is defined completely
	if (!CM_available)
	   return;
	   
	CM_handleTimeout(code);

	CM_show_hide_selects("hidden");
	
	if (code.substr(0,6) % 10000 == 0) {             // if top select top item
	   	CM_top_high(code);
	} else 	{                             // show myself
	   CM_highlight(code);
	}
			
	CM_actual_menue_item = code;
	CM_actual_has_sub    = sub;
	if (sub) {
		var pos;
						
		menue = CM_findMenuNode(code);
		me = CM_findMenuItemNode(code);
		myBox  = CM_getBox (me);
		// alert (myBox.x +", " +myBox.y +", " +myBox.width +", " +myBox.height );
   		if (code.substr(0,6) % 10000 == 0) {
   			pos = new CM_Pos(myBox.x, myBox.y+myBox.height); 
   		} else {
			pos = new CM_Pos(myBox.x+myBox.width, myBox.y);
		}
						
		CM_setPos ( menue, pos );
		menue.style.visibility = "visible";
	}
}

function CM_out_menue(code, sub) {
	CM_ID = setTimeout("CM_hide_all('"+code+"', "+ sub +")", CM_timer);
}

function CM_hide_all(code, sub) {
	// alert ("hiding all " + code + "+ " +sub);
	clearTimeout(CM_ID);
	CM_hide_menue(code, sub);

	if (code.substr(0,6) % 10000 == 0) {             // if top unselect top item
	   	CM_hide_top(code);
	}
	else
	{                             // otherwise hide parents
    	CM_hide_all(CM_getParent(code), 1);
   	}
	CM_actual_menue_item = 0;
	CM_actual_has_sub    = 0;

	CM_show_hide_selects("visible");
}

function CM_hide_menue(code, sub) {
	var menue;

			
	if (sub) {                           // hide my child if exists
		menue = CM_findMenuNode(code);
		menue.style.visibility = "hidden";
	}
	if (code.substr(0,6) % 10000 == 0) {             // if top unselect top item
	   	CM_hide_top(code);
	}
	else
	{                             // hide myself
    	CM_downlight(code);
	}
			
	CM_actual_menue_item = 0;
	CM_actual_has_sub    = 0;

	CM_show_hide_selects("visible");
}

function CM_highlight(code) {
	var menue;

	CM_handleTimeout(code);

	CM_actual_menue_item = code;
	CM_actual_has_sub    = 0;
	menue = CM_findMenuItemNode(code);
	
	menue.className = "CM_item-selected";
}

function CM_downlight(code) {
	var menue;

	menue = CM_findMenuItemNode(code);
	menue.className = "CM_item";

	CM_actual_menue_item = 0;
	CM_actual_has_sub    = 0;
}

function CM_top_high(code) {
   var menue, image;

   menue = CM_findMenuItemNode(code);
			menue.className = "CM_top-high";

   /* image = CM_findImageItemNode(code);
			image.style.visibility = "visible"; */

   // alert(menue.className);
   CM_actual_menue_item = code;
			CM_actual_has_sub    = 1;

}

function CM_hide_top(code) {
   var menue, image;

   menue = CM_findMenuItemNode(code);
			menue.className = "CM_top-title";

   /* image = CM_findImageItemNode(code);
			image.style.visibility = "hidden"; */

   CM_actual_menue_item = 0;
			CM_actual_has_sub    = 0;

}

function CM_go_to(URL, target) {
	// alert ("URL = *" + URL + "*");
	if (target)
	{
		if (target == "_blank")
		{
			newWindow = window.open(URL, "_blank","");
			newWindow.focus();
			return;
		}
		else if (target == "_top")
		{
			window.top.location = URL;
			return;
		}
		else if (target == "_parent")
		{
			window.parent.location = URL;
			return;
		}
	}
	window.location = URL;
}

function CM_show_hide_selects(visibility) {
	// only necessary for MS Internet Explorer
	if (navigator.appName == "Microsoft Internet Explorer") {
		for (f=0; f<document.forms.length; f++) {
			for (e=0; e<document.forms[f].elements.length; e++) {
				obj = document.forms[f].elements[e];
				if (!obj || !obj.offsetParent)
					continue;
				if (obj.type.substr(0,6) == "select")
					obj.style.visibility = visibility;
			}
		}
	}
}

