
// getestet auf Internet Explorer 5.0, 5.5, 6.0, Netscape 6.1, 6.2, 7.0

// läuft nicht auf: Internet Explorer 4.0 SP2,  Opera 6.0, Netscape 4.7


// Sortierung kann ein oder ausgeschaltet werden:
// Standard: this.Sort = false;	

	// Art der Sortierung:
	// wird je nach Einstellung der ListenElemente durch das ListenElemente Include ueberschrieben !!
	// Sortierung alpabetisch nach Titel:
	   SortBy = "Titel"

	// Sortierung alpabetisch nach Memo:
	// SortBy = "Memo"
	
	
var 	NULL		= -1;
var	ORDNER		=  1;
var	SEITE		=  2;
var	FRAMESET	=  4;
var	DOKUMENT	=  6;
var	SITE		=  7;

var DATABASE	= 7;
var TEAM		= 1;
var GROUP	= 4;
var USER		= 2;

var SITEURL = '';
var BUILDTREE_JS_INCLUDED = 'yes';

if ( SITEURL.indexOf("showsite") >= 0 )
	SITEURL = '';


function MakeNotExpandable($1,$2) 
{
}



// das Baum-Objekt
function	GetTree()
{
	this.BuildTree			= methodBuildTree;
	this.AddNewEntry			= methodAddEntry;
	this.AddNewChildToEntry		= methodAddChildToEntry;
	this.GetLastEntry			= methodGetLastEntry;
	this.GetLastChild			= methodGetLastChild;
	this.InsertLeadingGifs			= methodInsertLeadingGifs;
	this.InsertParent			= methodInsertParent;
	this.FindElement			= methodFindElement;
	this.FindElementByDivName		= methodFindElementByDivName;
	this.FindElementByName		= methodFindElementByName;
	this.GetNextNeighbourInTree		= methodGetNextNeighbourInTree;
	this.LoadSubTree			= methodLoadSubTree;
	this.InsertLoadedSubTree		= methodInsertLoadedSubTree;
	this.GetLastNeighbourObject		= methodGetLastNeighbourObject;
	this.GetFirstNeighbourObject		= methodGetFirstNeighbourObject;
	this.InsertChildDiv			= methodInsertChildDiv;
	this.SortIn				= methodSortIn;
	this.AppendToTree			= methodAppendToTree;
	this.GetParams			= methodGetParams;
	this.IsExpanded			= methodIsExpanded;
	this.InsertChild			= methodInsertChild;
	this.FolderExpand			= methodFolderExpand;
	this.Refresh			= methodRefresh;
	this.Initialize			= methodInitialExpand;
	this.TreeWalk 					= methodTreeWalk;	

	this.RootEntry		= NULL;
	this.ParentCount	= 0;

	this.InitialElementID	= 0;
	this.InitialElementType = 0;
	this.Sort = false;			// die einsortierfunktion 
								// standardmaessig ausschalten
	
	this.LeadingGifWidth	= 0;
	this.FontStyle      = 'font-family: arial; font-color:black;';

	this.BrowserType	= 'unknown';
	this.initializationDone = false;
	
	return this;
}



function methodInitialExpand(ElementId,ElementTyp)
{
	if(this.initializationDone)
		return;

	this.initializationDone = true;

	if(this.InitialElementID)
		ElementId=this.InitialElementID;
	if(this.InitialElementType)
		ElementTyp=this.InitialElementType;
	if(!ElementId||!ElementTyp)
		return;
		
	var tmpEl = this.FindElement(this.RootEntry,ElementId,ElementTyp);
	if(tmpEl != NULL)
	{
		// jetzt die seite im inhaltsframe anzeigen!
		if(window.frames[0])
		{
			// ausgewaehltes objekt hervorheben
			// aber nur, wenn das ausgewaehlte objekt
			// im baum auch angezeigt wird.
			if(tmpEl.display)
			{
				itemName = tmpEl.typ+'.'+tmpEl.id;
				window.frames[0].high(itemName);
			}
			else
			{
				parentEl = tmpEl.parent;
				if(parentEl)
				{
					itemName = parentEl.typ+'.'+parentEl.id;
					window.frames[0].high(itemName);
				}
			}
			
			window.frames[1].location.href = tmpEl.link;
		}

		if(tmpEl.typ == SEITE)
			tmpEl = tmpEl.parent;
	}

	while(tmpEl != NULL)
	{
		this.FolderExpand(tmpEl.divname);
		tmpEl = tmpEl.parent;
	}
}


