
//--- Objeto para achar a posição do item no vetor ----------------------------------------------
function posicao(id,aMenu){
//Este metodo retorn em que posica do array se encontra o item
//posicao(codigo do item, aMenu a ser procurado)
	this.posicao = function posicao(id,aMenu){
		if(id==""){ 
	       return null; //Retorna null se o codigo for omitido
	    }
	    this.aMenu = aMenu;
	    this.id = id;
	    var i = 0;
	    while(i<this.aMenu.length){	//Procura o codigo no aMenu
	         if (this.id==this.aMenu[i].id){
	             this.p = i; //Recebe o contador no momento em que foi encontrado o codigo
		     i+=this.aMenu.length;
	          }
	         i++;
	    }
	    return this.p; //Retorna a posicao
	}
}


//---- Herda o objeto posicao ------------------------------------------------------------------
Bcrumb.prototype = new  posicao();


//--- Objeto para a montagem do BreadCrumb -----------------------------------------------------
function Bcrumb(id,aMenu){
//Este metodo retorna um array contendo o indice dos itens do codigo passado ate a raiz
	this.Bcrumb = function Bcrumb(id,aMenu){
		if(id==""){
		  return null; //Retorna null se o codigo for omitido
		}
		
		this.aMenu=aMenu;
		this.id=id;
		var i = 0;
		this.apBCrumb=new Array();
		j = this.posicao(this.id,this.aMenu); //j recebe a posicao do codigo passado (metodo herdado do objeto posicao)
		while (this.aMenu[j].idPai !=""){//Faca enquanto o item possuir um pai
			  this.apBCrumb[i]=j; //Caminho recebe j
			  j=this.aMenu[j].pPai; //j recebe o ponteiro para o pai de j
			  i++;
		}
		this.apBCrumb[i] = j; //apBCrumb recebe j que neste caso é o raiz(nao possui pai)
		
		return this.apBCrumb.reverse(); //retorna o array na ordem inversa
	}
}


//---- Herda o objeto posicao ------------------------------------------------------------------
tios.prototype = new posicao();


//---Objeto para achar os tios------------------------------------------------------------------
function tios(id,aMenu){
//Este metodo retorna os tios do codigo passado
	this.tios = function tios(id,aMenu){
		if(id==""){
		  return null; //Retorna null se o codigo for omitido
		}
		this.id=id;
		this.aMenu=aMenu;
		this.apTio = new Array();
		var p = this.posicao(this.id,this.aMenu); //Acha a posicao do codigo no aMenu
		var pAvo = this.aMenu[this.aMenu[p].pPai].pPai; //Recebe o ponteiro para o avo do codigo
		if (pAvo==""){
		  return null; //Retorna null se o avo for omitido
		}
		this.apTio = this.aMenu[pAvo].apFilho; //Recebe os tios do codigo
		var pUltimo = this.apTio[this.apTio.length - 1]; //Retira a ultima posicao do array(e um objeto nulo)
		for (i=0;i<this.apTio.length;i++){//Retira o pai ddo array de tios
			if(this.aMenu[p].pPai==this.apTio[i]){
			   this.apTio[i] = pUltimo;
			   i+=this.apTio.length;
			}
		}
		this.apTio.length = this.apTio.length - 1;
		return this.apTio; //Retorna o array de tios
	}
}


//---- Herda o objeto Bcrumb -----------------------------------------------------------------------
nivel.prototype = new Bcrumb();


//---Objeto para achar os niveis--------------------------------------------------------------------
function nivel(){
//Este metodo retorna em qual nivel se encontra o codigo.
	this.nivel = function nivel(id,aMenu){
		if(id==""){ //Se o codigo for omitido retorna null
			return null; 
		}
		var apBCrumb = this.Bcrumb(id,aMenu); //apBCrumb recebe o array de BreadCrumbs
		this.nNivel = apBCrumb.length - 1; //nNivel recebe o total da quantidade de elementos do array n -1.
		return this.nNivel; 
	}
}


//---- Herda o objeto posicao ---------------------------------------------------------------------
avo.prototype = new posicao();


//---Objeto para achar o avo-----------------------------------------------------------------------
function avo(id,aMenu){
//Este metodo retorna o avo do objeto
	 this.avo = function avo(id,aMenu){
	 	if(id==""){
			return null; //Se o codigo for nulo retorna null 
		}
	    this.aMenu = aMenu;
	    this.id = id;
	    var p = this.posicao(this.id,this.aMenu); //Acha qual posicao do aMenu esta o codigo
	    if ((this.aMenu[p].pPai != "")&&(this.aMenu[this.aMenu[p].pPai].pPai != "")){ //Valida o pai e o avo
	   		return this.aMenu[this.aMenu[p].pPai].pPai; //Retorna o avo
		}
	    else {
	    	return null; //Retorna nulo se nao houver avo
	    }
   	}
}


//---- Herda o objeto posicao ---------------------------------------------------------------------
irmao.prototype = new posicao();


//---Objeto para achar os irmaos-------------------------------------------------------------------
function irmao(id,aMenu){
//Este metodo retorna um array com os indices para os irmaos do codigo passado
	this.irmao = function irmao(id,aMenu){
    	if(id==""){
	   		return null; //Se omitidio o codigo retorna null.
	 	}
     	this.id = id;
     	this.aMenu = aMenu;
     	var p = this.posicao(this.id,this.aMenu); //Acha a posicao do codigo
     	if (this.aMenu[p].pPai==""){ //Se o codigo nao tiver pai, logo tambem nao possui irmaos
	   		return null; 
     	}
     	this.irmaos =  this.aMenu[this.aMenu[p].pPai].apFilho; //Recebe um array com os indices dos irmaos
     	return this.irmaos;   
  	}
}


//--------------------------------------------------------------------------------------------------
//---- Herda o objeto Bcrumb -----------------------------------------------------------------------
parentes.prototype = new Bcrumb();


//---Objeto para achar os parentes------------------------------------------------------------------
function parentes(){
    //Este metodo retorna os parentes do codigo passado em determinado nivel
	//parentes(nivel dos parentes,codigo,aMenu)
	this.parentes=function parentes(nivel,id,aMenu){
        this.aMenu = aMenu;
	 	this.id = id;
		var apBCrumb = this.Bcrumb(id,aMenu); //Recebe o array dos BreadCrumbs
		return this.aMenu[this.aMenu[apBCrumb[nivel]].pPai].apFilho; //retorna os parentes
	}
}
//--------------------------------------------------------------------------------------------------


