
function Navigation(name)
{  
  this.Tree                = new Array();  //Array, das alle node-Objekte speichert

  this.numCurrentNode      = 0;// Index der Aktuellen Seite im baum -Array
  this.pageId              = null;// default wert fuer pageId, falls keine Id uebergeben
  this.arrPathOfCurrentNode= new Array();//Speichert die nodes, die auf dem Pfad zur aktuellen Seite liegen
  this.arrTreeNaviNodes    = new Array();
  this.currentNode         = null;// Aktueller Knoten im Array, durch pageId bestimmt
  this.depthOfTree         = 0;  //var fuer die Anzahl der Ebenen in der gesamten Navigation
  this.rootNode            = null;  
 // this.levelSitemap        = 5;
  this.objName             = name; //var fuer 
}

// fuegt Navigationspunkt zum Tree-Array hinzu
Navigation.prototype.addTreeNode=function(level,id,name,url,width)
{
    var node      = new Object();
    node.level    = level;// Ebene
    node.id       = id;//Id
    node.name     = name;//anzuzeigender Name
    node.url      = url;// url 
    node.width    = width;// breite, fuer die td-Bereite der 1 und 2-ten Ebene
    //node.posx     = (posx) ? posx : 0;
    node.nr       = this.Tree.length;// Nummer im Array
    node.isOnPath = false;// ob Element auf dem Pfad zum aktuellen Knoten liegt;
    this.Tree[this.Tree.length]=node;  
}

// Methode, die die vertikale Navigation ermittelt und zurueckgibt;

Navigation.prototype.getTreeNaviNodes=function(startlevel,endlevel)
{
    if(startlevel < endlevel)
    {
        var arrChildren   = this.getChildElements(this.arrPathOfCurrentNode[startlevel - this.rootNode.level]);
        
        for(var i=0;i<arrChildren.length;i++)
        {
            this.arrTreeNaviNodes[this.arrTreeNaviNodes.length]=arrChildren[i];//
            if(arrChildren[i].isOnPath) this.getTreeNaviNodes(startlevel+1,endlevel);//naechste Ebene ermitteln     
        }   
    }
    return this.arrTreeNaviNodes;
}
//Methode: ermittelt einen Knoten nach der Id
Navigation.prototype.getTreeNodeById=function(id)
{
    for(var i=0;i<this.Tree.length;i++)
    {
        if(this.Tree[i].id==id)
        {
            return this.Tree[i];
        }
    }
    return false;
}
//Methode:  ermittelt alle Kind-Knoten : /* 
// uebergeben wird die Id des Parentelements
Navigation.prototype.getDescendantsById=function(id,depth)
{
    return this.getDescendants(this.getTreeNodeById(id),depth)
}
//Methode:  ermittelt alle Kind-Knoten : /* 
// uebergeben wird das Konten-objekt des Parentelements
Navigation.prototype.getDescendants=function(DescendantsNode,depth)
{
    var start      = DescendantsNode.nr; 
    var arrDescendants  = new Array();  
    for(var k=start+1;k<this.Tree.length;k++)
    {
        if(this.Tree[k].level > DescendantsNode.level)
        {
            if(depth)
            {
                if(this.Tree[k].level <= DescendantsNode.level+depth)
                {
                    arrDescendants[arrDescendants.length]=this.Tree[k];    
                }
            }
            else arrDescendants[arrDescendants.length]=this.Tree[k];
        }
        else break;
    }
    return arrDescendants;
}

// Methode: Ermittelt den Eltern-knoten
Navigation.prototype.getParentElement=function(node)
{
	
	for(var i=node.nr;i>=0;i--)
	{
		if(node.level > this.Tree[i].level)
		{
			return this.Tree[i];
		}
	}
	return false;
	
    
}

//Methode: ermittelt die Kind-Knoten
Navigation.prototype.getChildElements=function(node)
{
    var arrChildren  = new Array();
    var level        = node.level;

    for(var i=node.nr+1;i<this.Tree.length;i++)
    {
        if(this.Tree[i].level <= level) break;
        else
        { 
            if (this.Tree[i].level==level+1) arrChildren[arrChildren.length]=this.Tree[i];  
        }
    }
    return arrChildren;

}

// Methode: Abfrage, ob Kind-knoten vorhanden
Navigation.prototype.hasChildElements=function(node)
{
  arrChildren=this.getChildElements(node);
  if(arrChildren.length==0) return false;
  else return true;
}
//Methode: gibt den naechsten Knoten zurueck;
Navigation.prototype.getNextNode=function(node)
{
    return this.Tree[node.nr +1];
}
//Methode: gibt den naechsten Knoten zurueck;
Navigation.prototype.isCurrentNode=function(node)
{
    if(node == this.currentNode) return true;
    else return false;
}
//Methode: prueft, ob letzter Knoten in der aktuellen Ebene;
Navigation.prototype.isEndOfMenue=function(node)
{
    isEnd=true;
    for(var i=node.nr+1 ; i< this.Tree.length;i++)
    {
        if(this.Tree[i].level < node.level) break;
        if(this.Tree[i].level == node.level) 
        {
            isEnd=false;
            break;
        }
    }
    return isEnd;
}
//Methode: gibt Knoten mit der Nummer zurueck;
Navigation.prototype.getNodeByNumber=function(nr)
{
    return this.Tree[nr];
}

//Methode: gibt vorhergehenden Knoten zurueck;
Navigation.prototype.getPreviousNode=function(node)
{
    return this.Tree[node.nr -1];
} 

Navigation.prototype.getPathOfNode=function(node)
{
    var arr=new Array();
    var n=node;
    do
    {
        arr[arr.length] = n;
        n=this.getParentElement(n);
    }
    while(n);
    return arr.reverse();
}
Navigation.prototype.getPathOfCurrentNode=function()
{
	this.arrPathOfCurrentNode=this.getPathOfNode(this.currentNode);
	for(var i=0; i < this.arrPathOfCurrentNode.length;i++)
	{
		this.arrPathOfCurrentNode[i].isOnPath=true;
	}
}


// Methode die
//1: den aktuellen Knoten ermittelt
//2: die Anzahl der Ebenen
Navigation.prototype.setLevelsAndCurrentPageNumber=function()
{
    for(var i=0;i<this.Tree.length;i++)
    {
        this.Tree[i].isOnPath=false;// falls das Objekt mit neuer pageId initialisiert wird; 
		if((this.pageId == this.Tree[i].id))
        {   
            this.numCurrentNode = i;			
            this.currentNode    = this.Tree[i];
        }
    }
			
	this.depthOfTree = this.currentNode.level - this.Tree[0].level;
	if(this.hasChildElements(this.currentNode))this.depthOfTree++;
	
}
// init -Methode:
// 
Navigation.prototype.init=function(pageId)
{ 
    this.pageId               = pageId;
    this.arrPathOfCurrentNode = new Array(0);
    this.arrTreeNaviNodes     = new Array(0);  

	
    this.setLevelsAndCurrentPageNumber();  
    //Pfad ermitteln
    this.getPathOfCurrentNode();
    if(this.Tree.length > 0) this.rootNode=this.Tree[0];
}