function methodFolderExpand($1,$2,$3) 
{
	var tmpel = this.FindElementByDivName(this.RootEntry,$1);
	if(tmpel != NULL)
	{
	
		if ((tmpel.child==NULL)&&(tmpel.haschildren))
		{
			eval("ChildsOf"+tmpel.id+"(tmpel)");
			this.InsertChildDiv(tmpel)
		};
	
		if(tmpel.isexpanded)
			tmpel.isexpanded = false;
		else
		{
			// alle nachbarn durchgehen und zuklappen!
			var nEl=this.GetFirstNeighbourObject(tmpel);
			while(nEl != NULL)
			{
				if(nEl.isexpanded)
					this.FolderExpand(nEl.divname);
				nEl = nEl.next;
			}
			tmpel.isexpanded = true;
		}
	}




	IEExpand($1,$2);


}



function	IEExpand($1,$2)
{

	tempName = $1 + "Child";
	ExpandChild = document.getElementById(tempName);
	
	
	if ($2 != "top") 
	{
		tempName = $1 + "Parent";
		ExpandFolder = document.getElementById(tempName);
	}



	if (ExpandChild.style.display == "none") 
	{
		ExpandChild.style.display = "block";
		if ($2 != "top") 
		{ 

		}
		else
			mTree.src = SITEURL + "/images/dummy.gif";
	}
	else 
	{
		ExpandChild.style.display = "none";
		if ($2 != "top")
		{
		}
		else
			mTree.src = SITEURL + "/images/dummy.gif";
	}  
}






function	methodBuildTree()
{
	tree	= '';
	element = this.RootEntry;
	while(element!=NULL)
	{
		if(element.child!=NULL||element.haschildren) 
		{
			tree +=	this.InsertParent(element);
		}
		else
		{
			tree +=	this.InsertChild(element);
		};
		element = element.next;		
	}
	
	return	tree;
}



function	methodInsertChild(element)
{
	tree	= '';

	if(element==NULL)
		return tree;

	if(!element.display)
		return tree;
		
	tree += '<div><nobr>';
	tree += this.InsertLeadingGifs(element);

	tree += '<a\r\n class=\"item\" href=\"'+element.link+'\"';
	if (element.target != '' && element.link != '#')
		tree += 'target=\"'+element.target+'\" ';
	tree += ' onMouseOver=\"self.status=\''+element.name+'\';return true;\" onClick=\"high(\''+element.typ+'.'+element.id+'\');\">';

	tree += element.icon;
	if((element.id == this.InitialElementID)&&(element.typ == this.InitialElementType))
		tree += '<font\r\n face=\"arial\" style=\"font-weight:bold;' + this.FontStyle + '\" size=\"1\" class=\"item\" id=\"'+element.typ+'.'+element.id+'\" typ=\"'+element.typ+'\">';
	else
		tree += '<font\r\n face=\"arial\" style=\"font-weight:normal;' + this.FontStyle + '\" size=\"1\" class=\"item\" id=\"'+element.typ+'.'+element.id+'\" typ=\"'+element.typ+'\">';
	tree += element.name;
	tree += '</font></a></nobr></div>\r\n';
	
	return tree;
}




