	var ns, ie;
      var l1count = 0, l2count = 0, l3count = 0;
      var newlevel = false;

      function TM_NewVoiceCode(level)
      {
      	var code = "TM_";

      	switch (level)
          {
          	case 1:
              	l3count = 0;
                  l2count = 0;
              	l1count = l1count + 1;
              	code = code + l1count + "_" + 0 + "_" + 0;
                  break;
              case 2:
              	l3count = 0;
              	l2count = l2count + 1;
                  code = code + l1count + "_" + l2count + "_" + 0;
                  break; 
              case 3:
              	l3count = l3count + 1;
                  code = code + l1count + "_" + l2count + "_" + l3count;
                  break; 
	}

          return code;
      }

      function TM_StartLevel(level, title)
      {
      	var code = TM_NewVoiceCode(level);
		var spacing = "", f;

        for (f = 1; f < level; f++) spacing = spacing + "";     
		//alert("level" + level);      	
          document.write("<div style=\"position:relative;\"><DIV ID='" + code + "' class='level" + level + "'>");

          return code;
      }

function TM_EndLevel()
      {
          document.write("</DIV></div>")
      }

function TM_GetVisibility(obj)
{
	//alert("GetVisibility: " + obj.id);

	if (ie) return (obj.style.display=="block"?true:false);
	if (ns) return (obj.visibility=="show"?true:false);
}

function TM_SetVisibility(obj, vis)
{
	if (ie)
	{
		if (vis)
			obj.style.display = "block";
		else
			obj.style.display = "none";
	}

	if (ns)
	{
		if (vis)
			obj.visibility = "show";
		else
			obj.visibility = "hide";
	}
}

function TM_GetItem(id)
{
	if (ns) return document.layers[id];
	if (ie) return  document.getElementById(id);
}

// Get browser type
// Object "document.layers" only exists in Netscape Navigator
if(document.layers)  
{
     ns = 1; ie = 0; 
} 
else 
{
     ns = 0; ie = 1;
}

//alert ("ns=" + ns + "\r\n" + "ie=" + ie);

// Style Sheet for Netscape Communicator, tree items are positioned absolute.
// Unlike Internet Explorer, attribute "visibility" is used to show
// or hide tree items.
if (ns)
{
	document.write( "<style type='text/css'>" +
						".level1 { position:absolute; visibility:show; }" +
						".level2 { position:absolute; visibility:hidden; }" +
						".level3 { position:absolute; visibility:hidden; }" +
					"</style>");
}

// Style Sheet for Internet Explorer, tree items are positioned relative.
// Unlike Netscape Communicator, attribute "display" is used to show 
// or hide tree items.
if(ie)
{
	document.write( "<style type='text/css'>" +
						".level1 { display:block; position:relative; }" +
						".level2 { display:none; position:relative; }" +
						".level3 { display:none; position:relative; }" +
					"</style>");
}

//============================================================================
// function NetscapeInit()
// 
// Due to the relative positions of the tree items in Netscape Navigator, 
// each position has to be set before the first display.
//============================================================================

function NetscapeInit()
{
	for(var iI=0 ; iI < document.layers.length-1; iI++)
	{
		document.layers[iI+1].top = document.layers[iI].y
		if (document.layers[iI].visibility == "show")
		{
			document.layers[iI+1].top += document.layers[iI].clip.height;
		}
	}
}


//============================================================================
// function ExpandShrink()
// 
// Shows or hides an item in the tree identified by iItem
//
// Numeration is as follows:
//
// parent(0)
//   |
//   +-- child(1)
// parent(2)
//   |
//   +-- child(3)
// ...
//============================================================================
function ExpandShrink(id, vstate, refresh)
{
    var codearr, code;
	var codebase, f;
	var obj;

	//alert("Called with id=" + id);

	codearr = id.split("_")
	if (codearr.length < 4) return;

	codebase = codearr[0];
	obj = TM_GetItem(id);

	//alert("Object to look for (1): " + id + "\r\n" + obj);

	if (!obj) return;

	f = 1;

	while (f != 0)
	{
		if (codearr[2] == 0)
		{
			code = codebase + "_" + codearr[1] + "_" + f + "_" + 0	// next child code
		}
		else
          	{
          		if (codearr[3] == 0)	//	Level 2
          			code = codebase + "_" + codearr[1] + "_" + codearr[2] + "_" + f	// next child code
          		else
          			code = id;			// Level 3
          	}

		obj = TM_GetItem(code);		// next child object

		if (!obj) break;

		if (code != id)
		{
			//alert("Object to look for (2): " + code + "\r\n" + obj);

			if (vstate == -1)	// asked to toggle
                  {
          			if (f == 1)		// first object - calculate visibility for all children
                  		vstate = TM_GetVisibility(obj)?0:1;
                  }

			if (vstate == 0) ExpandShrink(code, vstate, false);

			f = f + 1;
          	}
		else
			f = 0;
		
			//alert("Object to change: " + code + "\r\n" + "Visibility to set = " + vstate);
		TM_SetVisibility(obj, vstate);
	}

	if (refresh && ns) NetscapeInit();
}			