function	methodInsertParent(element)
{
	tree	= '';

	if(element==NULL)
		return tree;
		
	if(!element.display)
		return tree;

	this.ParentCount++;
	element.divname = "m"+eval(this.ParentCount);
	
// neuen parent DIV einfügen

	tree += '<div id=\"'+element.divname+'Parent\" class=\"parent\"><nobr>';
	if(element.next!=NULL)
		strFE = "Baum.FolderExpand(\'"+element.divname+"\','')";
	else
		strFE = "Baum.FolderExpand(\'"+element.divname+"\',\'last\')";
	
	tree += '<a\r\n name=\"'+element.divname+'a\" href=\"'+element.link+'\" ';
	if (element.target != '' && element.link != '#')
		tree += 'target=\"'+element.target+'\" ';
	tree += 'onClick=\"'+strFE+';return false;\" onMouseOver=\"self.status=\'\';\">';
	
	tree += this.InsertLeadingGifs(element);
	tree += '</a>';
	tree += '<a\r\n name=\"'+element.divname+'b\" href=\"'+element.link+'\" ';
	if (element.target != '' && element.link != '#')
		tree += 'target=\"'+element.target+'\" ';
	tree += 'onDblClick=\"'+strFE+';return false;\" onClick=\"'+strFE+';high(\''+element.typ+'.'+element.id+'\');\" onMouseOver=\"self.status=\''+element.name+'\';return true;\">';
			
	tree += element.icon;
	tree += '<font\r\n face=\"arial\" style=\"font-weight:normal;' + this.FontStyle + '\" size=\"1\" class=\"item\" id=\"'+element.typ+'.'+element.id+'\" typ=\"'+element.typ+'\">';
	tree += element.name;
	tree += '</font></a></nobr></div>\r\n';	

	if(element.child!=NULL)
	{
		parentelement = element;
		element = element.child;
		tree += '<div\r\n style=\"DISPLAY: ';
		if (parentelement.isexpanded)
			tree += 'block';
		else
			tree += 'none';
		tree += '\" ID=\"m'+eval(this.ParentCount)+'Child\" CLASS=\"child\"><nobr>';

		do
		{
			if(element.child!=NULL||element.haschildren)
				tree +=	this.InsertParent(element);
			else
				tree += this.InsertChild(element);
				
			element = element.next;		
		}while(element!=NULL);
		tree += '</nobr></div>\r\n';
	}
	else
		if(element.haschildren)
			tree += '<div style=\"DISPLAY: none\" ID=\"'+element.divname+'Child\" CLASS=\"child\"></div>';

	return	tree;
}



function	methodSortIn(name,element,typ)
{
	if(element==NULL||name=='')
		return NULL;
				
	name = name.toUpperCase();	

	element = this.GetLastNeighbourObject(element);
	if(!this.Sort)
		return element;
		
	while(element!=NULL)
	{
		if(typ != TEAM)
			return element;

		if(typ == TEAM&&element.typ==TEAM)
		{
			if (SortBy == "Memo")
				tmpstring = element.memo.toUpperCase();
			else		
				tmpstring = element.name.toUpperCase();

			tmpname = name;
			if(tmpstring.length>tmpname.length)
				tmpstring = tmpstring.substr(0,tmpname.length);
			else
				tmpname = tmpname.substr(0,tmpstring.length);
			if(tmpstring<=tmpname)
				return element;
		}		
		element = element.prev;
	}
	
	return NULL;
}



function	methodGetLastNeighbourObject(element)
{
	if(element==NULL)
		return NULL;

	if(element.next!=NULL)
	{
             while (element.next!=NULL) 
               {
		element=element.next;
               };
		
	     return element;
	//	return(this.GetLastNeighbourObject(element));
	}
	else
		return element;
}



function	methodGetFirstNeighbourObject(element)
{
	if(element==NULL)
		return NULL;

	if(element.prev!=NULL)
	{
             while (element.prev!=NULL) 
               {
		element=element.prev;
               };
		
	     return element;

		//return(this.GetFirstNeighbourObject(element));
	}
	else
		return element;
}





function methodAddEntry(prev,icon,link,name,typ,id,target,display,levelcounter,memo)
{
	entry = new TreeEntry();
	if(prev!=NULL)
	{
	
		if (SortBy == "Memo") 
			element = this.SortIn(memo,prev,typ);
		else		
			element = this.SortIn(name,prev,typ);
		
		
		if(element != NULL)
		{
			entry.next = element.next;
			next_element = element.next;
			if(next_element!=NULL)
				next_element.prev = entry;
			entry.prev = element;
			entry.parent = prev.parent;
			element.next = entry;
		}
		else
		{
			element = this.GetFirstNeighbourObject(prev);
			if(element != NULL)
			{
				entry.next = element;
				entry.prev = NULL;
				entry.parent = prev.parent;
				element.prev = entry;
				parentel = element.parent;
				if(parentel!=NULL)
					parentel.child = entry;
				else
					if(this.RootEntry==element)
						this.RootEntry = entry;
			}
		}
	}

	entry.typ = typ;
	entry.id = id;
	entry.name = name;
	entry.haschildren = false;
	entry.icon = icon;
	entry.link = link;
	entry.target = target;
	entry.display = display;
	
	if(levelcounter!=NULL)
		entry.levelcounter = levelcounter;
	else
		entry.levelcounter = -1;
		
	if(memo!=NULL)
		entry.memo = memo; 
	else
		entry.memo = '';
		

	if(this.RootEntry==NULL)
		this.RootEntry=entry;
		
	return entry;
}



function	methodAddChildToEntry(parent,icon,link,name,typ,id,target,display,levelcounter,memo)
{
	entry = new TreeEntry();
	if(parent!=NULL)
	{
		entry.parent = parent;
		prev = parent.child
		if(prev==NULL)
		{
			parent.child  = entry;
			element = NULL;
		}
		else			
		{		
			if (SortBy == "Memo") 
				element = this.SortIn(memo,prev,typ);
			else		
				element = this.SortIn(name,prev,typ);
		}
		

		if(element != NULL)
		{
			entry.next = element.next;
			next_element = element.next;
			if(next_element!=NULL)
				next_element.prev = entry;
			entry.prev = element;
			entry.parent = prev.parent;
			element.next = entry;
		}
		else
		{
			if(prev!=NULL)
			{
				element = this.GetFirstNeighbourObject(prev);
				if(element != NULL)
				{
					entry.next = element;
					entry.prev = NULL;
					entry.parent = prev.parent;
					element.prev = entry;
					parentel = element.parent;
					if(parentel!=NULL)
						parentel.child = entry;
					else
						if(this.RootEntry==element)
							this.RootEntry = entry;
				}
			}
		}
	}
	entry.typ = typ;
	entry.id = id;
	entry.name = name;
	entry.haschildren = false;
	entry.icon = icon;
	entry.link = link;
	entry.target = target;
	entry.display = display;

	if(levelcounter!=NULL)
		entry.levelcounter = levelcounter;
	else
		entry.levelcounter = -1;
		
	if(memo!=NULL)
		entry.memo = memo; 
	else
		entry.memo = '';
		
	if(this.RootEntry==NULL)
		this.RootEntry=entry;
		
	return entry;
}



function	methodGetLastChild(parent)
{
	if(parent==NULL)
		return NULL;
	element = parent.child;
	while(element!=NULL)
	{	
		if(element.next==NULL)
			return element;
		element = element.next;
	}

	return NULL;
}




function	methodGetLastEntry(element)
{
	while(element!=NULL)
	{	
		if(element.next==NULL)
			return element;
		element = element.next;
	}

	return NULL;
}




function	methodInsertLeadingGifs(element)
{
	htmlAusgabe = '';
	if(element==NULL)
		return htmlAusgabe;
	element = element.parent;
	while(element!=NULL)
	{	
		if(element.next==NULL)
			htmlAusgabe = '<img\r\n src=\"' + SITEURL + '/images/dummy.gif\" width=\"' + this.LeadingGifWidth + '\" align=\"absmiddle\" border=no>' + htmlAusgabe;
		else
			htmlAusgabe = '<img\r\n src=\"' + SITEURL + '/images/dummy.gif\" width=\"' + this.LeadingGifWidth + '\" align=\"absmiddle\" border=no>' + htmlAusgabe;
		element = element.parent;
	}

	return htmlAusgabe;
}




// ein Baum-Element-Objekt
function	TreeEntry()
{
	this.next			= NULL;
	this.prev			= NULL;
	this.parent			= NULL;
	this.child			= NULL;
	
	this.haschildren	= false;
	this.typ			= NULL;
	this.id				= NULL;
	this.isexpanded			= false;
	this.name			= '';
	this.divname			= '';
	this.target			= '';
		
	this.icon			= '';
	this.link			= '';

	this.display			= false;

	return this;
}





// gucken ob der aufzuklappende subtree schon geladen wurde.
// wenn nicht, laden und ausklappen und false zurueck; ansonsten true zurueckgeben!
function	methodLoadSubTree(divname,params)
{
	element = this.FindElementByDivName(this.RootEntry,divname);
	if(element != NULL)
		if(element.child != NULL)
		 	return true;

	return false;
}




function	methodFindElementByName(element,name)
{
//Funktion für virtuelle Ordner zum verkleinern von Grossen Zweigen.
	if(name=='')
		return NULL;

	if(element==NULL)
		return NULL;
		
	if(element.name.toUpperCase()==name.toUpperCase())
		return element;

	//	element ist nicht das gesuchte -> naechstes suchen
	while (this.TreeWalk(element)!=NULL)
	{
		element = this.TreeWalk(element);

		if(element.name.toUpperCase()==name.toUpperCase())
			return element;
	}


	return NULL;
}

function	methodFindElement(element,id,typ)
{
	if(!id||!typ)
		return NULL;

	if(element==NULL)
		return NULL;

	if(element.id==id&&element.typ==typ)
		return element;

//	element ist nicht das gesuchte -> naechstes suchen

	while (this.TreeWalk(element)!=NULL)
	{
		element = this.TreeWalk(element);

			if(element.id==id&&element.typ==typ)
				return element;
			
	}

	return element;
}




function	methodFindElementByDivName(element,divname)
{
	if(divname=='')
		return NULL;

	if(element==NULL)
		return NULL;
		
	if(element.divname==divname)
		return element;

//	element ist nicht das gesuchte -> naechstes suchen
	while (this.TreeWalk(element)!=NULL)
	{
		element = this.TreeWalk(element);

		if(element.divname==divname)
			return element;
	}


	return NULL;
}




function	methodGetNextNeighbourInTree(element)
{
	if(element==NULL)
		return NULL;

	if(element.next!=NULL)
		element=element.next;
	else
		element=this.GetNextNeighbourInTree(element.parent);

	return element;
}




function	methodInsertLoadedSubTree(divname)
{
	element = this.FindElementByDivName(this.RootEntry,divname)
	if(element==NULL)
		return false;
	return(this.InsertChildDiv(element));
}




function	methodInsertChildDiv(element)
{
	if(element==NULL)
		return false;
	divname=element.divname;
	tree = '';
	if(element.child!=NULL)
	{
		parentelement = element;
		element = element.child;
		tree += '<nobr>';

		do
		{
			if(element.child!=NULL||element.haschildren)
			{
				tree +=	this.InsertParent(element);
			}
			else
			{
				tree +=	this.InsertChild(element);
			}
			element = element.next;		
		}while(element!=NULL);
		tree += '</nobr>\r\n';
	}
	
	parentdiv=document.getElementById(divname+'Child')
		
	if(tree == '')
	{
		element.haschildren = false;
		element.child = NULL;
		if(element.next == NULL)
			MakeNotExpandable(divname,'last');
		else
			MakeNotExpandable(divname,'');
		return false;
	}
	else
	{
		if(parentdiv)
		{
			parentdiv.innerHTML=tree
		};
	};
		
	return true;
}



// Aufklappzustand anhand der Params-Liste wiederherstellen
function	methodAppendToTree(id,typ,params)
{
	element = this.FindElement(this.RootEntry,id,typ);
	if(element != NULL)
	{
		if(element.child != NULL)
		{
			if(element.next==NULL)
				this.FolderExpand(element.divname,'last');
			else
				this.FolderExpand(element.divname,'');

			if((params != '')&&(params != ';'))
			{
				werte = params.split(";");
				params = '';
				for(i=2;i<werte.length;i++)
					if(werte[i] != '')
						params += werte[i] + ';';
				this.AppendToTree(werte[0],werte[1],params);
			}
			else
			{
				edit(typ,id);
			}
				
		}
		else
		{
			if(element.haschildren)
			{
			}
			else
			{
				if((params != '')&&(params != ';'))
				{
					werte = params.split(";");
					params = '';
					for(i=2;i<werte.length;i++)
						if(werte[i] != '')
							params += werte[i] + ';';
					this.AppendToTree(werte[0],werte[1],params);
				}
				else
					edit(typ,id);
			}
		}
	}

	return false;
}




// Params-Liste für den Aufklappzustand erzeugen
function	methodGetParams()
{
	var element=this.RootEntry;
	var params='';
		
	while(element != NULL)
	{
		if(element.child != NULL)
		{
			if(this.IsExpanded(element))
			{
				if(element.id)
					params+=eval(element.id)+';'+eval(element.typ)+';';
				element=element.child;
			}
			else
				element=this.GetNextNeighbourInTree(element);
		}
		else
			element=this.GetNextNeighbourInTree(element);
	}

	return params;
}



// division mit der id = divname suchen und gucken ob diese sichtbar ist
function methodIsExpanded(element) 
{
	if(element!=NULL)
		return element.isexpanded;
	
	return false;
}



function methodRefresh(orig) 
{
}

function	methodTreeWalk(element)
{

	if (element==NULL)
		return NULL;

	if (element.child!=NULL)
		return element.child;

	if (element.next!=NULL)
		return element.next;

	return this.GetNextNeighbourInTree(element)

}

